From 59b48f342c00dcbab84c66bb39a539208c0d20aa Mon Sep 17 00:00:00 2001 From: Haoyi Date: Thu, 21 Dec 2023 17:14:40 +0800 Subject: [PATCH] sdk v3.0.0 Signed-off-by: Haoyi --- guru_app/.github/release.yaml | 9 + .../github-project-issue-to-sheets.yaml | 21 + guru_app/.gitignore | 120 ++ guru_app/CHANGELOG.md | 74 + guru_app/LICENSE | 1 + guru_app/README.md | 39 + guru_app/analysis_options.yaml | 4 + guru_app/flavors/spider/guru_spec.yaml | 125 ++ guru_app/guru/guru_spec.yaml | 431 +++++ guru_app/guru/spider/guru_spec.yaml | 151 ++ .../lib/account/account_auth_extension.dart | 51 + guru_app/lib/account/account_data_store.dart | 124 ++ guru_app/lib/account/account_manager.dart | 161 ++ .../account/account_service_extension.dart | 151 ++ guru_app/lib/account/model/account.dart | 40 + .../lib/account/model/account_profile.dart | 135 ++ .../lib/account/model/account_profile.g.dart | 31 + guru_app/lib/account/model/user.dart | 99 + guru_app/lib/account/model/user.g.dart | 45 + guru_app/lib/ads/ads_global_property.dart | 12 + guru_app/lib/ads/ads_manager.dart | 636 +++++++ .../applovin/banner/applovin_banner_ads.dart | 107 ++ .../applovin_interstitial_ads.dart | 124 ++ .../rewarded/applovin_rewarded_ads.dart | 129 ++ guru_app/lib/ads/core/ads.dart | 201 ++ guru_app/lib/ads/core/ads_config.dart | 481 +++++ guru_app/lib/ads/core/ads_config.g.dart | 200 ++ guru_app/lib/ads/core/ads_impression.dart | 189 ++ guru_app/lib/ads/core/banner/banner_ads.dart | 11 + .../ads/core/banner/banner_ads_handler.dart | 79 + .../ads/core/exceptions/ads_exceptions.dart | 23 + guru_app/lib/ads/core/handler/ads_audit.dart | 142 ++ guru_app/lib/ads/core/handler/ads_cache.dart | 170 ++ .../core/interstitial/interstitial_ads.dart | 11 + .../interstitial_ads_handler.dart | 102 + .../lib/ads/core/rewards/rewarded_ads.dart | 11 + .../core/rewards/rewarded_ads_handler.dart | 116 ++ guru_app/lib/ads/core/strategy/ad_unit.dart | 17 + .../core/strategy/handler/ad_unit_cache.dart | 70 + .../max_interstitial_ad_unit.dart | 107 ++ .../max_strategy_interstitial_ads.dart | 522 +++++ .../lib/ads/core/strategy/strategy_ads.dart | 60 + .../lib/ads/utils/ads_cpm_calibration.dart | 6 + guru_app/lib/ads/utils/ads_exception.dart | 15 + guru_app/lib/aigc/bi/ai_bi.dart | 2 + .../lib/analytics/data/analytics_model.dart | 74 + .../lib/analytics/data/analytics_model.g.dart | 43 + guru_app/lib/analytics/guru_analytics.dart | 599 ++++++ .../lib/analytics/modules/adjust_aware.dart | 195 ++ .../lib/analytics/modules/ads_analytics.dart | 61 + .../strategy/guru_analytics_strategy.dart | 590 ++++++ guru_app/lib/api/custom_transformer.dart | 46 + .../lib/api/data/orders/orders_model.dart | 138 ++ .../lib/api/data/orders/orders_model.g.dart | 71 + guru_app/lib/api/guru_api.dart | 158 ++ guru_app/lib/api/guru_api.g.dart | 215 +++ .../lib/api/modules/guru_api_extension.dart | 25 + guru_app/lib/app/app_models.dart | 184 ++ guru_app/lib/app/app_models.g.dart | 131 ++ guru_app/lib/controller/account_aware.dart | 92 + guru_app/lib/controller/assets_aware.dart | 87 + guru_app/lib/controller/gems_controller.dart | 61 + guru_app/lib/database/creators/creators.dart | 13 + guru_app/lib/database/guru_db.dart | 29 + .../migrations/migration_v1_to_v2.dart | 13 + .../migrations/migration_v2_to_v3.dart | 22 + .../lib/database/migrations/migrations.dart | 13 + .../lib/financial/asset/assets_model.dart | 11 + .../lib/financial/asset/assets_store.dart | 70 + .../lib/financial/data/db/order_database.dart | 391 ++++ .../financial/data/db/order_database.g.dart | 55 + .../data/models/orders/orders_model.dart | 94 + .../data/models/orders/orders_model.g.dart | 46 + guru_app/lib/financial/financial_manager.dart | 59 + guru_app/lib/financial/iap/iap_manager.dart | 1466 ++++++++++++++ guru_app/lib/financial/iap/iap_model.dart | 105 + .../financial/iap/ios/in_app_receipt_ios.dart | 319 ++++ .../iap/ios/in_app_receipt_ios.g.dart | 146 ++ .../iap/ios/receipt_validator_ios.dart | 110 ++ guru_app/lib/financial/igc/igc_manager.dart | 166 ++ guru_app/lib/financial/igc/igc_model.dart | 47 + guru_app/lib/financial/manifest/manifest.dart | 17 + .../financial/manifest/manifest_manager.dart | 77 + .../financial/product/ids/product_ids.dart | 145 ++ .../lib/financial/product/product_model.dart | 259 +++ .../financial/product/product_profile.dart | 168 ++ .../lib/financial/product/product_store.dart | 82 + .../lib/financial/reward/reward_manager.dart | 69 + .../lib/financial/reward/reward_model.dart | 44 + .../lib/firebase/dxlinks/dxlink_manager.dart | 65 + guru_app/lib/firebase/firebase.dart | 7 + .../firestore/account/account_extension.dart | 31 + .../firebase/firestore/firestore_manager.dart | 15 + .../messaging/remote_messaging_manager.dart | 453 +++++ .../remoteconfig/remote_config_interface.dart | 112 ++ .../remoteconfig/remote_config_manager.dart | 209 ++ .../remote_config_reserved_constants.dart | 46 + .../reserved_remote_config_models.dart | 131 ++ .../reserved_remote_config_models.g.dart | 47 + guru_app/lib/generated/intl/messages_all.dart | 63 + guru_app/lib/generated/intl/messages_en.dart | 25 + guru_app/lib/generated/l10n.dart | 78 + guru_app/lib/guru_app.dart | 344 ++++ guru_app/lib/hook/hook_manager.dart | 56 + guru_app/lib/l10n/intl_en.arb | 1 + guru_app/lib/lifecycle/lifecycle_model.dart | 12 + guru_app/lib/property/app_property.dart | 29 + .../modules/account_property_extension.dart | 81 + .../modules/analytics_property_extension.dart | 41 + .../modules/default_property_extension.dart | 40 + .../modules/iap_property_extension.dart | 21 + .../modules/igc_property_extension.dart | 75 + guru_app/lib/property/property_keys.dart | 117 ++ guru_app/lib/property/property_tags.dart | 22 + guru_app/lib/property/runtime_property.dart | 2 + .../property/settings/global_settings.dart | 9 + .../lib/property/settings/guru_settings.dart | 27 + guru_app/lib/test/test_guru_app_creator.dart | 16 + .../lib/test/test_guru_app_creator.g.dart | 946 +++++++++ .../lib/utils/guru_file_utils_extension.dart | 19 + guru_app/packages/guru_assistant/.gitignore | 120 ++ guru_app/packages/guru_assistant/CHANGELOG.md | 3 + guru_app/packages/guru_assistant/LICENSE | 1 + guru_app/packages/guru_assistant/README.md | 39 + .../guru_assistant/analysis_options.yaml | 4 + .../guru_assistant/example/.gitignore | 120 ++ .../packages/guru_assistant/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../guru_assistant/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 81 + .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 + .../guru/app/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 | 39 + .../example/android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 11 + .../assets/fonts/EncodeSansExpanded-Black.ttf | Bin 0 -> 161408 bytes .../assets/fonts/EncodeSansExpanded-Bold.ttf | Bin 0 -> 161576 bytes .../fonts/EncodeSansExpanded-ExtraBold.ttf | Bin 0 -> 162616 bytes .../fonts/EncodeSansExpanded-ExtraLight.ttf | Bin 0 -> 158900 bytes .../assets/fonts/EncodeSansExpanded-Light.ttf | Bin 0 -> 161456 bytes .../fonts/EncodeSansExpanded-Medium.ttf | Bin 0 -> 162536 bytes .../fonts/EncodeSansExpanded-Regular.ttf | Bin 0 -> 160908 bytes .../fonts/EncodeSansExpanded-SemiBold.ttf | Bin 0 -> 163388 bytes .../assets/fonts/EncodeSansExpanded-Thin.ttf | Bin 0 -> 157556 bytes .../example/assets/images/ic_ads.png | Bin 0 -> 2315 bytes .../example/assets/images/ic_arrow_right.png | Bin 0 -> 205 bytes .../example/assets/images/ic_check.png | Bin 0 -> 689 bytes .../example/assets/images/ic_close.png | Bin 0 -> 1155 bytes .../example/assets/images/ic_coin.png | Bin 0 -> 12602 bytes .../example/assets/images/ic_illustration.png | Bin 0 -> 156271 bytes .../example/assets/images/remove_ads.png | Bin 0 -> 158833 bytes .../guru_assistant/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../guru_assistant/example/ios/Podfile | 41 + .../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/data/app_details.dart | 6 + .../example/lib/data/constants.dart | 53 + .../example/lib/data/database/debug_db.dart | 28 + .../example/lib/data/initializer.dart | 88 + .../example/lib/data/initializer.g.dart | 33 + .../lib/data/settings/ads_debug_settings.dart | 50 + .../lib/data/settings/assistant_settings.dart | 17 + .../lib/data/settings/debug_settings.dart | 17 + .../example/lib/generated/assets.dart | 22 + .../guru_assistant/example/lib/main.dart | 64 + .../pages/debug/ads/ads_debug_binding.dart | 10 + .../pages/debug/ads/ads_debug_controller.dart | 21 + .../lib/pages/debug/ads/ads_debug_model.dart | 10 + .../lib/pages/debug/ads/ads_debug_view.dart | 265 +++ .../debug/ads/test/test_ads_binding.dart | 10 + .../debug/ads/test/test_ads_controller.dart | 18 + .../pages/debug/ads/test/test_ads_model.dart | 5 + .../pages/debug/ads/test/test_ads_view.dart | 48 + .../pages/debug/data/data_debug_binding.dart | 10 + .../debug/data/data_debug_controller.dart | 17 + .../pages/debug/data/data_debug_model.dart | 5 + .../lib/pages/debug/data/data_debug_view.dart | 17 + .../lib/pages/debug/debug_binding.dart | 10 + .../lib/pages/debug/debug_controller.dart | 18 + .../example/lib/pages/debug/debug_model.dart | 5 + .../example/lib/pages/debug/debug_view.dart | 26 + .../example/lib/pages/root/roor_model.dart | 5 + .../example/lib/pages/root/root_binding.dart | 10 + .../lib/pages/root/root_controller.dart | 18 + .../example/lib/pages/root/root_view.dart | 33 + .../lib/pages/settings/settings_binding.dart | 10 + .../pages/settings/settings_controller.dart | 48 + .../lib/pages/settings/settings_model.dart | 5 + .../lib/pages/settings/settings_view.dart | 53 + .../example/lib/route/app_pages.dart | 71 + .../example/lib/route/router.dart | 22 + .../example/lib/route/routes.dart | 38 + .../example/lib/theme/example_theme.dart | 101 + .../console_button/console_button.dart | 52 + .../console_button_controller.dart | 69 + .../guru_assistant/example/pubspec.lock | 1414 ++++++++++++++ .../guru_assistant/example/pubspec.yaml | 161 ++ .../example/test/widget_test.dart | 17 + .../guru_assistant/lib/console/console.dart | 110 ++ .../lib/console/console_button.dart | 53 + .../console/console_button_controller.dart | 88 + .../guru_assistant/lib/console/vm_helper.dart | 257 +++ .../guru_assistant/lib/core/model.dart | 4 + .../lib/core/property_keys.dart | 42 + .../guru_assistant/lib/data/setting.dart | 81 + .../lib/dialog/editor/editor_controller.dart | 29 + .../dialog/editor/editor_design_model.dart | 78 + .../dialog/editor/editor_design_model.g.dart | 192 ++ .../lib/dialog/editor/editor_dialog.dart | 183 ++ .../guru_assistant/lib/guru_assistant.dart | 12 + .../lib/ui/account/account_debug_page.dart | 75 + .../ui/account/account_dubug_controller.dart | 21 + .../guru_assistant/lib/ui/ads_debug_page.dart | 391 ++++ .../lib/ui/ads_test/ads_test_controller.dart | 18 + .../lib/ui/ads_test/ads_test_page.dart | 55 + .../ui/ads_test/keywords_test_controller.dart | 34 + .../lib/ui/ads_test/keywords_test_page.dart | 448 +++++ .../lib/ui/assets/assets_debug_page.dart | 168 ++ .../ui/assets/assets_dubug_controller.dart | 25 + .../lib/ui/data_viewer_page.dart | 172 ++ .../lib/ui/guru_debug_page.dart | 84 + .../ui/visual/visual_debug_controller.dart | 34 + .../ui/visual/visual_debug_design_model.dart | 78 + .../visual/visual_debug_design_model.g.dart | 192 ++ .../lib/ui/visual/visual_debug_dialog.dart | 251 +++ .../visual_debug_dialog_controller.dart | 56 + .../lib/ui/visual/visual_debug_page.dart | 93 + guru_app/packages/guru_assistant/pubspec.lock | 1607 ++++++++++++++++ guru_app/packages/guru_assistant/pubspec.yaml | 112 ++ .../test/guru_assistant_test.dart | 8 + guru_app/packages/guru_spec/.gitignore | 120 ++ guru_app/packages/guru_spec/CHANGELOG.md | 3 + guru_app/packages/guru_spec/LICENSE | 1 + guru_app/packages/guru_spec/README.md | 39 + .../packages/guru_spec/analysis_options.yaml | 4 + guru_app/packages/guru_spec/build.yaml | 18 + .../packages/guru_spec/lib/guru_spec.dart | 12 + .../guru_spec/lib/guru_spec_generator.dart | 7 + .../lib/intelligent_keys_generator.dart | 7 + .../packages/guru_spec/lib/src/generator.dart | 468 +++++ .../lib/src/guru_spec_generator.dart | 1683 +++++++++++++++++ guru_app/packages/guru_spec/lib/src/hash.dart | 40 + .../lib/src/intelligent_keys_generator.dart | 35 + .../packages/guru_spec/lib/src/tuple.dart | 413 ++++ guru_app/packages/guru_spec/pubspec.lock | 441 +++++ guru_app/packages/guru_spec/pubspec.yaml | 60 + .../guru_spec/test/guru_spec_test.dart | 5 + guru_app/packages/guru_utils/.gitignore | 29 + guru_app/packages/guru_utils/CHANGELOG.md | 3 + guru_app/packages/guru_utils/LICENSE | 1 + guru_app/packages/guru_utils/README.md | 39 + .../packages/guru_utils/analysis_options.yaml | 4 + guru_app/packages/guru_utils/lib/ads/ads.dart | 6 + .../guru_utils/lib/ads/ads_delegate.dart | 34 + .../lib/ads/ads_manager_delegate.dart | 38 + .../guru_utils/lib/ads/data/ads_model.dart | 381 ++++ .../guru_utils/lib/ads/data/ads_model.g.dart | 61 + .../lib/ads/handler/ads_handler.dart | 332 ++++ .../lib/ads/utils/ads_cpm_calibration.dart | 6 + .../lib/ads/utils/ads_exception.dart | 15 + .../guru_utils/lib/aigc/bi/ai_bi.dart | 110 ++ .../guru_utils/lib/analytics/analytics.dart | 80 + .../app_ownership/app_ownership_utils.dart | 169 ++ .../guru_utils/lib/audio/audio_bundle.dart | 41 + .../guru_utils/lib/audio/audio_effector.dart | 82 + .../guru_utils/lib/audio/audio_model.dart | 63 + .../guru_utils/lib/audio/sound_pool.dart | 49 + .../lib/collection/collectionutils.dart | 84 + .../guru_utils/lib/collection/int_array.dart | 82 + .../guru_utils/lib/collection/rbtree.dart | 18 + .../guru_utils/lib/colors/color_utils.dart | 51 + .../lib/controller/ads_controller.dart | 123 ++ .../aware/account/account_aware.dart | 87 + .../controller/aware/ads/banner_aware.dart | 375 ++++ .../aware/ads/interstitial_aware.dart | 162 ++ .../aware/ads/overlay/ads_overlay.dart | 13 + .../controller/aware/ads/rewarded_aware.dart | 249 +++ .../controller/aware/assets/assets_aware.dart | 64 + .../controller/aware/controller_aware.dart | 5 + .../aware/keep_screen_on_aware.dart | 108 ++ .../lib/controller/base_controller.dart | 62 + .../guru_utils/lib/controller/controller.dart | 4 + .../lib/controller/gems_controller.dart | 61 + .../lib/controller/lifecycle_controller.dart | 290 +++ .../lib/converts/color_convert.dart | 23 + .../lib/converts/config_map_convert.dart | 32 + .../guru_utils/lib/converts/converts.dart | 60 + .../converts/list_joined_string_convert.dart | 21 + .../packages/guru_utils/lib/core/ext.dart | 19 + .../lib/currency/currency_utils.dart | 19 + .../lib/database/batch/batch_aware.dart | 73 + .../lib/database/batch/batch_data.dart | 234 +++ .../guru_utils/lib/database/database.dart | 94 + .../guru_utils/lib/database/migration.dart | 10 + .../guru_utils/lib/datetime/date/date.dart | 116 ++ .../lib/datetime/datespan/datespan.dart | 133 ++ .../lib/datetime/datetime_utils.dart | 653 +++++++ .../guru_utils/lib/device/device_info.dart | 245 +++ .../guru_utils/lib/device/device_info.g.dart | 42 + .../guru_utils/lib/device/device_utils.dart | 479 +++++ .../guru_utils/lib/events/event_bus.dart | 50 + .../guru_utils/lib/events/models/event.dart | 27 + .../lib/events/models/game_event.dart | 16 + .../lib/extensions/async_extension.dart | 29 + .../guru_utils/lib/extensions/extensions.dart | 18 + .../lib/extensions/list_extension.dart | 34 + .../lib/extensions/number_extension.dart | 24 + .../lib/extensions/string_extension.dart | 29 + .../lib/feedback/feedback_manager.dart | 113 ++ .../guru_utils/lib/file/archive_utils.dart | 20 + .../guru_utils/lib/file/file_utils.dart | 202 ++ .../packages/guru_utils/lib/guru_utils.dart | 15 + .../packages/guru_utils/lib/hash/hash.dart | 40 + .../packages/guru_utils/lib/http/http_ex.dart | 274 +++ .../guru_utils/lib/http/http_model.dart | 34 + .../packages/guru_utils/lib/id/id_utils.dart | 115 ++ .../guru_utils/lib/id/identifiable.dart | 5 + .../guru_utils/lib/image/image_utils.dart | 125 ++ .../lib/lifecycle/lifecycle_manager.dart | 158 ++ guru_app/packages/guru_utils/lib/log/log.dart | 558 ++++++ .../guru_utils/lib/manifest/manifest.dart | 169 ++ .../guru_utils/lib/manifest/manifest.g.dart | 30 + .../guru_utils/lib/math/math_utils.dart | 103 + .../guru_utils/lib/network/network_utils.dart | 79 + .../guru_utils/lib/number/number_utils.dart | 126 ++ .../packages/guru_utils/lib/number/range.dart | 57 + .../guru_utils/lib/packages/guru_package.dart | 31 + .../guru_utils/lib/property/app_property.dart | 358 ++++ .../guru_utils/lib/property/property.dart | 11 + .../lib/property/property_bundle.dart | 82 + .../lib/property/property_delegate.dart | 39 + .../guru_utils/lib/property/property_key.dart | 51 + .../lib/property/property_model.dart | 47 + .../lib/property/runtime_property.dart | 183 ++ .../lib/property/settings/settings_data.dart | 514 +++++ .../storage/db/property_database.dart | 242 +++ .../storage/db/property_database.g.dart | 27 + .../property/storage/property_storage.dart | 26 + .../packages/guru_utils/lib/quiver/async.dart | 25 + .../guru_utils/lib/quiver/async/collect.dart | 32 + .../guru_utils/lib/quiver/async/concat.dart | 84 + .../lib/quiver/async/countdown_timer.dart | 73 + .../lib/quiver/async/enumerate.dart | 22 + .../lib/quiver/async/future_stream.dart | 82 + .../lib/quiver/async/metronome.dart | 105 + .../lib/quiver/async/stream_buffer.dart | 184 ++ .../lib/quiver/async/stream_router.dart | 82 + .../guru_utils/lib/quiver/async/string.dart | 21 + .../packages/guru_utils/lib/quiver/cache.dart | 18 + .../guru_utils/lib/quiver/cache/cache.dart | 65 + .../lib/quiver/cache/map_cache.dart | 156 ++ .../packages/guru_utils/lib/quiver/check.dart | 82 + .../guru_utils/lib/quiver/collection.dart | 27 + .../lib/quiver/collection/bimap.dart | 175 ++ .../quiver/collection/delegates/iterable.dart | 123 ++ .../lib/quiver/collection/delegates/list.dart | 151 ++ .../lib/quiver/collection/delegates/map.dart | 119 ++ .../quiver/collection/delegates/queue.dart | 69 + .../lib/quiver/collection/delegates/set.dart | 76 + .../lib/quiver/collection/lru_map.dart | 400 ++++ .../lib/quiver/collection/multimap.dart | 920 +++++++++ .../lib/quiver/collection/treeset.dart | 1045 ++++++++++ .../lib/quiver/collection/utils.dart | 80 + .../packages/guru_utils/lib/quiver/core.dart | 20 + .../guru_utils/lib/quiver/core/hash.dart | 43 + .../guru_utils/lib/quiver/core/optional.dart | 127 ++ .../guru_utils/lib/quiver/core/utils.dart | 33 + .../guru_utils/lib/quiver/iterables.dart | 27 + .../lib/quiver/iterables/concat.dart | 19 + .../lib/quiver/iterables/count.dart | 51 + .../lib/quiver/iterables/cycle.dart | 57 + .../lib/quiver/iterables/enumerate.dart | 95 + .../quiver/iterables/generating_iterable.dart | 80 + .../quiver/iterables/infinite_iterable.dart | 65 + .../lib/quiver/iterables/merge.dart | 100 + .../lib/quiver/iterables/min_max.dart | 74 + .../lib/quiver/iterables/partition.dart | 58 + .../lib/quiver/iterables/range.dart | 43 + .../guru_utils/lib/quiver/iterables/zip.dart | 25 + .../guru_utils/lib/quiver/pattern.dart | 142 ++ .../guru_utils/lib/quiver/strings.dart | 160 ++ .../packages/guru_utils/lib/quiver/time.dart | 19 + .../guru_utils/lib/quiver/time/clock.dart | 164 ++ .../quiver/time/duration_unit_constants.dart | 21 + .../guru_utils/lib/quiver/time/util.dart | 56 + .../guru_utils/lib/random/pseudo_random.dart | 56 + .../guru_utils/lib/random/random_utils.dart | 23 + .../guru_utils/lib/remote/remote_config.dart | 66 + .../guru_utils/lib/router/route_center.dart | 70 + .../guru_utils/lib/router/route_matcher.dart | 12 + .../guru_utils/lib/router/route_path.dart | 30 + .../guru_utils/lib/router/route_recorder.dart | 77 + .../guru_utils/lib/router/route_utils.dart | 39 + .../guru_utils/lib/router/router.dart | 25 + .../lib/router/routing_observer.dart | 17 + .../guru_utils/lib/settings/settings.dart | 40 + .../lib/settings/utils_settings.dart | 80 + .../guru_utils/lib/size/size_utils.dart | 22 + .../guru_utils/lib/svg/svg_parser.dart | 57 + .../lib/timer/countdown_manager.dart | 38 + .../packages/guru_utils/lib/timer/timer.dart | 5 + .../guru_utils/lib/timer/timer_scheduler.dart | 62 + .../packages/guru_utils/lib/tuple/tuple.dart | 414 ++++ .../guru_utils/lib/uri/uri_utils.dart | 65 + .../lib/vibration/vibrate_model.dart | 40 + .../lib/vibration/vibrate_model.g.dart | 26 + .../lib/vibration/vibrate_utils.dart | 51 + .../engine/action/frame_action.dart | 41 + .../visual_feast/engine/layers/layers.dart | 123 ++ .../engine/layers/render_layer.dart | 76 + .../engine/layers/sorting_layer.dart | 77 + .../engine/render/render_element.dart | 101 + .../engine/render/render_queue.dart | 126 ++ .../engine/render/visual_feast_render.dart | 126 ++ .../engine/sprite/visual_feast_sprite.dart | 34 + .../engine/visual_feast_engine.dart | 241 +++ .../lib/visual_feast/keyframe/key_frame.dart | 60 + .../lib/visual_feast/visual_feast.dart | 6 + .../visual_feast/visual_feast_animation.dart | 577 ++++++ .../lib/visual_feast/visual_feast_aware.dart | 34 + .../visual_feast/visual_feast_completer.dart | 60 + .../lib/visual_feast/visual_feast_looper.dart | 59 + .../visual_feast/visual_feast_observer.dart | 53 + .../lib/visual_feast/visual_feast_sink.dart | 40 + .../lib/visual_feast/visual_feast_widget.dart | 195 ++ .../guru_utils/lib/widget/widget_utils.dart | 286 +++ guru_app/packages/guru_utils/pubspec.yaml | 118 ++ .../guru_utils/test/guru_utils_test.dart | 5 + .../plugins/guru_analytics_flutter/.gitignore | 121 ++ .../guru_analytics_flutter/CHANGELOG.md | 3 + .../plugins/guru_analytics_flutter/LICENSE | 1 + .../plugins/guru_analytics_flutter/README.md | 15 + .../analysis_options.yaml | 4 + .../guru_analytics_flutter/android/.gitignore | 8 + .../android/build.gradle | 73 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 7 + .../GuruAnalyticsConstants.kt | 54 + .../GuruAnalyticsFlutterPlugin.kt | 242 +++ .../guru_analytics_flutter/example/.gitignore | 46 + .../guru_analytics_flutter/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 34 + .../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 | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 11 + .../example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../example/ios/Podfile | 41 + .../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 | 47 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/main.dart | 56 + .../example/pubspec.lock | 243 +++ .../example/pubspec.yaml | 84 + .../example/test/widget_test.dart | 27 + .../guru_analytics_flutter/ios/.gitignore | 38 + .../ios/Assets/.gitkeep | 0 .../ios/Classes/GuruAnalyticsConstants.swift | 52 + .../ios/Classes/GuruAnalyticsFlutterPlugin.h | 4 + .../ios/Classes/GuruAnalyticsFlutterPlugin.m | 15 + .../SwiftGuruAnalyticsFlutterPlugin.swift | 268 +++ .../ios/guru_analytics_flutter.podspec | 44 + .../lib/event_logger.dart | 447 +++++ .../lib/event_logger_common.dart | 23 + .../lib/events_constants.dart | 121 ++ .../lib/guru/guru_event_logger.dart | 218 +++ .../lib/guru/guru_statistic.dart | 40 + .../lib/guru_analytics_flutter.dart | 7 + .../guru_analytics_flutter/pubspec.lock | 229 +++ .../guru_analytics_flutter/pubspec.yaml | 70 + .../test/guru_analytics_flutter_test.dart | 23 + .../guru_applifecycle_flutter/.gitignore | 290 +++ .../guru_applifecycle_flutter/CHANGELOG.md | 3 + .../plugins/guru_applifecycle_flutter/LICENSE | 1 + .../guru_applifecycle_flutter/README.md | 15 + .../analysis_options.yaml | 4 + .../android/.gitignore | 8 + .../android/build.gradle | 76 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../AppStateNotifier.java | 95 + .../GuruApplifecycleFlutterPlugin.kt | 42 + .../example/.gitignore | 46 + .../example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 68 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 34 + .../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 | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 11 + .../example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../example/ios/Podfile | 41 + .../example/ios/Podfile.lock | 35 + .../ios/Runner.xcodeproj/project.pbxproj | 552 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 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/main.dart | 95 + .../example/pubspec.lock | 201 ++ .../example/pubspec.yaml | 85 + .../example/test/widget_test.dart | 27 + .../guru_applifecycle_flutter/ios/.gitignore | 38 + .../ios/Assets/.gitkeep | 0 .../ios/Classes/AppStateNotifier.h | 22 + .../ios/Classes/AppStateNotifier.m | 142 ++ .../Classes/GuruApplifecycleFlutterPlugin.h | 4 + .../Classes/GuruApplifecycleFlutterPlugin.m | 39 + .../ios/guru_applifecycle_flutter.podspec | 25 + .../lib/guru_applifecycle.dart | 2 + .../lib/guru_applifecycle_flutter.dart | 13 + .../app_background_event_notifier.dart | 63 + .../lib/lifecycle/app_lifecycle_callback.dart | 26 + .../guru_applifecycle_flutter/pubspec.lock | 168 ++ .../guru_applifecycle_flutter/pubspec.yaml | 65 + .../test/guru_applifecycle_flutter_test.dart | 23 + .../plugins/guru_applovin_flutter/.gitignore | 8 + .../guru_applovin_flutter/CHANGELOG.md | 3 + .../plugins/guru_applovin_flutter/LICENSE | 1 + .../plugins/guru_applovin_flutter/README.md | 15 + .../analysis_options.yaml | 4 + .../guru_applovin_flutter/android/.gitignore | 8 + .../android/build.gradle | 133 ++ .../android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 7 + .../guru/guru_applovin_flutter/AdHelp.kt | 94 + .../guru/guru_applovin_flutter/AdStatus.kt | 93 + .../guru/guru_applovin_flutter/BannerAd.kt | 304 +++ .../guru_applovin_flutter/GuruApplovin.kt | 23 + .../GuruApplovinFlutterPlugin.kt | 734 +++++++ .../guru_applovin_flutter/InterstitialAd.kt | 273 +++ .../guru_applovin_flutter/RewardedVideoAd.kt | 276 +++ .../guru_applovin_flutter/log/Formatter.kt | 18 + .../guru/guru_applovin_flutter/log/Logger.kt | 85 + .../log/SystemProperties.kt | 38 + .../guru_applovin_flutter/example/.gitignore | 46 + .../guru_applovin_flutter/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 57 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 34 + .../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 | 33 + .../example/android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 11 + .../example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../guru_applovin_flutter/example/ios/Podfile | 43 + .../example/ios/Podfile.lock | 447 +++++ .../ios/Runner.xcodeproj/project.pbxproj | 572 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../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/main.dart | 62 + .../example/pubspec.lock | 167 ++ .../example/pubspec.yaml | 84 + .../example/test/widget_test.dart | 22 + .../guru_applovin_flutter/ios/.gitignore | 38 + .../guru_applovin_flutter/ios/Assets/.gitkeep | 0 .../ios/Classes/AdHelper.swift | 64 + .../ios/Classes/AdStatus.swift | 58 + .../ios/Classes/BannerAd.swift | 207 ++ .../ios/Classes/GDPR/Gdpr.swift | 127 ++ .../GDPR/UIViewControllerExtensions.swift | 78 + .../ios/Classes/GuruApplovinFlutterPlugin.h | 4 + .../ios/Classes/GuruApplovinFlutterPlugin.m | 15 + .../ios/Classes/InterstitialAd.swift | 165 ++ .../ios/Classes/RewardedVideoAd.swift | 187 ++ .../SwiftGuruApplovinFlutterPlugin.swift | 560 ++++++ .../ios/guru_applovin_flutter.podspec | 49 + .../lib/ad_impression.dart | 17 + .../guru_applovin_flutter/lib/banner_ad.dart | 92 + .../lib/gdpr/gdpr_models.dart | 19 + .../lib/guru_applovin_flutter.dart | 219 +++ .../lib/interstitial_ad.dart | 84 + .../lib/rewarded_video_ad.dart | 85 + .../guru_applovin_flutter/plugins/.gitignore | 8 + .../plugins/max_yandex_adapter/.gitignore | 30 + .../plugins/max_yandex_adapter/CHANGELOG.md | 3 + .../plugins/max_yandex_adapter/LICENSE | 1 + .../plugins/max_yandex_adapter/README.md | 15 + .../max_yandex_adapter/analysis_options.yaml | 4 + .../max_yandex_adapter/android/.gitignore | 9 + .../max_yandex_adapter/android/build.gradle | 50 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../MaxYandexAdapterPlugin.kt | 35 + .../max_yandex_adapter/example/.gitignore | 44 + .../max_yandex_adapter/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../example/android/.gitignore | 13 + .../example/android/app/build.gradle | 71 + .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 + .../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 + .../max_yandex_adapter/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../max_yandex_adapter/example/ios/Podfile | 41 + .../ios/Runner.xcodeproj/project.pbxproj | 481 +++++ .../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 + .../max_yandex_adapter/example/lib/main.dart | 63 + .../max_yandex_adapter/example/pubspec.lock | 175 ++ .../max_yandex_adapter/example/pubspec.yaml | 84 + .../example/test/widget_test.dart | 27 + .../plugins/max_yandex_adapter/ios/.gitignore | 38 + .../max_yandex_adapter/ios/Assets/.gitkeep | 0 .../ios/Classes/MaxYandexAdapterPlugin.h | 4 + .../ios/Classes/MaxYandexAdapterPlugin.m | 15 + .../Classes/SwiftMaxYandexAdapterPlugin.swift | 14 + .../ios/max_yandex_adapter.podspec | 25 + .../lib/max_yandex_adapter.dart | 8 + .../max_yandex_adapter_method_channel.dart | 17 + ...max_yandex_adapter_platform_interface.dart | 29 + .../plugins/max_yandex_adapter/pubspec.yaml | 72 + ...ax_yandex_adapter_method_channel_test.dart | 24 + .../test/max_yandex_adapter_test.dart | 29 + .../guru_applovin_flutter/pubspec.lock | 139 ++ .../guru_applovin_flutter/pubspec.yaml | 65 + .../test/guru_applovin_flutter_test.dart | 23 + guru_app/plugins/guru_navigator/.gitignore | 120 ++ guru_app/plugins/guru_navigator/CHANGELOG.md | 3 + guru_app/plugins/guru_navigator/LICENSE | 1 + guru_app/plugins/guru_navigator/README.md | 15 + .../guru_navigator/analysis_options.yaml | 4 + .../plugins/guru_navigator/android/.gitignore | 9 + .../guru_navigator/android/build.gradle | 46 + .../guru_navigator/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../guru_navigator/GuruNavigatorPlugin.kt | 81 + .../plugins/guru_navigator/example/.gitignore | 44 + .../plugins/guru_navigator/example/README.md | 16 + .../example/analysis_options.yaml | 29 + .../guru_navigator/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 71 + .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 + .../guru_navigator_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 + .../guru_navigator/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../guru_navigator/example/ios/Podfile | 41 + .../guru_navigator/example/ios/Podfile.lock | 22 + .../ios/Runner.xcodeproj/project.pbxproj | 552 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../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 + .../guru_navigator/example/lib/main.dart | 57 + .../guru_navigator/example/pubspec.lock | 175 ++ .../guru_navigator/example/pubspec.yaml | 84 + .../example/test/widget_test.dart | 27 + .../plugins/guru_navigator/ios/.gitignore | 38 + .../guru_navigator/ios/Assets/.gitkeep | 0 .../ios/Classes/GuruNavigatorPlugin.h | 4 + .../ios/Classes/GuruNavigatorPlugin.m | 15 + .../Classes/SwiftGuruNavigatorPlugin.swift | 16 + .../guru_navigator/ios/guru_navigator.podspec | 23 + .../guru_navigator/lib/guru_navigator.dart | 9 + .../lib/guru_navigator_method_channel.dart | 16 + .../guru_navigator_platform_interface.dart | 30 + guru_app/plugins/guru_navigator/pubspec.lock | 161 ++ guru_app/plugins/guru_navigator/pubspec.yaml | 72 + .../guru_navigator_method_channel_test.dart | 24 + .../test/guru_navigator_test.dart | 27 + .../plugins/guru_platform_data/.gitignore | 29 + .../plugins/guru_platform_data/CHANGELOG.md | 3 + guru_app/plugins/guru_platform_data/LICENSE | 1 + guru_app/plugins/guru_platform_data/README.md | 15 + .../guru_platform_data/analysis_options.yaml | 4 + .../guru_platform_data/android/.gitignore | 8 + .../guru_platform_data/android/build.gradle | 54 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../guru_platform_data/GuruPlatformData.kt | 224 +++ .../plugins/guru_platform_data/ios/.gitignore | 38 + .../guru_platform_data/ios/Assets/.gitkeep | 0 .../ios/Classes/GuruPlatformDataPlugin.h | 4 + .../ios/Classes/GuruPlatformDataPlugin.m | 15 + .../Classes/SwiftGuruPlatformDataPlugin.swift | 100 + .../ios/guru_platform_data.podspec | 25 + .../lib/guru_platform_data.dart | 148 ++ .../lib/guru_platform_data_web.dart | 44 + .../plugins/guru_platform_data/pubspec.yaml | 70 + .../test/guru_platform_data_test.dart | 19 + guru_app/plugins/persistent/.gitignore | 121 ++ guru_app/plugins/persistent/CHANGELOG.md | 3 + guru_app/plugins/persistent/LICENSE | 1 + guru_app/plugins/persistent/README.md | 15 + .../plugins/persistent/analysis_options.yaml | 4 + .../plugins/persistent/android/.gitignore | 9 + .../plugins/persistent/android/build.gradle | 50 + .../persistent/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../app/guru/persistent/PersistentPlugin.kt | 30 + .../app/guru/persistent/log/PersistentLog.kt | 221 +++ .../plugins/persistent/example/.gitignore | 44 + guru_app/plugins/persistent/example/README.md | 16 + .../persistent/example/analysis_options.yaml | 29 + .../persistent/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 75 + .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 + .../guru/persistent_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 + .../persistent/example/android/build.gradle | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/settings.gradle | 11 + .../plugins/persistent/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + .../plugins/persistent/example/ios/Podfile | 41 + .../persistent/example/ios/Podfile.lock | 22 + .../ios/Runner.xcodeproj/project.pbxproj | 552 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../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 + .../persistent/example/ios/Runner/Info.plist | 51 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../plugins/persistent/example/lib/main.dart | 108 ++ .../plugins/persistent/example/pubspec.lock | 175 ++ .../plugins/persistent/example/pubspec.yaml | 84 + .../persistent/example/test/widget_test.dart | 27 + guru_app/plugins/persistent/ios/.gitignore | 38 + .../plugins/persistent/ios/Assets/.gitkeep | 0 .../ios/Classes/LogLibrary/DDFileLogger.h | 226 +++ .../ios/Classes/LogLibrary/DDFileLogger.m | 899 +++++++++ .../persistent/ios/Classes/LogLibrary/DDLog.h | 887 +++++++++ .../persistent/ios/Classes/LogLibrary/DDLog.m | 1274 +++++++++++++ .../LogLibrary/DDLogFileFormatterDefault.h | 42 + .../LogLibrary/DDLogFileFormatterDefault.m | 54 + .../ios/Classes/LogLibrary/DDLogFileInfo.h | 70 + .../ios/Classes/LogLibrary/DDLogFileInfo.m | 401 ++++ .../ios/Classes/LogLibrary/DDLogFileManager.h | 149 ++ .../LogLibrary/DDLogFileManagerDefault.h | 122 ++ .../LogLibrary/DDLogFileManagerDefault.m | 498 +++++ .../ios/Classes/LogLibrary/DDLogMacros.h | 93 + .../ios/Classes/LogLibrary/DDLoggerNames.h | 27 + .../ios/Classes/LogLibrary/DDLoggerNames.m | 20 + .../ios/Classes/LogLibrary/DDTTYLogger.h | 119 ++ .../ios/Classes/LogLibrary/DDTTYLogger.m | 1173 ++++++++++++ .../ios/Classes/LogLibrary/GuruLog.swift | 175 ++ .../persistent/ios/Classes/PersistentPlugin.h | 4 + .../persistent/ios/Classes/PersistentPlugin.m | 15 + .../ios/Classes/SwiftPersistentPlugin.swift | 136 ++ .../plugins/persistent/ios/persistent.podspec | 23 + .../persistent/lib/log/persistent_log.dart | 75 + guru_app/plugins/persistent/pubspec.lock | 161 ++ guru_app/plugins/persistent/pubspec.yaml | 72 + .../test/persistent_method_channel_test.dart | 24 + .../persistent/test/persistent_test.dart | 29 + guru_app/plugins/soundpool/CHANGELOG.md | 106 ++ guru_app/plugins/soundpool/LICENSE | 21 + guru_app/plugins/soundpool/README.md | 31 + .../plugins/soundpool/android/build.gradle | 52 + .../soundpool/android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../plugins/soundpool/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../pl/ukaszapps/soundpool/SoundpoolPlugin.kt | 312 +++ .../soundpool/ios/Classes/Atomic.swift | 58 + .../soundpool/ios/Classes/SoundpoolPlugin.h | 4 + .../soundpool/ios/Classes/SoundpoolPlugin.m | 12 + .../ios/Classes/SwiftSoundpoolPlugin.swift | 346 ++++ .../plugins/soundpool/ios/soundpool.podspec | 22 + guru_app/plugins/soundpool/lib/soundpool.dart | 428 +++++ .../soundpool/lib/src/platform_options.dart | 4 + .../soundpool/lib/src/platforms/android.dart | 6 + .../soundpool/lib/src/platforms/ios.dart | 52 + .../soundpool/lib/src/platforms/macos.dart | 14 + .../soundpool/lib/src/platforms/web.dart | 6 + .../plugins/soundpool/macos/soundpool.podspec | 22 + guru_app/plugins/soundpool/pubspec.lock | 147 ++ guru_app/plugins/soundpool/pubspec.yaml | 30 + guru_app/plugins/vibration/.gitignore | 120 ++ guru_app/plugins/vibration/CHANGELOG.md | 81 + guru_app/plugins/vibration/LICENSE | 25 + guru_app/plugins/vibration/README.md | 111 ++ .../plugins/vibration/android/build.gradle | 34 + .../vibration/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../plugins/vibration/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 5 + .../com/benjaminabel/vibration/Vibration.java | 93 + .../VibrationMethodChannelHandler.java | 68 + .../vibration/VibrationPlugin.java | 43 + .../vibration/ios/Classes/VibrationPlugin.h | 4 + .../vibration/ios/Classes/VibrationPlugin.m | 12 + .../ios/Classes/VibrationPluginSwift.swift | 175 ++ .../plugins/vibration/ios/vibration.podspec | 22 + guru_app/plugins/vibration/lib/vibration.dart | 83 + guru_app/plugins/vibration/pubspec.lock | 159 ++ guru_app/plugins/vibration/pubspec.yaml | 28 + .../vibration/test/vibration_test.dart | 83 + guru_app/pubspec.lock | 1523 +++++++++++++++ guru_app/pubspec.yaml | 140 ++ .../test/datetime/date_time_utils_test.dart | 43 + guru_app/test/guru_manager_test.dart | 6 + guru_app/test/order/order_test.dart | 21 + guru_app/test/random/pseudo_random_test.dart | 38 + guru_app/test/test.file | 1 + guru_app/tools/bin/ad_review_ios_checker | 27 + guru_app/tools/bin/depaudit | 24 + guru_app/tools/bin/deps | 24 + guru_app/tools/bin/guru_setup | 49 + guru_app/tools/bin/guruupgrade | 52 + guru_app/tools/bin/l10n | 24 + guru_app/tools/bin/pubget | 16 + guru_app/tools/bin/pulish_gitea.py | 37 + guru_app/tools/bin/repoupdate | 37 + guru_app/tools/bin/retag | 11 + guru_app/tools/bin/rmtag | 9 + guru_app/tools/bin/update_repo_url | 35 + guru_app/tools/bin/version_snapshot | 41 + guru_app/zygote.py | 70 + guru_ui/.gitignore | 121 ++ guru_ui/CHANGELOG.md | 105 + guru_ui/LICENSE | 1 + guru_ui/README.md | 39 + guru_ui/analysis_options.yaml | 4 + guru_ui/assets/icons/ic_ad.png | Bin 0 -> 1743 bytes guru_ui/assets/icons/ic_close_dark.png | Bin 0 -> 927 bytes guru_ui/assets/icons/ic_close_light.png | Bin 0 -> 829 bytes guru_ui/assets/icons/ic_error.png | Bin 0 -> 56768 bytes guru_ui/assets/icons/ic_wifi.png | Bin 0 -> 17923 bytes guru_ui/assets/images/ic_purchase.png | Bin 0 -> 11626 bytes guru_ui/code_prebuild.sh | 3 + guru_ui/example/.gitignore | 44 + guru_ui/example/README.md | 16 + guru_ui/example/analysis_options.yaml | 29 + guru_ui/example/android/.gitignore | 12 + guru_ui/example/android/app/build.gradle | 121 ++ guru_ui/example/android/app/fungame.keystore | Bin 0 -> 2481 bytes .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 36 + .../guru/core/uiux.demo/MainActivity.kt | 63 + .../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-v28/styles.xml | 30 + .../app/src/main/res/values/styles.xml | 28 + .../app/src/profile/AndroidManifest.xml | 8 + guru_ui/example/android/build.gradle | 34 + guru_ui/example/android/gradle.properties | 16 + .../gradle/wrapper/gradle-wrapper.properties | 5 + guru_ui/example/android/settings.gradle | 11 + .../assets/fonts/EncodeSansExpanded-Black.ttf | Bin 0 -> 161408 bytes .../assets/fonts/EncodeSansExpanded-Bold.ttf | Bin 0 -> 161576 bytes .../fonts/EncodeSansExpanded-ExtraBold.ttf | Bin 0 -> 162616 bytes .../fonts/EncodeSansExpanded-ExtraLight.ttf | Bin 0 -> 158900 bytes .../assets/fonts/EncodeSansExpanded-Light.ttf | Bin 0 -> 161456 bytes .../fonts/EncodeSansExpanded-Medium.ttf | Bin 0 -> 162536 bytes .../fonts/EncodeSansExpanded-Regular.ttf | Bin 0 -> 160908 bytes .../fonts/EncodeSansExpanded-SemiBold.ttf | Bin 0 -> 163388 bytes .../assets/fonts/EncodeSansExpanded-Thin.ttf | Bin 0 -> 157556 bytes guru_ui/example/assets/images/Ic_Award.png | Bin 0 -> 930 bytes guru_ui/example/assets/images/LeaderBoard.png | Bin 0 -> 918 bytes guru_ui/example/assets/images/arrow.png | Bin 0 -> 534 bytes guru_ui/example/assets/images/award_right.png | Bin 0 -> 456 bytes guru_ui/example/assets/images/close.png | Bin 0 -> 648 bytes .../images/daily_challenge/ic_arrow_left.png | Bin 0 -> 716 bytes .../images/daily_challenge/ic_arrow_right.png | Bin 0 -> 677 bytes .../images/daily_challenge/ic_awards.png | Bin 0 -> 1487 bytes .../images/daily_challenge/ic_dialog_main.png | Bin 0 -> 10350 bytes .../daily_challenge/trophies/gold01.png | Bin 0 -> 19715 bytes .../daily_challenge/trophies/gold02.png | Bin 0 -> 20111 bytes .../daily_challenge/trophies/gold03.png | Bin 0 -> 19642 bytes .../daily_challenge/trophies/gold04.png | Bin 0 -> 20784 bytes .../daily_challenge/trophies/gold05.png | Bin 0 -> 20962 bytes .../daily_challenge/trophies/gold06.png | Bin 0 -> 22805 bytes .../daily_challenge/trophies/gold07.png | Bin 0 -> 19681 bytes .../daily_challenge/trophies/gold08.png | Bin 0 -> 19310 bytes .../daily_challenge/trophies/gold09.png | Bin 0 -> 19158 bytes .../daily_challenge/trophies/gold10.png | Bin 0 -> 19751 bytes .../daily_challenge/trophies/gold11.png | Bin 0 -> 17956 bytes .../daily_challenge/trophies/gold12.png | Bin 0 -> 20384 bytes .../daily_challenge/trophies/grey01.png | Bin 0 -> 21300 bytes .../daily_challenge/trophies/grey02.png | Bin 0 -> 22601 bytes .../daily_challenge/trophies/grey03.png | Bin 0 -> 21999 bytes .../daily_challenge/trophies/grey04.png | Bin 0 -> 23803 bytes .../daily_challenge/trophies/grey05.png | Bin 0 -> 22566 bytes .../daily_challenge/trophies/grey06.png | Bin 0 -> 25854 bytes .../daily_challenge/trophies/grey07.png | Bin 0 -> 21782 bytes .../daily_challenge/trophies/grey08.png | Bin 0 -> 23363 bytes .../daily_challenge/trophies/grey09.png | Bin 0 -> 20846 bytes .../daily_challenge/trophies/grey10.png | Bin 0 -> 21254 bytes .../daily_challenge/trophies/grey11.png | Bin 0 -> 19951 bytes .../daily_challenge/trophies/grey12.png | Bin 0 -> 23126 bytes guru_ui/example/assets/images/demo.png | Bin 0 -> 331576 bytes guru_ui/example/assets/images/ic_add.png | Bin 0 -> 816 bytes guru_ui/example/assets/images/ic_ads.png | Bin 0 -> 2315 bytes .../example/assets/images/ic_arrow_left.png | Bin 0 -> 716 bytes .../example/assets/images/ic_arrow_right.png | Bin 0 -> 205 bytes guru_ui/example/assets/images/ic_awards.png | Bin 0 -> 1487 bytes guru_ui/example/assets/images/ic_back.png | Bin 0 -> 398 bytes guru_ui/example/assets/images/ic_check.png | Bin 0 -> 689 bytes guru_ui/example/assets/images/ic_close.png | Bin 0 -> 1155 bytes .../example/assets/images/ic_close_white.png | Bin 0 -> 607 bytes guru_ui/example/assets/images/ic_coin.png | Bin 0 -> 2386 bytes .../assets/images/ic_colorful_tips.png | Bin 0 -> 880 bytes guru_ui/example/assets/images/ic_crown.png | Bin 0 -> 3950 bytes guru_ui/example/assets/images/ic_gem.png | Bin 0 -> 1746 bytes guru_ui/example/assets/images/ic_gem_add.png | Bin 0 -> 951 bytes guru_ui/example/assets/images/ic_homepage.png | Bin 0 -> 1029 bytes .../example/assets/images/ic_illustration.png | Bin 0 -> 156271 bytes .../example/assets/images/ic_leaderboard.png | Bin 0 -> 1027 bytes guru_ui/example/assets/images/ic_message.png | Bin 0 -> 1451 bytes .../example/assets/images/ic_pic_joker.png | Bin 0 -> 9799 bytes guru_ui/example/assets/images/ic_rect.png | Bin 0 -> 1367 bytes guru_ui/example/assets/images/ic_restore.png | Bin 0 -> 1224 bytes guru_ui/example/assets/images/ic_share.png | Bin 0 -> 1039 bytes guru_ui/example/assets/images/ic_sound.png | Bin 0 -> 1828 bytes guru_ui/example/assets/images/ic_theme.png | Bin 0 -> 2318 bytes guru_ui/example/assets/images/ic_tips.png | Bin 0 -> 1741 bytes .../example/assets/images/ic_volunteer.png | Bin 0 -> 2681 bytes guru_ui/example/assets/images/ic_zhendong.png | Bin 0 -> 1683 bytes guru_ui/example/assets/images/more.png | Bin 0 -> 346 bytes guru_ui/example/assets/images/off.png | Bin 0 -> 3204 bytes guru_ui/example/assets/images/on.png | Bin 0 -> 3414 bytes guru_ui/example/assets/images/pic.png | Bin 0 -> 236398 bytes .../example/assets/images/pic_problems.png | Bin 0 -> 27734 bytes .../assets/images/pic_radial_light.png | Bin 0 -> 10893 bytes .../example/assets/images/pic_remove_ads.png | Bin 0 -> 21192 bytes guru_ui/example/assets/images/remove_ads.png | Bin 0 -> 158833 bytes guru_ui/example/assets/images/s2.png | Bin 0 -> 5236 bytes .../assets/images/slider_bar/pic_select.png | Bin 0 -> 1368 bytes .../example/assets/images/slider_bar/x2.png | Bin 0 -> 1199 bytes .../example/assets/images/slider_bar/x3.png | Bin 0 -> 2744 bytes .../example/assets/images/slider_bar/x4.png | Bin 0 -> 2458 bytes .../example/assets/images/slider_bar/x5.png | Bin 0 -> 2826 bytes .../assets/lottie/animated_trophy_bg.json | 1 + .../assets/lottie/congrats_trophy_bg.json | 1 + guru_ui/example/build_prod_android.sh | 91 + guru_ui/example/build_version.properties | 9 + guru_ui/example/build_version.sh | 15 + guru_ui/example/extract_apk_and_upload.sh | 39 + guru_ui/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + guru_ui/example/ios/Flutter/Debug.xcconfig | 2 + guru_ui/example/ios/Flutter/Release.xcconfig | 2 + guru_ui/example/ios/Podfile | 41 + guru_ui/example/ios/Podfile.lock | 125 ++ .../ios/Runner.xcodeproj/project.pbxproj | 555 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + guru_ui/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 + guru_ui/example/ios/Runner/Info.plist | 51 + .../ios/Runner/Runner-Bridging-Header.h | 1 + guru_ui/example/lib/console/console.dart | 72 + .../example/lib/console/console_button.dart | 52 + .../console/console_button_controller.dart | 37 + guru_ui/example/lib/console/vm_helper.dart | 257 +++ .../lib/daily_challenge/daily_challenge.dart | 72 + guru_ui/example/lib/data/database/ui_db.dart | 29 + .../lib/data/settings/ui_settings.dart | 21 + .../example/lib/generated/app_strings.dart | 23 + guru_ui/example/lib/generated/assets.dart | 22 + .../lib/generated/intl/messages_af.dart | 42 + .../lib/generated/intl/messages_all.dart | 371 ++++ .../lib/generated/intl/messages_am.dart | 40 + .../lib/generated/intl/messages_ar.dart | 40 + .../lib/generated/intl/messages_az_AZ.dart | 42 + .../lib/generated/intl/messages_be.dart | 43 + .../lib/generated/intl/messages_bg.dart | 43 + .../lib/generated/intl/messages_bn_BD.dart | 41 + .../lib/generated/intl/messages_ca.dart | 43 + .../lib/generated/intl/messages_cs_CZ.dart | 42 + .../lib/generated/intl/messages_da_DK.dart | 41 + .../lib/generated/intl/messages_de_DE.dart | 42 + .../lib/generated/intl/messages_el_GR.dart | 44 + .../lib/generated/intl/messages_en.dart | 42 + .../lib/generated/intl/messages_es_419.dart | 44 + .../lib/generated/intl/messages_es_ES.dart | 43 + .../lib/generated/intl/messages_es_US.dart | 43 + .../lib/generated/intl/messages_et.dart | 43 + .../lib/generated/intl/messages_eu_ES.dart | 43 + .../lib/generated/intl/messages_fa.dart | 43 + .../lib/generated/intl/messages_fi_FI.dart | 41 + .../lib/generated/intl/messages_fil.dart | 44 + .../lib/generated/intl/messages_fr_CA.dart | 43 + .../lib/generated/intl/messages_fr_FR.dart | 43 + .../lib/generated/intl/messages_gl_ES.dart | 43 + .../lib/generated/intl/messages_gu.dart | 40 + .../lib/generated/intl/messages_he_IL.dart | 41 + .../lib/generated/intl/messages_hi_IN.dart | 41 + .../lib/generated/intl/messages_hr.dart | 43 + .../lib/generated/intl/messages_hu_HU.dart | 43 + .../lib/generated/intl/messages_hy_AM.dart | 43 + .../lib/generated/intl/messages_id.dart | 42 + .../lib/generated/intl/messages_is_IS.dart | 42 + .../lib/generated/intl/messages_it_IT.dart | 42 + .../lib/generated/intl/messages_ja_JP.dart | 40 + .../lib/generated/intl/messages_ka_GE.dart | 41 + .../lib/generated/intl/messages_kk.dart | 43 + .../lib/generated/intl/messages_km_KH.dart | 42 + .../lib/generated/intl/messages_kn_IN.dart | 41 + .../lib/generated/intl/messages_ko_KR.dart | 40 + .../lib/generated/intl/messages_ky_KG.dart | 42 + .../lib/generated/intl/messages_lo_LA.dart | 42 + .../lib/generated/intl/messages_lt.dart | 43 + .../lib/generated/intl/messages_lv.dart | 43 + .../lib/generated/intl/messages_mk_MK.dart | 43 + .../lib/generated/intl/messages_ml_IN.dart | 42 + .../lib/generated/intl/messages_mn_MN.dart | 42 + .../lib/generated/intl/messages_mr_IN.dart | 41 + .../lib/generated/intl/messages_ms.dart | 41 + .../lib/generated/intl/messages_ms_MY.dart | 41 + .../lib/generated/intl/messages_my_MM.dart | 44 + .../lib/generated/intl/messages_nb_NO.dart | 42 + .../lib/generated/intl/messages_ne_NP.dart | 42 + .../lib/generated/intl/messages_nl_NL.dart | 41 + .../lib/generated/intl/messages_pa.dart | 40 + .../lib/generated/intl/messages_pl_PL.dart | 44 + .../lib/generated/intl/messages_pt_BR.dart | 43 + .../lib/generated/intl/messages_pt_PT.dart | 42 + .../lib/generated/intl/messages_ro.dart | 43 + .../lib/generated/intl/messages_ru_RU.dart | 42 + .../lib/generated/intl/messages_si_LK.dart | 41 + .../lib/generated/intl/messages_sk.dart | 42 + .../lib/generated/intl/messages_sl.dart | 42 + .../lib/generated/intl/messages_sq.dart | 43 + .../lib/generated/intl/messages_sr.dart | 43 + .../lib/generated/intl/messages_sv_SE.dart | 42 + .../lib/generated/intl/messages_sw.dart | 42 + .../lib/generated/intl/messages_ta_IN.dart | 43 + .../lib/generated/intl/messages_te_IN.dart | 41 + .../lib/generated/intl/messages_th.dart | 42 + .../lib/generated/intl/messages_tl.dart | 44 + .../lib/generated/intl/messages_tr_TR.dart | 42 + .../lib/generated/intl/messages_uk.dart | 42 + .../lib/generated/intl/messages_ur.dart | 41 + .../lib/generated/intl/messages_vi.dart | 43 + .../lib/generated/intl/messages_zh_CN.dart | 40 + .../lib/generated/intl/messages_zh_HK.dart | 40 + .../lib/generated/intl/messages_zh_TW.dart | 40 + .../lib/generated/intl/messages_zu.dart | 44 + guru_ui/example/lib/generated/l10n.dart | 285 +++ guru_ui/example/lib/l10n/intl_af.arb | 15 + guru_ui/example/lib/l10n/intl_am.arb | 15 + guru_ui/example/lib/l10n/intl_ar.arb | 15 + guru_ui/example/lib/l10n/intl_az_AZ.arb | 15 + guru_ui/example/lib/l10n/intl_be.arb | 15 + guru_ui/example/lib/l10n/intl_bg.arb | 15 + guru_ui/example/lib/l10n/intl_bn_BD.arb | 15 + guru_ui/example/lib/l10n/intl_ca.arb | 15 + guru_ui/example/lib/l10n/intl_cs_CZ.arb | 15 + guru_ui/example/lib/l10n/intl_da_DK.arb | 15 + guru_ui/example/lib/l10n/intl_de_DE.arb | 15 + guru_ui/example/lib/l10n/intl_el_GR.arb | 15 + guru_ui/example/lib/l10n/intl_en.arb | 16 + guru_ui/example/lib/l10n/intl_es_419.arb | 15 + guru_ui/example/lib/l10n/intl_es_ES.arb | 15 + guru_ui/example/lib/l10n/intl_es_US.arb | 15 + guru_ui/example/lib/l10n/intl_et.arb | 15 + guru_ui/example/lib/l10n/intl_eu_ES.arb | 15 + guru_ui/example/lib/l10n/intl_fa.arb | 15 + guru_ui/example/lib/l10n/intl_fi_FI.arb | 15 + guru_ui/example/lib/l10n/intl_fil.arb | 15 + guru_ui/example/lib/l10n/intl_fr_CA.arb | 15 + guru_ui/example/lib/l10n/intl_fr_FR.arb | 15 + guru_ui/example/lib/l10n/intl_gl_ES.arb | 15 + guru_ui/example/lib/l10n/intl_gu.arb | 15 + guru_ui/example/lib/l10n/intl_he_IL.arb | 15 + guru_ui/example/lib/l10n/intl_hi_IN.arb | 15 + guru_ui/example/lib/l10n/intl_hr.arb | 15 + guru_ui/example/lib/l10n/intl_hu_HU.arb | 15 + guru_ui/example/lib/l10n/intl_hy_AM.arb | 15 + guru_ui/example/lib/l10n/intl_id.arb | 15 + guru_ui/example/lib/l10n/intl_is_IS.arb | 15 + guru_ui/example/lib/l10n/intl_it_IT.arb | 15 + guru_ui/example/lib/l10n/intl_ja_JP.arb | 15 + guru_ui/example/lib/l10n/intl_ka_GE.arb | 15 + guru_ui/example/lib/l10n/intl_kk.arb | 15 + guru_ui/example/lib/l10n/intl_km_KH.arb | 15 + guru_ui/example/lib/l10n/intl_kn_IN.arb | 15 + guru_ui/example/lib/l10n/intl_ko_KR.arb | 15 + guru_ui/example/lib/l10n/intl_ky_KG.arb | 15 + guru_ui/example/lib/l10n/intl_lo_LA.arb | 15 + guru_ui/example/lib/l10n/intl_lt.arb | 15 + guru_ui/example/lib/l10n/intl_lv.arb | 15 + guru_ui/example/lib/l10n/intl_mk_MK.arb | 15 + guru_ui/example/lib/l10n/intl_ml_IN.arb | 15 + guru_ui/example/lib/l10n/intl_mn_MN.arb | 15 + guru_ui/example/lib/l10n/intl_mr_IN.arb | 15 + guru_ui/example/lib/l10n/intl_ms.arb | 15 + guru_ui/example/lib/l10n/intl_ms_MY.arb | 15 + guru_ui/example/lib/l10n/intl_my_MM.arb | 15 + guru_ui/example/lib/l10n/intl_nb_NO.arb | 15 + guru_ui/example/lib/l10n/intl_ne_NP.arb | 15 + guru_ui/example/lib/l10n/intl_nl_NL.arb | 15 + guru_ui/example/lib/l10n/intl_pa.arb | 15 + guru_ui/example/lib/l10n/intl_pl_PL.arb | 15 + guru_ui/example/lib/l10n/intl_pt_BR.arb | 15 + guru_ui/example/lib/l10n/intl_pt_PT.arb | 15 + guru_ui/example/lib/l10n/intl_ro.arb | 15 + guru_ui/example/lib/l10n/intl_ru_RU.arb | 15 + guru_ui/example/lib/l10n/intl_si_LK.arb | 15 + guru_ui/example/lib/l10n/intl_sk.arb | 15 + guru_ui/example/lib/l10n/intl_sl.arb | 15 + guru_ui/example/lib/l10n/intl_sq.arb | 15 + guru_ui/example/lib/l10n/intl_sr.arb | 15 + guru_ui/example/lib/l10n/intl_sv_SE.arb | 15 + guru_ui/example/lib/l10n/intl_sw.arb | 15 + guru_ui/example/lib/l10n/intl_ta_IN.arb | 15 + guru_ui/example/lib/l10n/intl_te_IN.arb | 15 + guru_ui/example/lib/l10n/intl_th.arb | 15 + guru_ui/example/lib/l10n/intl_tl.arb | 15 + guru_ui/example/lib/l10n/intl_tr_TR.arb | 15 + guru_ui/example/lib/l10n/intl_uk.arb | 15 + guru_ui/example/lib/l10n/intl_ur.arb | 15 + guru_ui/example/lib/l10n/intl_vi.arb | 15 + guru_ui/example/lib/l10n/intl_zh_CN.arb | 15 + guru_ui/example/lib/l10n/intl_zh_HK.arb | 15 + guru_ui/example/lib/l10n/intl_zh_TW.arb | 15 + guru_ui/example/lib/l10n/intl_zu.arb | 15 + guru_ui/example/lib/main.dart | 91 + .../lib/pages/award/award_binding.dart | 12 + .../lib/pages/award/award_controller.dart | 17 + .../example/lib/pages/award/award_view.dart | 35 + .../lib/pages/button/button_binding.dart | 10 + .../lib/pages/button/button_controller.dart | 19 + .../lib/pages/button/button_model.dart | 5 + .../example/lib/pages/button/button_view.dart | 176 ++ .../lib/pages/dialog/dialog_binding.dart | 10 + .../lib/pages/dialog/dialog_controller.dart | 19 + .../lib/pages/dialog/dialog_model.dart | 5 + .../example/lib/pages/dialog/dialog_view.dart | 502 +++++ .../example/lib/pages/root/root_binding.dart | 12 + .../lib/pages/root/root_controller.dart | 79 + .../example/lib/pages/root/root_model.dart | 35 + .../example/lib/pages/root/root_model.g.dart | 96 + guru_ui/example/lib/pages/root/root_view.dart | 243 +++ guru_ui/example/lib/pages/root/watermark.dart | 44 + .../settings/remove_ads/remove_ads_card.dart | 128 ++ .../remove_ads/remove_ads_design_model.dart | 82 + .../remove_ads/remove_ads_design_model.g.dart | 165 ++ .../lib/pages/settings/settings_binding.dart | 10 + .../pages/settings/settings_controller.dart | 28 + .../pages/settings/settings_design_model.dart | 23 + .../settings/settings_design_model.g.dart | 80 + .../lib/pages/settings/settings_model.dart | 5 + .../lib/pages/settings/settings_view.dart | 114 ++ .../lib/pages/store/store_binding.dart | 9 + .../lib/pages/store/store_controller.dart | 8 + .../lib/pages/store/store_design_spec.dart | 135 ++ .../lib/pages/store/store_design_spec.g.dart | 286 +++ .../example/lib/pages/store/store_page.dart | 27 + .../lib/pages/tabbar/tabbar_binding.dart | 10 + .../lib/pages/tabbar/tabbar_controller.dart | 20 + .../example/lib/pages/tabbar/tabbar_view.dart | 97 + .../lib/pages/toast/toast_binding.dart | 10 + .../lib/pages/toast/toast_controller.dart | 5 + .../example/lib/pages/toast/toast_view.dart | 52 + .../pages/visual/visual_debug_controller.dart | 39 + .../visual/visual_debug_design_model.dart | 78 + .../visual/visual_debug_design_model.g.dart | 199 ++ .../lib/pages/visual/visual_debug_dialog.dart | 251 +++ .../visual_debug_dialog_controller.dart | 53 + .../lib/pages/visual/visual_debug_page.dart | 92 + .../settings/privacy_settings_binding.dart | 11 + .../settings/privacy_settings_controller.dart | 20 + .../settings/privacy_settings_model.dart | 5 + .../settings/privacy_settings_view.dart | 18 + .../lib/pages/webview/webview_binding.dart | 10 + .../lib/pages/webview/webview_controller.dart | 22 + .../pages/webview/webview_design_model.dart | 14 + .../pages/webview/webview_design_model.g.dart | 57 + .../lib/pages/webview/webview_model.dart | 5 + .../lib/pages/webview/webview_view.dart | 35 + .../lib/pages/widgets/guru_demo_page.dart | 14 + guru_ui/example/lib/route/app_pages.dart | 114 ++ guru_ui/example/lib/route/router.dart | 32 + guru_ui/example/lib/route/routes.dart | 46 + .../assetbar/custom_asset_bar_theme.dart | 55 + .../button/custom_button_decoration.dart | 88 + .../button/custom_standard_button_theme.dart | 67 + guru_ui/example/lib/theme/example_theme.dart | 205 ++ .../theme/tabbar/custom_tab_bar_theme.dart | 37 + guru_ui/example/pubspec.lock | 1368 ++++++++++++++ guru_ui/example/pubspec.yaml | 164 ++ guru_ui/example/test/widget_test.dart | 57 + guru_ui/l10n.yaml | 5 + guru_ui/lib/generated/intl/messages_all.dart | 63 + guru_ui/lib/generated/intl/messages_en.dart | 25 + guru_ui/lib/generated/l10n.dart | 78 + guru_ui/lib/guru_ui.dart | 1 + guru_ui/lib/guru_ui_test_page.dart | 182 ++ guru_ui/lib/guru_widget.dart | 5 + guru_ui/lib/localizations/l10n/app_en.arb | 5 + .../l10n/generated/app_localizations.dart | 136 ++ .../l10n/generated/app_localizations_en.dart | 12 + guru_ui/lib/localizations/ui_strings.dart | 17 + guru_ui/lib/pages/store/bundle_card.dart | 182 ++ guru_ui/lib/pages/store/bundle_card.g.dart | 108 ++ guru_ui/lib/pages/store/purchase_banner.dart | 310 +++ .../lib/pages/store/purchase_banner.g.dart | 188 ++ guru_ui/lib/pages/store/purchase_card.dart | 234 +++ guru_ui/lib/pages/store/purchase_card.g.dart | 151 ++ guru_ui/lib/pages/store/store_controller.dart | 109 ++ .../lib/pages/store/store_design_spec.dart | 100 + .../lib/pages/store/store_design_spec.g.dart | 226 +++ guru_ui/lib/pages/store/store_page.dart | 500 +++++ .../dialog_buttons_alert_design_model.dart | 51 + .../dialog_buttons_alert_design_model.g.dart | 152 ++ .../alerts/dialog_buttons_alert_widget.dart | 180 ++ ...alog_error_picture_alert_design_model.dart | 56 + ...og_error_picture_alert_design_model.g.dart | 168 ++ .../dialog_error_picture_alert_widget.dart | 123 ++ ...dialog_how_to_play_alert_design_model.dart | 68 + ...alog_how_to_play_alert_design_model.g.dart | 190 ++ .../dialog_how_to_play_alert_widget.dart | 246 +++ ...mage_double_button_alert_design_model.dart | 81 + ...ge_double_button_alert_design_model.g.dart | 218 +++ ...alog_image_double_button_alert_widget.dart | 222 +++ ...mage_single_button_alert_design_model.dart | 75 + ...ge_single_button_alert_design_model.g.dart | 208 ++ ...alog_image_single_button_alert_widget.dart | 191 ++ ...log_internet_error_alert_design_model.dart | 62 + ...g_internet_error_alert_design_model.g.dart | 178 ++ .../dialog_internet_error_alert_widget.dart | 138 ++ .../dialog_label_alert_design_model.dart | 41 + .../dialog_label_alert_design_model.g.dart | 134 ++ .../alerts/dialog_label_alert_widget.dart | 134 ++ ...ialog_single_input_alert_design_model.dart | 81 + ...log_single_input_alert_design_model.g.dart | 203 ++ .../dialog_single_input_alert_widget.dart | 171 ++ .../alerts/dialog_standard_container.dart | 55 + ...ialog_standard_container_design_model.dart | 25 + ...log_standard_container_design_model.g.dart | 108 ++ ...y_reward_gift_collection_design_model.dart | 60 + ...reward_gift_collection_design_model.g.dart | 166 ++ ...g_daily_reward_gift_collection_widget.dart | 210 ++ ...dialog_daily_reward_gift_design_model.dart | 75 + ...alog_daily_reward_gift_design_model.g.dart | 192 ++ .../dialog_daily_reward_gift_widget.dart | 245 +++ guru_ui/lib/widget/dialog/dialog_core.dart | 210 ++ guru_ui/lib/widget/dialog/dialog_utils.dart | 322 ++++ guru_ui/lib/widget/image/adaptive_image.dart | 217 +++ guru_ui/lib/widget/rating/rating_style.dart | 218 +++ guru_ui/lib/widget/ratingbar/rating_bar.dart | 499 +++++ .../ratingbar/rating_bar_indicator.dart | 187 ++ guru_ui/lib/widget/tips/tips.dart | 19 + guru_ui/lib/widget/tips/tips_clipper.dart | 59 + guru_ui/lib/widget/tips/tips_painter.dart | 41 + guru_ui/lib/widget/tips/tips_widget.dart | 64 + guru_ui/packages/daily_challenge/.gitignore | 30 + guru_ui/packages/daily_challenge/CHANGELOG.md | 3 + guru_ui/packages/daily_challenge/LICENSE | 1 + guru_ui/packages/daily_challenge/README.md | 39 + .../daily_challenge/analysis_options.yaml | 4 + .../assets/lottie/animated_trophy.json | 1 + guru_ui/packages/daily_challenge/l10n.yaml | 6 + .../daily_challenge/lib/daily_challenge.dart | 6 + .../lib/daily_challenge_package.dart | 105 + .../lib/data/db/creators/creators.dart | 10 + .../lib/data/db/daily_challenge_db.dart | 31 + .../data/db/entities/award/award_entity.dart | 78 + .../daily_challenge_entity.dart | 119 ++ .../lib/data/db/entities/entities.dart | 14 + .../lib/data/db/entities/entities.g.dart | 52 + .../data/db/modules/award/award_database.dart | 37 + .../daily_challenge_database.dart | 38 + .../daily_challenge/lib/l10n/app_af.arb | 3 + .../daily_challenge/lib/l10n/app_am.arb | 3 + .../daily_challenge/lib/l10n/app_ar.arb | 3 + .../daily_challenge/lib/l10n/app_az.arb | 3 + .../daily_challenge/lib/l10n/app_az_AZ.arb | 3 + .../daily_challenge/lib/l10n/app_be.arb | 3 + .../daily_challenge/lib/l10n/app_bg.arb | 3 + .../daily_challenge/lib/l10n/app_bn.arb | 3 + .../daily_challenge/lib/l10n/app_bn_BD.arb | 3 + .../daily_challenge/lib/l10n/app_ca.arb | 3 + .../daily_challenge/lib/l10n/app_cs.arb | 3 + .../daily_challenge/lib/l10n/app_cs_CZ.arb | 3 + .../daily_challenge/lib/l10n/app_da.arb | 3 + .../daily_challenge/lib/l10n/app_da_DK.arb | 3 + .../daily_challenge/lib/l10n/app_de.arb | 3 + .../daily_challenge/lib/l10n/app_de_DE.arb | 3 + .../daily_challenge/lib/l10n/app_el.arb | 3 + .../daily_challenge/lib/l10n/app_el_GR.arb | 3 + .../daily_challenge/lib/l10n/app_en.arb | 15 + .../daily_challenge/lib/l10n/app_es.arb | 3 + .../daily_challenge/lib/l10n/app_es_419.arb | 3 + .../daily_challenge/lib/l10n/app_es_ES.arb | 3 + .../daily_challenge/lib/l10n/app_es_US.arb | 3 + .../daily_challenge/lib/l10n/app_et.arb | 3 + .../daily_challenge/lib/l10n/app_eu.arb | 3 + .../daily_challenge/lib/l10n/app_eu_ES.arb | 3 + .../daily_challenge/lib/l10n/app_fa.arb | 3 + .../daily_challenge/lib/l10n/app_fi.arb | 3 + .../daily_challenge/lib/l10n/app_fi_FI.arb | 3 + .../daily_challenge/lib/l10n/app_fil.arb | 3 + .../daily_challenge/lib/l10n/app_fr.arb | 3 + .../daily_challenge/lib/l10n/app_fr_CA.arb | 3 + .../daily_challenge/lib/l10n/app_fr_FR.arb | 3 + .../daily_challenge/lib/l10n/app_gl.arb | 3 + .../daily_challenge/lib/l10n/app_gl_ES.arb | 3 + .../daily_challenge/lib/l10n/app_gu.arb | 3 + .../daily_challenge/lib/l10n/app_he.arb | 3 + .../daily_challenge/lib/l10n/app_he_IL.arb | 3 + .../daily_challenge/lib/l10n/app_hi.arb | 3 + .../daily_challenge/lib/l10n/app_hi_IN.arb | 3 + .../daily_challenge/lib/l10n/app_hr.arb | 3 + .../daily_challenge/lib/l10n/app_hu.arb | 3 + .../daily_challenge/lib/l10n/app_hu_HU.arb | 3 + .../daily_challenge/lib/l10n/app_hy.arb | 3 + .../daily_challenge/lib/l10n/app_hy_AM.arb | 3 + .../daily_challenge/lib/l10n/app_id.arb | 3 + .../daily_challenge/lib/l10n/app_is.arb | 3 + .../daily_challenge/lib/l10n/app_is_IS.arb | 3 + .../daily_challenge/lib/l10n/app_it.arb | 3 + .../daily_challenge/lib/l10n/app_it_IT.arb | 3 + .../daily_challenge/lib/l10n/app_ja.arb | 3 + .../daily_challenge/lib/l10n/app_ja_JP.arb | 3 + .../daily_challenge/lib/l10n/app_ka.arb | 3 + .../daily_challenge/lib/l10n/app_ka_GE.arb | 3 + .../daily_challenge/lib/l10n/app_kk.arb | 3 + .../daily_challenge/lib/l10n/app_km.arb | 3 + .../daily_challenge/lib/l10n/app_km_KH.arb | 3 + .../daily_challenge/lib/l10n/app_kn.arb | 3 + .../daily_challenge/lib/l10n/app_kn_IN.arb | 3 + .../daily_challenge/lib/l10n/app_ko.arb | 3 + .../daily_challenge/lib/l10n/app_ko_KR.arb | 3 + .../daily_challenge/lib/l10n/app_ky.arb | 3 + .../daily_challenge/lib/l10n/app_ky_KG.arb | 3 + .../daily_challenge/lib/l10n/app_lo.arb | 3 + .../daily_challenge/lib/l10n/app_lo_LA.arb | 3 + .../daily_challenge/lib/l10n/app_lt.arb | 3 + .../daily_challenge/lib/l10n/app_lv.arb | 3 + .../daily_challenge/lib/l10n/app_mk.arb | 3 + .../daily_challenge/lib/l10n/app_mk_MK.arb | 3 + .../daily_challenge/lib/l10n/app_ml.arb | 3 + .../daily_challenge/lib/l10n/app_ml_IN.arb | 3 + .../daily_challenge/lib/l10n/app_mn.arb | 3 + .../daily_challenge/lib/l10n/app_mn_MN.arb | 3 + .../daily_challenge/lib/l10n/app_mr.arb | 3 + .../daily_challenge/lib/l10n/app_mr_IN.arb | 3 + .../daily_challenge/lib/l10n/app_ms.arb | 3 + .../daily_challenge/lib/l10n/app_ms_MY.arb | 3 + .../daily_challenge/lib/l10n/app_my.arb | 3 + .../daily_challenge/lib/l10n/app_my_MM.arb | 3 + .../daily_challenge/lib/l10n/app_nb.arb | 3 + .../daily_challenge/lib/l10n/app_nb_NO.arb | 3 + .../daily_challenge/lib/l10n/app_ne.arb | 3 + .../daily_challenge/lib/l10n/app_ne_NP.arb | 3 + .../daily_challenge/lib/l10n/app_nl.arb | 3 + .../daily_challenge/lib/l10n/app_nl_NL.arb | 3 + .../daily_challenge/lib/l10n/app_pa.arb | 3 + .../daily_challenge/lib/l10n/app_pl.arb | 3 + .../daily_challenge/lib/l10n/app_pl_PL.arb | 3 + .../daily_challenge/lib/l10n/app_pt.arb | 3 + .../daily_challenge/lib/l10n/app_pt_BR.arb | 3 + .../daily_challenge/lib/l10n/app_pt_PT.arb | 3 + .../daily_challenge/lib/l10n/app_ro.arb | 3 + .../daily_challenge/lib/l10n/app_ru.arb | 3 + .../daily_challenge/lib/l10n/app_ru_RU.arb | 3 + .../daily_challenge/lib/l10n/app_si.arb | 3 + .../daily_challenge/lib/l10n/app_si_LK.arb | 3 + .../daily_challenge/lib/l10n/app_sk.arb | 3 + .../daily_challenge/lib/l10n/app_sl.arb | 3 + .../daily_challenge/lib/l10n/app_sq.arb | 3 + .../daily_challenge/lib/l10n/app_sr.arb | 3 + .../daily_challenge/lib/l10n/app_sv.arb | 3 + .../daily_challenge/lib/l10n/app_sv_SE.arb | 3 + .../daily_challenge/lib/l10n/app_sw.arb | 3 + .../daily_challenge/lib/l10n/app_ta.arb | 3 + .../daily_challenge/lib/l10n/app_ta_IN.arb | 3 + .../daily_challenge/lib/l10n/app_te.arb | 3 + .../daily_challenge/lib/l10n/app_te_IN.arb | 3 + .../daily_challenge/lib/l10n/app_th.arb | 3 + .../daily_challenge/lib/l10n/app_tl.arb | 3 + .../daily_challenge/lib/l10n/app_tr.arb | 3 + .../daily_challenge/lib/l10n/app_tr_TR.arb | 3 + .../daily_challenge/lib/l10n/app_uk.arb | 3 + .../daily_challenge/lib/l10n/app_ur.arb | 3 + .../daily_challenge/lib/l10n/app_vi.arb | 3 + .../daily_challenge/lib/l10n/app_zh.arb | 3 + .../daily_challenge/lib/l10n/app_zh_CN.arb | 3 + .../daily_challenge/lib/l10n/app_zh_HK.arb | 3 + .../daily_challenge/lib/l10n/app_zh_TW.arb | 3 + .../daily_challenge/lib/l10n/app_zu.arb | 3 + .../lib/l10n/generated/app_localizations.dart | 673 +++++++ .../l10n/generated/app_localizations_af.dart | 23 + .../l10n/generated/app_localizations_am.dart | 23 + .../l10n/generated/app_localizations_ar.dart | 23 + .../l10n/generated/app_localizations_az.dart | 30 + .../l10n/generated/app_localizations_be.dart | 23 + .../l10n/generated/app_localizations_bg.dart | 23 + .../l10n/generated/app_localizations_bn.dart | 30 + .../l10n/generated/app_localizations_ca.dart | 23 + .../l10n/generated/app_localizations_cs.dart | 30 + .../l10n/generated/app_localizations_da.dart | 30 + .../l10n/generated/app_localizations_de.dart | 30 + .../l10n/generated/app_localizations_el.dart | 30 + .../l10n/generated/app_localizations_en.dart | 23 + .../l10n/generated/app_localizations_es.dart | 44 + .../l10n/generated/app_localizations_et.dart | 23 + .../l10n/generated/app_localizations_eu.dart | 30 + .../l10n/generated/app_localizations_fa.dart | 23 + .../l10n/generated/app_localizations_fi.dart | 30 + .../l10n/generated/app_localizations_fil.dart | 23 + .../l10n/generated/app_localizations_fr.dart | 37 + .../l10n/generated/app_localizations_gl.dart | 30 + .../l10n/generated/app_localizations_gu.dart | 23 + .../l10n/generated/app_localizations_he.dart | 30 + .../l10n/generated/app_localizations_hi.dart | 30 + .../l10n/generated/app_localizations_hr.dart | 23 + .../l10n/generated/app_localizations_hu.dart | 30 + .../l10n/generated/app_localizations_hy.dart | 30 + .../l10n/generated/app_localizations_id.dart | 23 + .../l10n/generated/app_localizations_is.dart | 30 + .../l10n/generated/app_localizations_it.dart | 30 + .../l10n/generated/app_localizations_ja.dart | 30 + .../l10n/generated/app_localizations_ka.dart | 30 + .../l10n/generated/app_localizations_kk.dart | 23 + .../l10n/generated/app_localizations_km.dart | 30 + .../l10n/generated/app_localizations_kn.dart | 30 + .../l10n/generated/app_localizations_ko.dart | 30 + .../l10n/generated/app_localizations_ky.dart | 30 + .../l10n/generated/app_localizations_lo.dart | 30 + .../l10n/generated/app_localizations_lt.dart | 23 + .../l10n/generated/app_localizations_lv.dart | 23 + .../l10n/generated/app_localizations_mk.dart | 30 + .../l10n/generated/app_localizations_ml.dart | 30 + .../l10n/generated/app_localizations_mn.dart | 30 + .../l10n/generated/app_localizations_mr.dart | 30 + .../l10n/generated/app_localizations_ms.dart | 30 + .../l10n/generated/app_localizations_my.dart | 30 + .../l10n/generated/app_localizations_nb.dart | 30 + .../l10n/generated/app_localizations_ne.dart | 30 + .../l10n/generated/app_localizations_nl.dart | 30 + .../l10n/generated/app_localizations_pa.dart | 23 + .../l10n/generated/app_localizations_pl.dart | 30 + .../l10n/generated/app_localizations_pt.dart | 37 + .../l10n/generated/app_localizations_ro.dart | 23 + .../l10n/generated/app_localizations_ru.dart | 30 + .../l10n/generated/app_localizations_si.dart | 30 + .../l10n/generated/app_localizations_sk.dart | 23 + .../l10n/generated/app_localizations_sl.dart | 23 + .../l10n/generated/app_localizations_sq.dart | 23 + .../l10n/generated/app_localizations_sr.dart | 23 + .../l10n/generated/app_localizations_sv.dart | 30 + .../l10n/generated/app_localizations_sw.dart | 23 + .../l10n/generated/app_localizations_ta.dart | 30 + .../l10n/generated/app_localizations_te.dart | 30 + .../l10n/generated/app_localizations_th.dart | 23 + .../l10n/generated/app_localizations_tl.dart | 23 + .../l10n/generated/app_localizations_tr.dart | 30 + .../l10n/generated/app_localizations_uk.dart | 23 + .../l10n/generated/app_localizations_ur.dart | 23 + .../l10n/generated/app_localizations_vi.dart | 23 + .../l10n/generated/app_localizations_zh.dart | 44 + .../l10n/generated/app_localizations_zu.dart | 23 + .../lib/l10n/localizations/app_strings.dart | 20 + .../lib/mgr/daily_challenge_manager.dart | 298 +++ .../lib/router/daily_challenge_routes.dart | 91 + .../aware/daily_challenge_aware.dart | 24 + .../lib/ui/pages/award/trophy_decoration.dart | 40 + .../award/trophy_exhibit_controller.dart | 46 + .../ui/pages/award/trophy_exhibit_widget.dart | 248 +++ .../pages/award/trophy_exhibit_widget.g.dart | 121 ++ .../challenge_calendar_controller.dart | 297 +++ .../calendar/challenge_calendar_page.dart | 696 +++++++ .../calendar/challenge_calendar_page.g.dart | 220 +++ .../congratulations/congratulations_page.dart | 264 +++ .../congratulations_page.g.dart | 121 ++ guru_ui/packages/daily_challenge/pubspec.yaml | 106 ++ .../test/daily_challenge_test.dart | 12 + guru_ui/packages/design/.gitignore | 29 + guru_ui/packages/design/CHANGELOG.md | 3 + guru_ui/packages/design/LICENSE | 1 + guru_ui/packages/design/README.md | 39 + guru_ui/packages/design/analysis_options.yaml | 4 + guru_ui/packages/design/lib/design.dart | 28 + guru_ui/packages/design/lib/design_field.dart | 155 ++ .../packages/design/lib/design_metrics.dart | 355 ++++ .../packages/design/lib/design_offset.dart | 24 + guru_ui/packages/design/lib/design_rect.dart | 167 ++ guru_ui/packages/design/lib/design_size.dart | 92 + .../design/lib/design_spec_model.dart | 15 + guru_ui/packages/design/pubspec.yaml | 65 + guru_ui/packages/design/test/design_test.dart | 7 + guru_ui/packages/design_generator/.gitignore | 29 + .../packages/design_generator/CHANGELOG.md | 3 + guru_ui/packages/design_generator/LICENSE | 1 + guru_ui/packages/design_generator/README.md | 39 + .../design_generator/analysis_options.yaml | 4 + guru_ui/packages/design_generator/build.yaml | 10 + .../lib/design_generator.dart | 6 + .../design_generator/lib/src/generator.dart | 712 +++++++ .../design_generator/lib/src/hash.dart | 40 + .../design_generator/lib/src/tuple.dart | 413 ++++ .../packages/design_generator/pubspec.yaml | 72 + .../test/design_generator_test.dart | 5 + guru_ui/packages/design_spec/.gitignore | 29 + guru_ui/packages/design_spec/CHANGELOG.md | 3 + guru_ui/packages/design_spec/LICENSE | 1 + guru_ui/packages/design_spec/README.md | 39 + .../design_spec/analysis_options.yaml | 4 + .../design_spec/lib/design_annotations.dart | 278 +++ .../packages/design_spec/lib/design_spec.dart | 3 + guru_ui/packages/design_spec/pubspec.yaml | 55 + .../design_spec/test/design_spec_test.dart | 7 + guru_ui/packages/guru_popup/.gitignore | 30 + guru_ui/packages/guru_popup/CHANGELOG.md | 3 + guru_ui/packages/guru_popup/LICENSE | 1 + guru_ui/packages/guru_popup/README.md | 39 + .../packages/guru_popup/analysis_options.yaml | 4 + .../guru_popup/assets/images/iap_received.png | Bin 0 -> 12141 bytes guru_ui/packages/guru_popup/l10n.yaml | 5 + .../guru_popup/lib/dialog/dialog_aware.dart | 517 +++++ .../packages/guru_popup/lib/guru_popup.dart | 32 + .../lib/localizations/l10n/app_en.arb | 9 + .../l10n/generated/app_localizations.dart | 160 ++ .../l10n/generated/app_localizations_en.dart | 24 + .../lib/localizations/popup_strings.dart | 16 + .../guru_popup/lib/overlay/banner/banner.dart | 64 + .../lib/overlay/banner/banner.g.dart | 58 + .../guru_popup/lib/overlay/overlay_aware.dart | 386 ++++ .../guru_popup/lib/overlay/tips/tips.dart | 19 + .../lib/overlay/tips/tips_clipper.dart | 60 + .../lib/overlay/tips/tips_painter.dart | 55 + .../lib/overlay/tips/tips_widget.dart | 65 + .../guru_popup/lib/package/popup_package.dart | 17 + .../guru_popup/lib/toast/toast_aware.dart | 183 ++ guru_ui/packages/guru_popup/pubspec.yaml | 104 + .../guru_popup/test/guru_popup_test.dart | 8 + guru_ui/packages/guru_rating/.gitignore | 30 + guru_ui/packages/guru_rating/CHANGELOG.md | 3 + guru_ui/packages/guru_rating/LICENSE | 1 + guru_ui/packages/guru_rating/README.md | 23 + .../guru_rating/analysis_options.yaml | 4 + .../guru_rating/lib/core/dialog_utils.dart | 174 ++ .../packages/guru_rating/lib/core/mixins.dart | 19 + .../packages/guru_rating/lib/core/models.dart | 34 + .../guru_rating/lib/core/rating_guide.dart | 184 ++ .../guru_rating/lib/core/rating_property.dart | 24 + .../packages/guru_rating/lib/guru_rating.dart | 14 + .../lib/page/going_store_design_spec.dart | 40 + .../lib/page/going_store_design_spec.g.dart | 127 ++ .../lib/page/going_store_loading_page.dart | 75 + .../lib/page/ios_thankyou_design_spec.dart | 72 + .../lib/page/ios_thankyou_design_spec.g.dart | 174 ++ .../lib/page/ios_thankyou_page.dart | 143 ++ .../lib/page/rating_design_spec.dart | 123 ++ .../lib/page/rating_design_spec.g.dart | 319 ++++ .../guru_rating/lib/page/rating_page.dart | 368 ++++ .../guru_rating/lib/page/rating_result.dart | 15 + .../guru_rating/lib/page/rating_style.dart | 231 +++ .../guru_rating/lib/ratingbar/rating_bar.dart | 499 +++++ .../lib/ratingbar/rating_bar_indicator.dart | 187 ++ guru_ui/packages/guru_rating/pubspec.yaml | 82 + .../guru_rating/test/guru_rating_test.dart | 5 + guru_ui/packages/guru_widgets/.gitignore | 30 + guru_ui/packages/guru_widgets/CHANGELOG.md | 3 + guru_ui/packages/guru_widgets/LICENSE | 1 + guru_ui/packages/guru_widgets/README.md | 39 + .../guru_widgets/analysis_options.yaml | 4 + .../guru_widgets/assets/images/ic_close.png | Bin 0 -> 1155 bytes .../assets/images/pic_success.png | Bin 0 -> 792 bytes .../guru_widgets/assets/lottie/fail.json | 1 + .../guru_widgets/assets/lottie/loading.json | 1 + .../assets/lottie/successful.json | 1 + guru_ui/packages/guru_widgets/l10n.yaml | 5 + .../lottie/composition_provider.dart | 13 + .../animation/lottie/lottie_controller.dart | 88 + .../lib/animation/lottie/lottie_widget.dart | 193 ++ .../standard/animated_transform_builder.dart | 215 +++ .../standard/animated_transform_widget.dart | 232 +++ .../lib/animation/standard/animator.dart | 284 +++ .../standard/curved_offset_animation.dart | 130 ++ .../lib/animation/standard/curves_ext.dart | 125 ++ .../lib/animation/standard/popup_widget.dart | 36 + .../standard/transform_animation.dart | 19 + .../guru_widgets/lib/appbar/guru_app_bar.dart | 182 ++ .../lib/appbar/guru_app_bar.g.dart | 102 + .../lib/assetbar/guru_asset_bar.dart | 445 +++++ .../lib/assetbar/guru_asset_bar.g.dart | 188 ++ .../lib/banner/purchase_banner.dart | 301 +++ .../lib/banner/purchase_banner.g.dart | 188 ++ .../lib/button/circle_button.dart | 40 + .../guru_widgets/lib/button/guru_button.dart | 455 +++++ .../lib/button/guru_button.g.dart | 412 ++++ .../lib/button/purchase_button.dart | 61 + .../lib/button/single_tap_inkwell.dart | 44 + .../lib/button/single_tap_widget.dart | 75 + .../common/custom_rrect_tab_indicator.dart | 87 + .../guru_widgets/lib/common/divider.dart | 101 + .../lib/common/flexible_container.dart | 87 + .../lib/common/keep_screen_on_widget.dart | 38 + .../lib/common/layout_widget.dart | 95 + .../guru_widgets/lib/common/spacer.dart | 18 + .../guru_widgets/lib/dialog/guru_dialog.dart | 1450 ++++++++++++++ .../lib/dialog/guru_dialog.g.dart | 821 ++++++++ .../lib/gem_overlay/guru_gem_overlay.dart | 158 ++ .../guru_widgets/lib/guru_widgets.dart | 21 + .../lib/image/adaptive_image.dart | 220 +++ .../lib/localizations/l10n/app_en.arb | 9 + .../l10n/generated/app_localizations.dart | 160 ++ .../l10n/generated/app_localizations_en.dart | 24 + .../lib/localizations/widgets_strings.dart | 16 + .../navigationbar/guru_navigation_bar.dart | 291 +++ .../navigationbar/guru_navigation_bar.g.dart | 98 + .../lib/overlay/asset/asset_background.dart | 68 + .../lib/overlay/asset/asset_reward.dart | 223 +++ .../lib/overlay/asset/asset_text.dart | 98 + .../guru_widgets/lib/overlay/guru_asset.dart | 39 + .../lib/overlay/guru_asset_controller.dart | 81 + .../lib/overlay/guru_loading.dart | 613 ++++++ .../lib/overlay/guru_loading.g.dart | 334 ++++ .../lib/pages/awards/guru_awards_page.dart | 100 + .../lib/pages/awards/guru_awards_page.g.dart | 57 + .../navigation/guru_navigation_page.dart | 99 + .../navigation/guru_navigation_page.g.dart | 48 + .../pages/settings/guru_settings_page.dart | 760 ++++++++ .../pages/settings/guru_settings_page.g.dart | 72 + .../lib/pages/webview/guru_webview_page.dart | 114 ++ .../lib/sliderbar/guru_slider_bar.dart | 290 +++ .../lib/sliderbar/guru_slider_bar.g.dart | 94 + .../guru_widgets/lib/tabbar/guru_tab_bar.dart | 320 ++++ .../lib/tabbar/guru_tab_bar.g.dart | 96 + .../guru_widgets/lib/theme/guru_theme.dart | 408 ++++ .../guru_widgets/lib/theme/guru_theme.g.dart | 152 ++ .../guru_widgets/lib/tile/guru_list_tile.dart | 520 +++++ .../lib/tile/guru_list_tile.g.dart | 155 ++ .../guru_widgets/lib/toast/guru_toast.dart | 27 + guru_ui/packages/guru_widgets/pubspec.yaml | 130 ++ .../guru_widgets/test/guru_widgets_test.dart | 12 + guru_ui/pubspec.lock | 1522 +++++++++++++++ guru_ui/pubspec.yaml | 139 ++ guru_ui/test/guru_ui_test.dart | 12 + guru_ui/upgrade.py | 35 + 1983 files changed, 131180 insertions(+) create mode 100644 guru_app/.github/release.yaml create mode 100644 guru_app/.github/workflows/github-project-issue-to-sheets.yaml create mode 100644 guru_app/.gitignore create mode 100644 guru_app/CHANGELOG.md create mode 100644 guru_app/LICENSE create mode 100644 guru_app/README.md create mode 100644 guru_app/analysis_options.yaml create mode 100644 guru_app/flavors/spider/guru_spec.yaml create mode 100644 guru_app/guru/guru_spec.yaml create mode 100644 guru_app/guru/spider/guru_spec.yaml create mode 100644 guru_app/lib/account/account_auth_extension.dart create mode 100644 guru_app/lib/account/account_data_store.dart create mode 100644 guru_app/lib/account/account_manager.dart create mode 100644 guru_app/lib/account/account_service_extension.dart create mode 100644 guru_app/lib/account/model/account.dart create mode 100644 guru_app/lib/account/model/account_profile.dart create mode 100644 guru_app/lib/account/model/account_profile.g.dart create mode 100644 guru_app/lib/account/model/user.dart create mode 100644 guru_app/lib/account/model/user.g.dart create mode 100644 guru_app/lib/ads/ads_global_property.dart create mode 100644 guru_app/lib/ads/ads_manager.dart create mode 100644 guru_app/lib/ads/applovin/banner/applovin_banner_ads.dart create mode 100644 guru_app/lib/ads/applovin/interstitial/applovin_interstitial_ads.dart create mode 100644 guru_app/lib/ads/applovin/rewarded/applovin_rewarded_ads.dart create mode 100644 guru_app/lib/ads/core/ads.dart create mode 100644 guru_app/lib/ads/core/ads_config.dart create mode 100644 guru_app/lib/ads/core/ads_config.g.dart create mode 100644 guru_app/lib/ads/core/ads_impression.dart create mode 100644 guru_app/lib/ads/core/banner/banner_ads.dart create mode 100644 guru_app/lib/ads/core/banner/banner_ads_handler.dart create mode 100644 guru_app/lib/ads/core/exceptions/ads_exceptions.dart create mode 100644 guru_app/lib/ads/core/handler/ads_audit.dart create mode 100644 guru_app/lib/ads/core/handler/ads_cache.dart create mode 100644 guru_app/lib/ads/core/interstitial/interstitial_ads.dart create mode 100644 guru_app/lib/ads/core/interstitial/interstitial_ads_handler.dart create mode 100644 guru_app/lib/ads/core/rewards/rewarded_ads.dart create mode 100644 guru_app/lib/ads/core/rewards/rewarded_ads_handler.dart create mode 100644 guru_app/lib/ads/core/strategy/ad_unit.dart create mode 100644 guru_app/lib/ads/core/strategy/handler/ad_unit_cache.dart create mode 100644 guru_app/lib/ads/core/strategy/interstitial/max_interstitial_ad_unit.dart create mode 100644 guru_app/lib/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart create mode 100644 guru_app/lib/ads/core/strategy/strategy_ads.dart create mode 100644 guru_app/lib/ads/utils/ads_cpm_calibration.dart create mode 100644 guru_app/lib/ads/utils/ads_exception.dart create mode 100644 guru_app/lib/aigc/bi/ai_bi.dart create mode 100644 guru_app/lib/analytics/data/analytics_model.dart create mode 100644 guru_app/lib/analytics/data/analytics_model.g.dart create mode 100644 guru_app/lib/analytics/guru_analytics.dart create mode 100644 guru_app/lib/analytics/modules/adjust_aware.dart create mode 100644 guru_app/lib/analytics/modules/ads_analytics.dart create mode 100644 guru_app/lib/analytics/strategy/guru_analytics_strategy.dart create mode 100644 guru_app/lib/api/custom_transformer.dart create mode 100644 guru_app/lib/api/data/orders/orders_model.dart create mode 100644 guru_app/lib/api/data/orders/orders_model.g.dart create mode 100644 guru_app/lib/api/guru_api.dart create mode 100644 guru_app/lib/api/guru_api.g.dart create mode 100644 guru_app/lib/api/modules/guru_api_extension.dart create mode 100644 guru_app/lib/app/app_models.dart create mode 100644 guru_app/lib/app/app_models.g.dart create mode 100644 guru_app/lib/controller/account_aware.dart create mode 100644 guru_app/lib/controller/assets_aware.dart create mode 100644 guru_app/lib/controller/gems_controller.dart create mode 100644 guru_app/lib/database/creators/creators.dart create mode 100644 guru_app/lib/database/guru_db.dart create mode 100644 guru_app/lib/database/migrations/migration_v1_to_v2.dart create mode 100644 guru_app/lib/database/migrations/migration_v2_to_v3.dart create mode 100644 guru_app/lib/database/migrations/migrations.dart create mode 100644 guru_app/lib/financial/asset/assets_model.dart create mode 100644 guru_app/lib/financial/asset/assets_store.dart create mode 100644 guru_app/lib/financial/data/db/order_database.dart create mode 100644 guru_app/lib/financial/data/db/order_database.g.dart create mode 100644 guru_app/lib/financial/data/models/orders/orders_model.dart create mode 100644 guru_app/lib/financial/data/models/orders/orders_model.g.dart create mode 100644 guru_app/lib/financial/financial_manager.dart create mode 100644 guru_app/lib/financial/iap/iap_manager.dart create mode 100644 guru_app/lib/financial/iap/iap_model.dart create mode 100644 guru_app/lib/financial/iap/ios/in_app_receipt_ios.dart create mode 100644 guru_app/lib/financial/iap/ios/in_app_receipt_ios.g.dart create mode 100644 guru_app/lib/financial/iap/ios/receipt_validator_ios.dart create mode 100644 guru_app/lib/financial/igc/igc_manager.dart create mode 100644 guru_app/lib/financial/igc/igc_model.dart create mode 100644 guru_app/lib/financial/manifest/manifest.dart create mode 100644 guru_app/lib/financial/manifest/manifest_manager.dart create mode 100644 guru_app/lib/financial/product/ids/product_ids.dart create mode 100644 guru_app/lib/financial/product/product_model.dart create mode 100644 guru_app/lib/financial/product/product_profile.dart create mode 100644 guru_app/lib/financial/product/product_store.dart create mode 100644 guru_app/lib/financial/reward/reward_manager.dart create mode 100644 guru_app/lib/financial/reward/reward_model.dart create mode 100644 guru_app/lib/firebase/dxlinks/dxlink_manager.dart create mode 100644 guru_app/lib/firebase/firebase.dart create mode 100644 guru_app/lib/firebase/firestore/account/account_extension.dart create mode 100644 guru_app/lib/firebase/firestore/firestore_manager.dart create mode 100644 guru_app/lib/firebase/messaging/remote_messaging_manager.dart create mode 100644 guru_app/lib/firebase/remoteconfig/remote_config_interface.dart create mode 100644 guru_app/lib/firebase/remoteconfig/remote_config_manager.dart create mode 100644 guru_app/lib/firebase/remoteconfig/remote_config_reserved_constants.dart create mode 100644 guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.dart create mode 100644 guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.g.dart create mode 100644 guru_app/lib/generated/intl/messages_all.dart create mode 100644 guru_app/lib/generated/intl/messages_en.dart create mode 100644 guru_app/lib/generated/l10n.dart create mode 100644 guru_app/lib/guru_app.dart create mode 100644 guru_app/lib/hook/hook_manager.dart create mode 100644 guru_app/lib/l10n/intl_en.arb create mode 100644 guru_app/lib/lifecycle/lifecycle_model.dart create mode 100644 guru_app/lib/property/app_property.dart create mode 100644 guru_app/lib/property/modules/account_property_extension.dart create mode 100644 guru_app/lib/property/modules/analytics_property_extension.dart create mode 100644 guru_app/lib/property/modules/default_property_extension.dart create mode 100644 guru_app/lib/property/modules/iap_property_extension.dart create mode 100644 guru_app/lib/property/modules/igc_property_extension.dart create mode 100644 guru_app/lib/property/property_keys.dart create mode 100644 guru_app/lib/property/property_tags.dart create mode 100644 guru_app/lib/property/runtime_property.dart create mode 100644 guru_app/lib/property/settings/global_settings.dart create mode 100644 guru_app/lib/property/settings/guru_settings.dart create mode 100644 guru_app/lib/test/test_guru_app_creator.dart create mode 100644 guru_app/lib/test/test_guru_app_creator.g.dart create mode 100644 guru_app/lib/utils/guru_file_utils_extension.dart create mode 100644 guru_app/packages/guru_assistant/.gitignore create mode 100644 guru_app/packages/guru_assistant/CHANGELOG.md create mode 100644 guru_app/packages/guru_assistant/LICENSE create mode 100644 guru_app/packages/guru_assistant/README.md create mode 100644 guru_app/packages/guru_assistant/analysis_options.yaml create mode 100644 guru_app/packages/guru_assistant/example/.gitignore create mode 100644 guru_app/packages/guru_assistant/example/README.md create mode 100644 guru_app/packages/guru_assistant/example/analysis_options.yaml create mode 100644 guru_app/packages/guru_assistant/example/android/.gitignore create mode 100644 guru_app/packages/guru_assistant/example/android/app/build.gradle create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/kotlin/guru/app/example/example/MainActivity.kt create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/packages/guru_assistant/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/packages/guru_assistant/example/android/build.gradle create mode 100644 guru_app/packages/guru_assistant/example/android/gradle.properties create mode 100644 guru_app/packages/guru_assistant/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/packages/guru_assistant/example/android/settings.gradle create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Black.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Bold.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-ExtraBold.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-ExtraLight.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Light.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Medium.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Regular.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-SemiBold.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Thin.ttf create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_ads.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_arrow_right.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_check.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_close.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_coin.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/ic_illustration.png create mode 100644 guru_app/packages/guru_assistant/example/assets/images/remove_ads.png create mode 100644 guru_app/packages/guru_assistant/example/ios/.gitignore create mode 100644 guru_app/packages/guru_assistant/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/packages/guru_assistant/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/packages/guru_assistant/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/packages/guru_assistant/example/ios/Podfile create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Info.plist create mode 100644 guru_app/packages/guru_assistant/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/packages/guru_assistant/example/lib/data/app_details.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/constants.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/database/debug_db.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/initializer.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/initializer.g.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/settings/ads_debug_settings.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/settings/assistant_settings.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/data/settings/debug_settings.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/generated/assets.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/main.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/ads_debug_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/ads_debug_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/ads_debug_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/ads_debug_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/test/test_ads_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/test/test_ads_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/test/test_ads_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/ads/test/test_ads_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/data/data_debug_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/data/data_debug_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/data/data_debug_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/data/data_debug_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/debug_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/debug_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/debug_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/debug/debug_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/root/roor_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/root/root_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/root/root_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/root/root_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/settings/settings_binding.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/settings/settings_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/settings/settings_model.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/pages/settings/settings_view.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/route/app_pages.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/route/router.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/route/routes.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/theme/example_theme.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/widgets/console_button/console_button.dart create mode 100644 guru_app/packages/guru_assistant/example/lib/widgets/console_button/console_button_controller.dart create mode 100644 guru_app/packages/guru_assistant/example/pubspec.lock create mode 100644 guru_app/packages/guru_assistant/example/pubspec.yaml create mode 100644 guru_app/packages/guru_assistant/example/test/widget_test.dart create mode 100644 guru_app/packages/guru_assistant/lib/console/console.dart create mode 100644 guru_app/packages/guru_assistant/lib/console/console_button.dart create mode 100644 guru_app/packages/guru_assistant/lib/console/console_button_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/console/vm_helper.dart create mode 100644 guru_app/packages/guru_assistant/lib/core/model.dart create mode 100644 guru_app/packages/guru_assistant/lib/core/property_keys.dart create mode 100644 guru_app/packages/guru_assistant/lib/data/setting.dart create mode 100644 guru_app/packages/guru_assistant/lib/dialog/editor/editor_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/dialog/editor/editor_design_model.dart create mode 100644 guru_app/packages/guru_assistant/lib/dialog/editor/editor_design_model.g.dart create mode 100644 guru_app/packages/guru_assistant/lib/dialog/editor/editor_dialog.dart create mode 100644 guru_app/packages/guru_assistant/lib/guru_assistant.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/account/account_debug_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/account/account_dubug_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/ads_debug_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/ads_test/ads_test_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/ads_test/ads_test_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/ads_test/keywords_test_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/ads_test/keywords_test_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/assets/assets_debug_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/assets/assets_dubug_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/data_viewer_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/guru_debug_page.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_design_model.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_design_model.g.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_dialog.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_dialog_controller.dart create mode 100644 guru_app/packages/guru_assistant/lib/ui/visual/visual_debug_page.dart create mode 100644 guru_app/packages/guru_assistant/pubspec.lock create mode 100644 guru_app/packages/guru_assistant/pubspec.yaml create mode 100644 guru_app/packages/guru_assistant/test/guru_assistant_test.dart create mode 100644 guru_app/packages/guru_spec/.gitignore create mode 100644 guru_app/packages/guru_spec/CHANGELOG.md create mode 100644 guru_app/packages/guru_spec/LICENSE create mode 100644 guru_app/packages/guru_spec/README.md create mode 100644 guru_app/packages/guru_spec/analysis_options.yaml create mode 100644 guru_app/packages/guru_spec/build.yaml create mode 100644 guru_app/packages/guru_spec/lib/guru_spec.dart create mode 100644 guru_app/packages/guru_spec/lib/guru_spec_generator.dart create mode 100644 guru_app/packages/guru_spec/lib/intelligent_keys_generator.dart create mode 100644 guru_app/packages/guru_spec/lib/src/generator.dart create mode 100644 guru_app/packages/guru_spec/lib/src/guru_spec_generator.dart create mode 100644 guru_app/packages/guru_spec/lib/src/hash.dart create mode 100644 guru_app/packages/guru_spec/lib/src/intelligent_keys_generator.dart create mode 100644 guru_app/packages/guru_spec/lib/src/tuple.dart create mode 100644 guru_app/packages/guru_spec/pubspec.lock create mode 100644 guru_app/packages/guru_spec/pubspec.yaml create mode 100644 guru_app/packages/guru_spec/test/guru_spec_test.dart create mode 100644 guru_app/packages/guru_utils/.gitignore create mode 100644 guru_app/packages/guru_utils/CHANGELOG.md create mode 100644 guru_app/packages/guru_utils/LICENSE create mode 100644 guru_app/packages/guru_utils/README.md create mode 100644 guru_app/packages/guru_utils/analysis_options.yaml create mode 100644 guru_app/packages/guru_utils/lib/ads/ads.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/ads_delegate.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/ads_manager_delegate.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/data/ads_model.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/data/ads_model.g.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/handler/ads_handler.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/utils/ads_cpm_calibration.dart create mode 100644 guru_app/packages/guru_utils/lib/ads/utils/ads_exception.dart create mode 100644 guru_app/packages/guru_utils/lib/aigc/bi/ai_bi.dart create mode 100644 guru_app/packages/guru_utils/lib/analytics/analytics.dart create mode 100644 guru_app/packages/guru_utils/lib/app_ownership/app_ownership_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/audio/audio_bundle.dart create mode 100644 guru_app/packages/guru_utils/lib/audio/audio_effector.dart create mode 100644 guru_app/packages/guru_utils/lib/audio/audio_model.dart create mode 100644 guru_app/packages/guru_utils/lib/audio/sound_pool.dart create mode 100644 guru_app/packages/guru_utils/lib/collection/collectionutils.dart create mode 100644 guru_app/packages/guru_utils/lib/collection/int_array.dart create mode 100644 guru_app/packages/guru_utils/lib/collection/rbtree.dart create mode 100644 guru_app/packages/guru_utils/lib/colors/color_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/ads_controller.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/account/account_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/ads/banner_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/ads/interstitial_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/ads/overlay/ads_overlay.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/ads/rewarded_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/assets/assets_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/controller_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/aware/keep_screen_on_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/base_controller.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/controller.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/gems_controller.dart create mode 100644 guru_app/packages/guru_utils/lib/controller/lifecycle_controller.dart create mode 100644 guru_app/packages/guru_utils/lib/converts/color_convert.dart create mode 100644 guru_app/packages/guru_utils/lib/converts/config_map_convert.dart create mode 100644 guru_app/packages/guru_utils/lib/converts/converts.dart create mode 100644 guru_app/packages/guru_utils/lib/converts/list_joined_string_convert.dart create mode 100644 guru_app/packages/guru_utils/lib/core/ext.dart create mode 100644 guru_app/packages/guru_utils/lib/currency/currency_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/database/batch/batch_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/database/batch/batch_data.dart create mode 100644 guru_app/packages/guru_utils/lib/database/database.dart create mode 100644 guru_app/packages/guru_utils/lib/database/migration.dart create mode 100644 guru_app/packages/guru_utils/lib/datetime/date/date.dart create mode 100644 guru_app/packages/guru_utils/lib/datetime/datespan/datespan.dart create mode 100644 guru_app/packages/guru_utils/lib/datetime/datetime_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/device/device_info.dart create mode 100644 guru_app/packages/guru_utils/lib/device/device_info.g.dart create mode 100644 guru_app/packages/guru_utils/lib/device/device_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/events/event_bus.dart create mode 100644 guru_app/packages/guru_utils/lib/events/models/event.dart create mode 100644 guru_app/packages/guru_utils/lib/events/models/game_event.dart create mode 100644 guru_app/packages/guru_utils/lib/extensions/async_extension.dart create mode 100644 guru_app/packages/guru_utils/lib/extensions/extensions.dart create mode 100644 guru_app/packages/guru_utils/lib/extensions/list_extension.dart create mode 100644 guru_app/packages/guru_utils/lib/extensions/number_extension.dart create mode 100644 guru_app/packages/guru_utils/lib/extensions/string_extension.dart create mode 100644 guru_app/packages/guru_utils/lib/feedback/feedback_manager.dart create mode 100644 guru_app/packages/guru_utils/lib/file/archive_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/file/file_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/guru_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/hash/hash.dart create mode 100644 guru_app/packages/guru_utils/lib/http/http_ex.dart create mode 100644 guru_app/packages/guru_utils/lib/http/http_model.dart create mode 100644 guru_app/packages/guru_utils/lib/id/id_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/id/identifiable.dart create mode 100644 guru_app/packages/guru_utils/lib/image/image_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/lifecycle/lifecycle_manager.dart create mode 100644 guru_app/packages/guru_utils/lib/log/log.dart create mode 100644 guru_app/packages/guru_utils/lib/manifest/manifest.dart create mode 100644 guru_app/packages/guru_utils/lib/manifest/manifest.g.dart create mode 100644 guru_app/packages/guru_utils/lib/math/math_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/network/network_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/number/number_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/number/range.dart create mode 100644 guru_app/packages/guru_utils/lib/packages/guru_package.dart create mode 100644 guru_app/packages/guru_utils/lib/property/app_property.dart create mode 100644 guru_app/packages/guru_utils/lib/property/property.dart create mode 100644 guru_app/packages/guru_utils/lib/property/property_bundle.dart create mode 100644 guru_app/packages/guru_utils/lib/property/property_delegate.dart create mode 100644 guru_app/packages/guru_utils/lib/property/property_key.dart create mode 100644 guru_app/packages/guru_utils/lib/property/property_model.dart create mode 100644 guru_app/packages/guru_utils/lib/property/runtime_property.dart create mode 100644 guru_app/packages/guru_utils/lib/property/settings/settings_data.dart create mode 100644 guru_app/packages/guru_utils/lib/property/storage/db/property_database.dart create mode 100644 guru_app/packages/guru_utils/lib/property/storage/db/property_database.g.dart create mode 100644 guru_app/packages/guru_utils/lib/property/storage/property_storage.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/collect.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/concat.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/countdown_timer.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/enumerate.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/future_stream.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/metronome.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/stream_buffer.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/stream_router.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/async/string.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/cache.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/cache/cache.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/cache/map_cache.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/check.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/bimap.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/delegates/iterable.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/delegates/list.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/delegates/map.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/delegates/queue.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/delegates/set.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/lru_map.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/multimap.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/treeset.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/collection/utils.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/core.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/core/hash.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/core/optional.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/core/utils.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/concat.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/count.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/cycle.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/enumerate.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/generating_iterable.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/infinite_iterable.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/merge.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/min_max.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/partition.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/range.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/iterables/zip.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/pattern.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/strings.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/time.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/time/clock.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/time/duration_unit_constants.dart create mode 100644 guru_app/packages/guru_utils/lib/quiver/time/util.dart create mode 100644 guru_app/packages/guru_utils/lib/random/pseudo_random.dart create mode 100644 guru_app/packages/guru_utils/lib/random/random_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/remote/remote_config.dart create mode 100644 guru_app/packages/guru_utils/lib/router/route_center.dart create mode 100644 guru_app/packages/guru_utils/lib/router/route_matcher.dart create mode 100644 guru_app/packages/guru_utils/lib/router/route_path.dart create mode 100644 guru_app/packages/guru_utils/lib/router/route_recorder.dart create mode 100644 guru_app/packages/guru_utils/lib/router/route_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/router/router.dart create mode 100644 guru_app/packages/guru_utils/lib/router/routing_observer.dart create mode 100644 guru_app/packages/guru_utils/lib/settings/settings.dart create mode 100644 guru_app/packages/guru_utils/lib/settings/utils_settings.dart create mode 100644 guru_app/packages/guru_utils/lib/size/size_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/svg/svg_parser.dart create mode 100644 guru_app/packages/guru_utils/lib/timer/countdown_manager.dart create mode 100644 guru_app/packages/guru_utils/lib/timer/timer.dart create mode 100644 guru_app/packages/guru_utils/lib/timer/timer_scheduler.dart create mode 100644 guru_app/packages/guru_utils/lib/tuple/tuple.dart create mode 100644 guru_app/packages/guru_utils/lib/uri/uri_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/vibration/vibrate_model.dart create mode 100644 guru_app/packages/guru_utils/lib/vibration/vibrate_model.g.dart create mode 100644 guru_app/packages/guru_utils/lib/vibration/vibrate_utils.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/action/frame_action.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/layers/layers.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/layers/render_layer.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/layers/sorting_layer.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/render/render_element.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/render/render_queue.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/render/visual_feast_render.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/sprite/visual_feast_sprite.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/engine/visual_feast_engine.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/keyframe/key_frame.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_animation.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_aware.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_completer.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_looper.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_observer.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_sink.dart create mode 100644 guru_app/packages/guru_utils/lib/visual_feast/visual_feast_widget.dart create mode 100644 guru_app/packages/guru_utils/lib/widget/widget_utils.dart create mode 100644 guru_app/packages/guru_utils/pubspec.yaml create mode 100644 guru_app/packages/guru_utils/test/guru_utils_test.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/CHANGELOG.md create mode 100644 guru_app/plugins/guru_analytics_flutter/LICENSE create mode 100644 guru_app/plugins/guru_analytics_flutter/README.md create mode 100644 guru_app/plugins/guru_analytics_flutter/analysis_options.yaml create mode 100644 guru_app/plugins/guru_analytics_flutter/android/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/android/build.gradle create mode 100644 guru_app/plugins/guru_analytics_flutter/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_analytics_flutter/android/settings.gradle create mode 100644 guru_app/plugins/guru_analytics_flutter/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/android/src/main/kotlin/guru/core/flutter/analytics/guru_analytics_flutter/GuruAnalyticsConstants.kt create mode 100644 guru_app/plugins/guru_analytics_flutter/android/src/main/kotlin/guru/core/flutter/analytics/guru_analytics_flutter/GuruAnalyticsFlutterPlugin.kt create mode 100644 guru_app/plugins/guru_analytics_flutter/example/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/example/README.md create mode 100644 guru_app/plugins/guru_analytics_flutter/example/analysis_options.yaml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/build.gradle create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/kotlin/guru/core/flutter/analytics/guru_analytics_flutter_example/MainActivity.kt create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/build.gradle create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/gradle.properties create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_analytics_flutter/example/android/settings.gradle create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Podfile create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/guru_analytics_flutter/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/guru_analytics_flutter/example/lib/main.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/example/pubspec.lock create mode 100644 guru_app/plugins/guru_analytics_flutter/example/pubspec.yaml create mode 100644 guru_app/plugins/guru_analytics_flutter/example/test/widget_test.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/.gitignore create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/Classes/GuruAnalyticsConstants.swift create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/Classes/GuruAnalyticsFlutterPlugin.h create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/Classes/GuruAnalyticsFlutterPlugin.m create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/Classes/SwiftGuruAnalyticsFlutterPlugin.swift create mode 100644 guru_app/plugins/guru_analytics_flutter/ios/guru_analytics_flutter.podspec create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/event_logger.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/event_logger_common.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/events_constants.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/guru/guru_event_logger.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/guru/guru_statistic.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/lib/guru_analytics_flutter.dart create mode 100644 guru_app/plugins/guru_analytics_flutter/pubspec.lock create mode 100644 guru_app/plugins/guru_analytics_flutter/pubspec.yaml create mode 100644 guru_app/plugins/guru_analytics_flutter/test/guru_analytics_flutter_test.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/CHANGELOG.md create mode 100644 guru_app/plugins/guru_applifecycle_flutter/LICENSE create mode 100644 guru_app/plugins/guru_applifecycle_flutter/README.md create mode 100644 guru_app/plugins/guru_applifecycle_flutter/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/build.gradle create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/settings.gradle create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/src/main/kotlin/flutter/guru/guru_applifecycle_flutter/AppStateNotifier.java create mode 100644 guru_app/plugins/guru_applifecycle_flutter/android/src/main/kotlin/flutter/guru/guru_applifecycle_flutter/GuruApplifecycleFlutterPlugin.kt create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/README.md create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/build.gradle create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/kotlin/flutter/guru/guru_applifecycle_flutter_example/MainActivity.kt create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/build.gradle create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/gradle.properties create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/android/settings.gradle create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Podfile create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Podfile.lock create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/lib/main.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/pubspec.lock create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/pubspec.yaml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/example/test/widget_test.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/.gitignore create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/Classes/AppStateNotifier.h create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/Classes/AppStateNotifier.m create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/Classes/GuruApplifecycleFlutterPlugin.h create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/Classes/GuruApplifecycleFlutterPlugin.m create mode 100644 guru_app/plugins/guru_applifecycle_flutter/ios/guru_applifecycle_flutter.podspec create mode 100644 guru_app/plugins/guru_applifecycle_flutter/lib/guru_applifecycle.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/lib/guru_applifecycle_flutter.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/lib/lifecycle/app_background_event_notifier.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/lib/lifecycle/app_lifecycle_callback.dart create mode 100644 guru_app/plugins/guru_applifecycle_flutter/pubspec.lock create mode 100644 guru_app/plugins/guru_applifecycle_flutter/pubspec.yaml create mode 100644 guru_app/plugins/guru_applifecycle_flutter/test/guru_applifecycle_flutter_test.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/CHANGELOG.md create mode 100644 guru_app/plugins/guru_applovin_flutter/LICENSE create mode 100644 guru_app/plugins/guru_applovin_flutter/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/android/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/android/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/android/gradle.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/android/settings.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/AdHelp.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/AdStatus.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/BannerAd.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/GuruApplovin.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/GuruApplovinFlutterPlugin.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/InterstitialAd.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/RewardedVideoAd.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/log/Formatter.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/log/Logger.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/android/src/main/kotlin/flutter/guru/guru_applovin_flutter/log/SystemProperties.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/example/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/example/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/example/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/kotlin/flutter/guru/guru_applovin_flutter_example/MainActivity.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/gradle.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/example/android/settings.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Podfile create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Podfile.lock create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/guru_applovin_flutter/example/lib/main.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/example/pubspec.lock create mode 100644 guru_app/plugins/guru_applovin_flutter/example/pubspec.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/example/test/widget_test.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/AdHelper.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/AdStatus.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/BannerAd.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/GDPR/Gdpr.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/GDPR/UIViewControllerExtensions.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/GuruApplovinFlutterPlugin.h create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/GuruApplovinFlutterPlugin.m create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/InterstitialAd.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/RewardedVideoAd.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/Classes/SwiftGuruApplovinFlutterPlugin.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/ios/guru_applovin_flutter.podspec create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/ad_impression.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/banner_ad.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/gdpr/gdpr_models.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/guru_applovin_flutter.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/interstitial_ad.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/lib/rewarded_video_ad.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/CHANGELOG.md create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/LICENSE create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/android/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/android/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/android/settings.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/android/src/main/kotlin/guru/core/ads/max/max_yandex_adapter/MaxYandexAdapterPlugin.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/analysis_options.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/kotlin/guru/core/ads/max/max_yandex_adapter_example/MainActivity.kt create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/build.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/gradle.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/android/settings.gradle create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Podfile create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/lib/main.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/pubspec.lock create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/pubspec.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/example/test/widget_test.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/.gitignore create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/Classes/MaxYandexAdapterPlugin.h create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/Classes/MaxYandexAdapterPlugin.m create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/Classes/SwiftMaxYandexAdapterPlugin.swift create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/ios/max_yandex_adapter.podspec create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/lib/max_yandex_adapter.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/lib/max_yandex_adapter_method_channel.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/lib/max_yandex_adapter_platform_interface.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/pubspec.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/test/max_yandex_adapter_method_channel_test.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/plugins/max_yandex_adapter/test/max_yandex_adapter_test.dart create mode 100644 guru_app/plugins/guru_applovin_flutter/pubspec.lock create mode 100644 guru_app/plugins/guru_applovin_flutter/pubspec.yaml create mode 100644 guru_app/plugins/guru_applovin_flutter/test/guru_applovin_flutter_test.dart create mode 100644 guru_app/plugins/guru_navigator/.gitignore create mode 100644 guru_app/plugins/guru_navigator/CHANGELOG.md create mode 100644 guru_app/plugins/guru_navigator/LICENSE create mode 100644 guru_app/plugins/guru_navigator/README.md create mode 100644 guru_app/plugins/guru_navigator/analysis_options.yaml create mode 100644 guru_app/plugins/guru_navigator/android/.gitignore create mode 100644 guru_app/plugins/guru_navigator/android/build.gradle create mode 100644 guru_app/plugins/guru_navigator/android/settings.gradle create mode 100644 guru_app/plugins/guru_navigator/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_navigator/android/src/main/kotlin/app/guru/guru_navigator/GuruNavigatorPlugin.kt create mode 100644 guru_app/plugins/guru_navigator/example/.gitignore create mode 100644 guru_app/plugins/guru_navigator/example/README.md create mode 100644 guru_app/plugins/guru_navigator/example/analysis_options.yaml create mode 100644 guru_app/plugins/guru_navigator/example/android/.gitignore create mode 100644 guru_app/plugins/guru_navigator/example/android/app/build.gradle create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/kotlin/app/guru/guru_navigator_example/MainActivity.kt create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_navigator/example/android/build.gradle create mode 100644 guru_app/plugins/guru_navigator/example/android/gradle.properties create mode 100644 guru_app/plugins/guru_navigator/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_navigator/example/android/settings.gradle create mode 100644 guru_app/plugins/guru_navigator/example/ios/.gitignore create mode 100644 guru_app/plugins/guru_navigator/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/guru_navigator/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/guru_navigator/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/guru_navigator/example/ios/Podfile create mode 100644 guru_app/plugins/guru_navigator/example/ios/Podfile.lock create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/guru_navigator/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/guru_navigator/example/lib/main.dart create mode 100644 guru_app/plugins/guru_navigator/example/pubspec.lock create mode 100644 guru_app/plugins/guru_navigator/example/pubspec.yaml create mode 100644 guru_app/plugins/guru_navigator/example/test/widget_test.dart create mode 100644 guru_app/plugins/guru_navigator/ios/.gitignore create mode 100644 guru_app/plugins/guru_navigator/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_navigator/ios/Classes/GuruNavigatorPlugin.h create mode 100644 guru_app/plugins/guru_navigator/ios/Classes/GuruNavigatorPlugin.m create mode 100644 guru_app/plugins/guru_navigator/ios/Classes/SwiftGuruNavigatorPlugin.swift create mode 100644 guru_app/plugins/guru_navigator/ios/guru_navigator.podspec create mode 100644 guru_app/plugins/guru_navigator/lib/guru_navigator.dart create mode 100644 guru_app/plugins/guru_navigator/lib/guru_navigator_method_channel.dart create mode 100644 guru_app/plugins/guru_navigator/lib/guru_navigator_platform_interface.dart create mode 100644 guru_app/plugins/guru_navigator/pubspec.lock create mode 100644 guru_app/plugins/guru_navigator/pubspec.yaml create mode 100644 guru_app/plugins/guru_navigator/test/guru_navigator_method_channel_test.dart create mode 100644 guru_app/plugins/guru_navigator/test/guru_navigator_test.dart create mode 100644 guru_app/plugins/guru_platform_data/.gitignore create mode 100644 guru_app/plugins/guru_platform_data/CHANGELOG.md create mode 100644 guru_app/plugins/guru_platform_data/LICENSE create mode 100644 guru_app/plugins/guru_platform_data/README.md create mode 100644 guru_app/plugins/guru_platform_data/analysis_options.yaml create mode 100644 guru_app/plugins/guru_platform_data/android/.gitignore create mode 100644 guru_app/plugins/guru_platform_data/android/build.gradle create mode 100644 guru_app/plugins/guru_platform_data/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/guru_platform_data/android/settings.gradle create mode 100644 guru_app/plugins/guru_platform_data/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/guru_platform_data/android/src/main/kotlin/app/guru/guru_platform_data/GuruPlatformData.kt create mode 100644 guru_app/plugins/guru_platform_data/ios/.gitignore create mode 100644 guru_app/plugins/guru_platform_data/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/guru_platform_data/ios/Classes/GuruPlatformDataPlugin.h create mode 100644 guru_app/plugins/guru_platform_data/ios/Classes/GuruPlatformDataPlugin.m create mode 100644 guru_app/plugins/guru_platform_data/ios/Classes/SwiftGuruPlatformDataPlugin.swift create mode 100644 guru_app/plugins/guru_platform_data/ios/guru_platform_data.podspec create mode 100644 guru_app/plugins/guru_platform_data/lib/guru_platform_data.dart create mode 100644 guru_app/plugins/guru_platform_data/lib/guru_platform_data_web.dart create mode 100644 guru_app/plugins/guru_platform_data/pubspec.yaml create mode 100644 guru_app/plugins/guru_platform_data/test/guru_platform_data_test.dart create mode 100644 guru_app/plugins/persistent/.gitignore create mode 100644 guru_app/plugins/persistent/CHANGELOG.md create mode 100644 guru_app/plugins/persistent/LICENSE create mode 100644 guru_app/plugins/persistent/README.md create mode 100644 guru_app/plugins/persistent/analysis_options.yaml create mode 100644 guru_app/plugins/persistent/android/.gitignore create mode 100644 guru_app/plugins/persistent/android/build.gradle create mode 100644 guru_app/plugins/persistent/android/settings.gradle create mode 100644 guru_app/plugins/persistent/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/persistent/android/src/main/kotlin/app/guru/persistent/PersistentPlugin.kt create mode 100644 guru_app/plugins/persistent/android/src/main/kotlin/app/guru/persistent/log/PersistentLog.kt create mode 100644 guru_app/plugins/persistent/example/.gitignore create mode 100644 guru_app/plugins/persistent/example/README.md create mode 100644 guru_app/plugins/persistent/example/analysis_options.yaml create mode 100644 guru_app/plugins/persistent/example/android/.gitignore create mode 100644 guru_app/plugins/persistent/example/android/app/build.gradle create mode 100644 guru_app/plugins/persistent/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/kotlin/app/guru/persistent_example/MainActivity.kt create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_app/plugins/persistent/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_app/plugins/persistent/example/android/build.gradle create mode 100644 guru_app/plugins/persistent/example/android/gradle.properties create mode 100644 guru_app/plugins/persistent/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/persistent/example/android/settings.gradle create mode 100644 guru_app/plugins/persistent/example/ios/.gitignore create mode 100644 guru_app/plugins/persistent/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_app/plugins/persistent/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_app/plugins/persistent/example/ios/Flutter/Release.xcconfig create mode 100644 guru_app/plugins/persistent/example/ios/Podfile create mode 100644 guru_app/plugins/persistent/example/ios/Podfile.lock create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_app/plugins/persistent/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_app/plugins/persistent/example/ios/Runner/AppDelegate.swift create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Info.plist create mode 100644 guru_app/plugins/persistent/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_app/plugins/persistent/example/lib/main.dart create mode 100644 guru_app/plugins/persistent/example/pubspec.lock create mode 100644 guru_app/plugins/persistent/example/pubspec.yaml create mode 100644 guru_app/plugins/persistent/example/test/widget_test.dart create mode 100644 guru_app/plugins/persistent/ios/.gitignore create mode 100644 guru_app/plugins/persistent/ios/Assets/.gitkeep create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDFileLogger.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDFileLogger.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLog.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLog.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileFormatterDefault.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileFormatterDefault.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileInfo.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileInfo.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileManager.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileManagerDefault.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogFileManagerDefault.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLogMacros.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLoggerNames.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDLoggerNames.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDTTYLogger.h create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/DDTTYLogger.m create mode 100644 guru_app/plugins/persistent/ios/Classes/LogLibrary/GuruLog.swift create mode 100644 guru_app/plugins/persistent/ios/Classes/PersistentPlugin.h create mode 100644 guru_app/plugins/persistent/ios/Classes/PersistentPlugin.m create mode 100644 guru_app/plugins/persistent/ios/Classes/SwiftPersistentPlugin.swift create mode 100644 guru_app/plugins/persistent/ios/persistent.podspec create mode 100644 guru_app/plugins/persistent/lib/log/persistent_log.dart create mode 100644 guru_app/plugins/persistent/pubspec.lock create mode 100644 guru_app/plugins/persistent/pubspec.yaml create mode 100644 guru_app/plugins/persistent/test/persistent_method_channel_test.dart create mode 100644 guru_app/plugins/persistent/test/persistent_test.dart create mode 100644 guru_app/plugins/soundpool/CHANGELOG.md create mode 100644 guru_app/plugins/soundpool/LICENSE create mode 100644 guru_app/plugins/soundpool/README.md create mode 100644 guru_app/plugins/soundpool/android/build.gradle create mode 100644 guru_app/plugins/soundpool/android/gradle.properties create mode 100644 guru_app/plugins/soundpool/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/soundpool/android/settings.gradle create mode 100644 guru_app/plugins/soundpool/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/soundpool/android/src/main/kotlin/pl/ukaszapps/soundpool/SoundpoolPlugin.kt create mode 100644 guru_app/plugins/soundpool/ios/Classes/Atomic.swift create mode 100644 guru_app/plugins/soundpool/ios/Classes/SoundpoolPlugin.h create mode 100644 guru_app/plugins/soundpool/ios/Classes/SoundpoolPlugin.m create mode 100644 guru_app/plugins/soundpool/ios/Classes/SwiftSoundpoolPlugin.swift create mode 100644 guru_app/plugins/soundpool/ios/soundpool.podspec create mode 100644 guru_app/plugins/soundpool/lib/soundpool.dart create mode 100644 guru_app/plugins/soundpool/lib/src/platform_options.dart create mode 100644 guru_app/plugins/soundpool/lib/src/platforms/android.dart create mode 100644 guru_app/plugins/soundpool/lib/src/platforms/ios.dart create mode 100644 guru_app/plugins/soundpool/lib/src/platforms/macos.dart create mode 100644 guru_app/plugins/soundpool/lib/src/platforms/web.dart create mode 100644 guru_app/plugins/soundpool/macos/soundpool.podspec create mode 100644 guru_app/plugins/soundpool/pubspec.lock create mode 100644 guru_app/plugins/soundpool/pubspec.yaml create mode 100644 guru_app/plugins/vibration/.gitignore create mode 100644 guru_app/plugins/vibration/CHANGELOG.md create mode 100644 guru_app/plugins/vibration/LICENSE create mode 100644 guru_app/plugins/vibration/README.md create mode 100644 guru_app/plugins/vibration/android/build.gradle create mode 100644 guru_app/plugins/vibration/android/gradle.properties create mode 100644 guru_app/plugins/vibration/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_app/plugins/vibration/android/settings.gradle create mode 100644 guru_app/plugins/vibration/android/src/main/AndroidManifest.xml create mode 100644 guru_app/plugins/vibration/android/src/main/java/com/benjaminabel/vibration/Vibration.java create mode 100644 guru_app/plugins/vibration/android/src/main/java/com/benjaminabel/vibration/VibrationMethodChannelHandler.java create mode 100644 guru_app/plugins/vibration/android/src/main/java/com/benjaminabel/vibration/VibrationPlugin.java create mode 100644 guru_app/plugins/vibration/ios/Classes/VibrationPlugin.h create mode 100644 guru_app/plugins/vibration/ios/Classes/VibrationPlugin.m create mode 100644 guru_app/plugins/vibration/ios/Classes/VibrationPluginSwift.swift create mode 100644 guru_app/plugins/vibration/ios/vibration.podspec create mode 100644 guru_app/plugins/vibration/lib/vibration.dart create mode 100644 guru_app/plugins/vibration/pubspec.lock create mode 100644 guru_app/plugins/vibration/pubspec.yaml create mode 100644 guru_app/plugins/vibration/test/vibration_test.dart create mode 100644 guru_app/pubspec.lock create mode 100644 guru_app/pubspec.yaml create mode 100644 guru_app/test/datetime/date_time_utils_test.dart create mode 100644 guru_app/test/guru_manager_test.dart create mode 100644 guru_app/test/order/order_test.dart create mode 100644 guru_app/test/random/pseudo_random_test.dart create mode 100644 guru_app/test/test.file create mode 100755 guru_app/tools/bin/ad_review_ios_checker create mode 100755 guru_app/tools/bin/depaudit create mode 100755 guru_app/tools/bin/deps create mode 100755 guru_app/tools/bin/guru_setup create mode 100755 guru_app/tools/bin/guruupgrade create mode 100755 guru_app/tools/bin/l10n create mode 100755 guru_app/tools/bin/pubget create mode 100755 guru_app/tools/bin/pulish_gitea.py create mode 100755 guru_app/tools/bin/repoupdate create mode 100755 guru_app/tools/bin/retag create mode 100755 guru_app/tools/bin/rmtag create mode 100755 guru_app/tools/bin/update_repo_url create mode 100755 guru_app/tools/bin/version_snapshot create mode 100644 guru_app/zygote.py create mode 100644 guru_ui/.gitignore create mode 100644 guru_ui/CHANGELOG.md create mode 100644 guru_ui/LICENSE create mode 100644 guru_ui/README.md create mode 100644 guru_ui/analysis_options.yaml create mode 100644 guru_ui/assets/icons/ic_ad.png create mode 100644 guru_ui/assets/icons/ic_close_dark.png create mode 100644 guru_ui/assets/icons/ic_close_light.png create mode 100644 guru_ui/assets/icons/ic_error.png create mode 100644 guru_ui/assets/icons/ic_wifi.png create mode 100644 guru_ui/assets/images/ic_purchase.png create mode 100755 guru_ui/code_prebuild.sh create mode 100644 guru_ui/example/.gitignore create mode 100644 guru_ui/example/README.md create mode 100644 guru_ui/example/analysis_options.yaml create mode 100644 guru_ui/example/android/.gitignore create mode 100644 guru_ui/example/android/app/build.gradle create mode 100644 guru_ui/example/android/app/fungame.keystore create mode 100644 guru_ui/example/android/app/src/debug/AndroidManifest.xml create mode 100644 guru_ui/example/android/app/src/main/AndroidManifest.xml create mode 100644 guru_ui/example/android/app/src/main/kotlin/guru/core/uiux.demo/MainActivity.kt create mode 100644 guru_ui/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 guru_ui/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 guru_ui/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 guru_ui/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 guru_ui/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 guru_ui/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 guru_ui/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 guru_ui/example/android/app/src/main/res/values-night/styles.xml create mode 100644 guru_ui/example/android/app/src/main/res/values-v28/styles.xml create mode 100644 guru_ui/example/android/app/src/main/res/values/styles.xml create mode 100644 guru_ui/example/android/app/src/profile/AndroidManifest.xml create mode 100644 guru_ui/example/android/build.gradle create mode 100644 guru_ui/example/android/gradle.properties create mode 100644 guru_ui/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 guru_ui/example/android/settings.gradle create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Black.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Bold.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-ExtraBold.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-ExtraLight.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Light.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Medium.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Regular.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-SemiBold.ttf create mode 100644 guru_ui/example/assets/fonts/EncodeSansExpanded-Thin.ttf create mode 100644 guru_ui/example/assets/images/Ic_Award.png create mode 100644 guru_ui/example/assets/images/LeaderBoard.png create mode 100644 guru_ui/example/assets/images/arrow.png create mode 100644 guru_ui/example/assets/images/award_right.png create mode 100644 guru_ui/example/assets/images/close.png create mode 100644 guru_ui/example/assets/images/daily_challenge/ic_arrow_left.png create mode 100644 guru_ui/example/assets/images/daily_challenge/ic_arrow_right.png create mode 100644 guru_ui/example/assets/images/daily_challenge/ic_awards.png create mode 100644 guru_ui/example/assets/images/daily_challenge/ic_dialog_main.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold01.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold02.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold03.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold04.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold05.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold06.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold07.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold08.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold09.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold10.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold11.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/gold12.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey01.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey02.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey03.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey04.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey05.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey06.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey07.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey08.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey09.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey10.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey11.png create mode 100644 guru_ui/example/assets/images/daily_challenge/trophies/grey12.png create mode 100644 guru_ui/example/assets/images/demo.png create mode 100644 guru_ui/example/assets/images/ic_add.png create mode 100644 guru_ui/example/assets/images/ic_ads.png create mode 100644 guru_ui/example/assets/images/ic_arrow_left.png create mode 100644 guru_ui/example/assets/images/ic_arrow_right.png create mode 100644 guru_ui/example/assets/images/ic_awards.png create mode 100644 guru_ui/example/assets/images/ic_back.png create mode 100644 guru_ui/example/assets/images/ic_check.png create mode 100644 guru_ui/example/assets/images/ic_close.png create mode 100644 guru_ui/example/assets/images/ic_close_white.png create mode 100644 guru_ui/example/assets/images/ic_coin.png create mode 100644 guru_ui/example/assets/images/ic_colorful_tips.png create mode 100644 guru_ui/example/assets/images/ic_crown.png create mode 100644 guru_ui/example/assets/images/ic_gem.png create mode 100644 guru_ui/example/assets/images/ic_gem_add.png create mode 100644 guru_ui/example/assets/images/ic_homepage.png create mode 100644 guru_ui/example/assets/images/ic_illustration.png create mode 100644 guru_ui/example/assets/images/ic_leaderboard.png create mode 100644 guru_ui/example/assets/images/ic_message.png create mode 100644 guru_ui/example/assets/images/ic_pic_joker.png create mode 100644 guru_ui/example/assets/images/ic_rect.png create mode 100644 guru_ui/example/assets/images/ic_restore.png create mode 100644 guru_ui/example/assets/images/ic_share.png create mode 100644 guru_ui/example/assets/images/ic_sound.png create mode 100644 guru_ui/example/assets/images/ic_theme.png create mode 100644 guru_ui/example/assets/images/ic_tips.png create mode 100644 guru_ui/example/assets/images/ic_volunteer.png create mode 100644 guru_ui/example/assets/images/ic_zhendong.png create mode 100644 guru_ui/example/assets/images/more.png create mode 100644 guru_ui/example/assets/images/off.png create mode 100644 guru_ui/example/assets/images/on.png create mode 100644 guru_ui/example/assets/images/pic.png create mode 100644 guru_ui/example/assets/images/pic_problems.png create mode 100644 guru_ui/example/assets/images/pic_radial_light.png create mode 100644 guru_ui/example/assets/images/pic_remove_ads.png create mode 100644 guru_ui/example/assets/images/remove_ads.png create mode 100644 guru_ui/example/assets/images/s2.png create mode 100644 guru_ui/example/assets/images/slider_bar/pic_select.png create mode 100644 guru_ui/example/assets/images/slider_bar/x2.png create mode 100644 guru_ui/example/assets/images/slider_bar/x3.png create mode 100644 guru_ui/example/assets/images/slider_bar/x4.png create mode 100644 guru_ui/example/assets/images/slider_bar/x5.png create mode 100644 guru_ui/example/assets/lottie/animated_trophy_bg.json create mode 100644 guru_ui/example/assets/lottie/congrats_trophy_bg.json create mode 100755 guru_ui/example/build_prod_android.sh create mode 100755 guru_ui/example/build_version.properties create mode 100755 guru_ui/example/build_version.sh create mode 100755 guru_ui/example/extract_apk_and_upload.sh create mode 100644 guru_ui/example/ios/.gitignore create mode 100644 guru_ui/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 guru_ui/example/ios/Flutter/Debug.xcconfig create mode 100644 guru_ui/example/ios/Flutter/Release.xcconfig create mode 100644 guru_ui/example/ios/Podfile create mode 100644 guru_ui/example/ios/Podfile.lock create mode 100644 guru_ui/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 guru_ui/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 guru_ui/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_ui/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_ui/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 guru_ui/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 guru_ui/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 guru_ui/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 guru_ui/example/ios/Runner/AppDelegate.swift create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 guru_ui/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 guru_ui/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 guru_ui/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 guru_ui/example/ios/Runner/Info.plist create mode 100644 guru_ui/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 guru_ui/example/lib/console/console.dart create mode 100644 guru_ui/example/lib/console/console_button.dart create mode 100644 guru_ui/example/lib/console/console_button_controller.dart create mode 100644 guru_ui/example/lib/console/vm_helper.dart create mode 100644 guru_ui/example/lib/daily_challenge/daily_challenge.dart create mode 100644 guru_ui/example/lib/data/database/ui_db.dart create mode 100644 guru_ui/example/lib/data/settings/ui_settings.dart create mode 100644 guru_ui/example/lib/generated/app_strings.dart create mode 100644 guru_ui/example/lib/generated/assets.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_af.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_all.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_am.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ar.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_az_AZ.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_be.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_bg.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_bn_BD.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ca.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_cs_CZ.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_da_DK.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_de_DE.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_el_GR.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_en.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_es_419.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_es_ES.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_es_US.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_et.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_eu_ES.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_fa.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_fi_FI.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_fil.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_fr_CA.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_fr_FR.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_gl_ES.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_gu.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_he_IL.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_hi_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_hr.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_hu_HU.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_hy_AM.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_id.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_is_IS.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_it_IT.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ja_JP.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ka_GE.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_kk.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_km_KH.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_kn_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ko_KR.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ky_KG.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_lo_LA.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_lt.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_lv.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_mk_MK.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ml_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_mn_MN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_mr_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ms.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ms_MY.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_my_MM.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_nb_NO.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ne_NP.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_nl_NL.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_pa.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_pl_PL.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_pt_BR.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_pt_PT.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ro.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ru_RU.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_si_LK.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sk.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sl.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sq.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sr.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sv_SE.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_sw.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ta_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_te_IN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_th.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_tl.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_tr_TR.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_uk.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_ur.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_vi.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_zh_CN.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_zh_HK.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_zh_TW.dart create mode 100644 guru_ui/example/lib/generated/intl/messages_zu.dart create mode 100644 guru_ui/example/lib/generated/l10n.dart create mode 100644 guru_ui/example/lib/l10n/intl_af.arb create mode 100644 guru_ui/example/lib/l10n/intl_am.arb create mode 100644 guru_ui/example/lib/l10n/intl_ar.arb create mode 100644 guru_ui/example/lib/l10n/intl_az_AZ.arb create mode 100644 guru_ui/example/lib/l10n/intl_be.arb create mode 100644 guru_ui/example/lib/l10n/intl_bg.arb create mode 100644 guru_ui/example/lib/l10n/intl_bn_BD.arb create mode 100644 guru_ui/example/lib/l10n/intl_ca.arb create mode 100644 guru_ui/example/lib/l10n/intl_cs_CZ.arb create mode 100644 guru_ui/example/lib/l10n/intl_da_DK.arb create mode 100644 guru_ui/example/lib/l10n/intl_de_DE.arb create mode 100644 guru_ui/example/lib/l10n/intl_el_GR.arb create mode 100644 guru_ui/example/lib/l10n/intl_en.arb create mode 100644 guru_ui/example/lib/l10n/intl_es_419.arb create mode 100644 guru_ui/example/lib/l10n/intl_es_ES.arb create mode 100644 guru_ui/example/lib/l10n/intl_es_US.arb create mode 100644 guru_ui/example/lib/l10n/intl_et.arb create mode 100644 guru_ui/example/lib/l10n/intl_eu_ES.arb create mode 100644 guru_ui/example/lib/l10n/intl_fa.arb create mode 100644 guru_ui/example/lib/l10n/intl_fi_FI.arb create mode 100644 guru_ui/example/lib/l10n/intl_fil.arb create mode 100644 guru_ui/example/lib/l10n/intl_fr_CA.arb create mode 100644 guru_ui/example/lib/l10n/intl_fr_FR.arb create mode 100644 guru_ui/example/lib/l10n/intl_gl_ES.arb create mode 100644 guru_ui/example/lib/l10n/intl_gu.arb create mode 100644 guru_ui/example/lib/l10n/intl_he_IL.arb create mode 100644 guru_ui/example/lib/l10n/intl_hi_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_hr.arb create mode 100644 guru_ui/example/lib/l10n/intl_hu_HU.arb create mode 100644 guru_ui/example/lib/l10n/intl_hy_AM.arb create mode 100644 guru_ui/example/lib/l10n/intl_id.arb create mode 100644 guru_ui/example/lib/l10n/intl_is_IS.arb create mode 100644 guru_ui/example/lib/l10n/intl_it_IT.arb create mode 100644 guru_ui/example/lib/l10n/intl_ja_JP.arb create mode 100644 guru_ui/example/lib/l10n/intl_ka_GE.arb create mode 100644 guru_ui/example/lib/l10n/intl_kk.arb create mode 100644 guru_ui/example/lib/l10n/intl_km_KH.arb create mode 100644 guru_ui/example/lib/l10n/intl_kn_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_ko_KR.arb create mode 100644 guru_ui/example/lib/l10n/intl_ky_KG.arb create mode 100644 guru_ui/example/lib/l10n/intl_lo_LA.arb create mode 100644 guru_ui/example/lib/l10n/intl_lt.arb create mode 100644 guru_ui/example/lib/l10n/intl_lv.arb create mode 100644 guru_ui/example/lib/l10n/intl_mk_MK.arb create mode 100644 guru_ui/example/lib/l10n/intl_ml_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_mn_MN.arb create mode 100644 guru_ui/example/lib/l10n/intl_mr_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_ms.arb create mode 100644 guru_ui/example/lib/l10n/intl_ms_MY.arb create mode 100644 guru_ui/example/lib/l10n/intl_my_MM.arb create mode 100644 guru_ui/example/lib/l10n/intl_nb_NO.arb create mode 100644 guru_ui/example/lib/l10n/intl_ne_NP.arb create mode 100644 guru_ui/example/lib/l10n/intl_nl_NL.arb create mode 100644 guru_ui/example/lib/l10n/intl_pa.arb create mode 100644 guru_ui/example/lib/l10n/intl_pl_PL.arb create mode 100644 guru_ui/example/lib/l10n/intl_pt_BR.arb create mode 100644 guru_ui/example/lib/l10n/intl_pt_PT.arb create mode 100644 guru_ui/example/lib/l10n/intl_ro.arb create mode 100644 guru_ui/example/lib/l10n/intl_ru_RU.arb create mode 100644 guru_ui/example/lib/l10n/intl_si_LK.arb create mode 100644 guru_ui/example/lib/l10n/intl_sk.arb create mode 100644 guru_ui/example/lib/l10n/intl_sl.arb create mode 100644 guru_ui/example/lib/l10n/intl_sq.arb create mode 100644 guru_ui/example/lib/l10n/intl_sr.arb create mode 100644 guru_ui/example/lib/l10n/intl_sv_SE.arb create mode 100644 guru_ui/example/lib/l10n/intl_sw.arb create mode 100644 guru_ui/example/lib/l10n/intl_ta_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_te_IN.arb create mode 100644 guru_ui/example/lib/l10n/intl_th.arb create mode 100644 guru_ui/example/lib/l10n/intl_tl.arb create mode 100644 guru_ui/example/lib/l10n/intl_tr_TR.arb create mode 100644 guru_ui/example/lib/l10n/intl_uk.arb create mode 100644 guru_ui/example/lib/l10n/intl_ur.arb create mode 100644 guru_ui/example/lib/l10n/intl_vi.arb create mode 100644 guru_ui/example/lib/l10n/intl_zh_CN.arb create mode 100644 guru_ui/example/lib/l10n/intl_zh_HK.arb create mode 100644 guru_ui/example/lib/l10n/intl_zh_TW.arb create mode 100644 guru_ui/example/lib/l10n/intl_zu.arb create mode 100644 guru_ui/example/lib/main.dart create mode 100644 guru_ui/example/lib/pages/award/award_binding.dart create mode 100644 guru_ui/example/lib/pages/award/award_controller.dart create mode 100644 guru_ui/example/lib/pages/award/award_view.dart create mode 100644 guru_ui/example/lib/pages/button/button_binding.dart create mode 100644 guru_ui/example/lib/pages/button/button_controller.dart create mode 100644 guru_ui/example/lib/pages/button/button_model.dart create mode 100644 guru_ui/example/lib/pages/button/button_view.dart create mode 100644 guru_ui/example/lib/pages/dialog/dialog_binding.dart create mode 100644 guru_ui/example/lib/pages/dialog/dialog_controller.dart create mode 100644 guru_ui/example/lib/pages/dialog/dialog_model.dart create mode 100644 guru_ui/example/lib/pages/dialog/dialog_view.dart create mode 100644 guru_ui/example/lib/pages/root/root_binding.dart create mode 100644 guru_ui/example/lib/pages/root/root_controller.dart create mode 100644 guru_ui/example/lib/pages/root/root_model.dart create mode 100644 guru_ui/example/lib/pages/root/root_model.g.dart create mode 100644 guru_ui/example/lib/pages/root/root_view.dart create mode 100644 guru_ui/example/lib/pages/root/watermark.dart create mode 100644 guru_ui/example/lib/pages/settings/remove_ads/remove_ads_card.dart create mode 100644 guru_ui/example/lib/pages/settings/remove_ads/remove_ads_design_model.dart create mode 100644 guru_ui/example/lib/pages/settings/remove_ads/remove_ads_design_model.g.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_binding.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_controller.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_design_model.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_design_model.g.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_model.dart create mode 100644 guru_ui/example/lib/pages/settings/settings_view.dart create mode 100644 guru_ui/example/lib/pages/store/store_binding.dart create mode 100644 guru_ui/example/lib/pages/store/store_controller.dart create mode 100644 guru_ui/example/lib/pages/store/store_design_spec.dart create mode 100644 guru_ui/example/lib/pages/store/store_design_spec.g.dart create mode 100644 guru_ui/example/lib/pages/store/store_page.dart create mode 100644 guru_ui/example/lib/pages/tabbar/tabbar_binding.dart create mode 100644 guru_ui/example/lib/pages/tabbar/tabbar_controller.dart create mode 100644 guru_ui/example/lib/pages/tabbar/tabbar_view.dart create mode 100644 guru_ui/example/lib/pages/toast/toast_binding.dart create mode 100644 guru_ui/example/lib/pages/toast/toast_controller.dart create mode 100644 guru_ui/example/lib/pages/toast/toast_view.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_controller.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_design_model.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_design_model.g.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_dialog.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_dialog_controller.dart create mode 100644 guru_ui/example/lib/pages/visual/visual_debug_page.dart create mode 100644 guru_ui/example/lib/pages/webview/settings/privacy_settings_binding.dart create mode 100644 guru_ui/example/lib/pages/webview/settings/privacy_settings_controller.dart create mode 100644 guru_ui/example/lib/pages/webview/settings/privacy_settings_model.dart create mode 100644 guru_ui/example/lib/pages/webview/settings/privacy_settings_view.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_binding.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_controller.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_design_model.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_design_model.g.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_model.dart create mode 100644 guru_ui/example/lib/pages/webview/webview_view.dart create mode 100644 guru_ui/example/lib/pages/widgets/guru_demo_page.dart create mode 100644 guru_ui/example/lib/route/app_pages.dart create mode 100644 guru_ui/example/lib/route/router.dart create mode 100644 guru_ui/example/lib/route/routes.dart create mode 100644 guru_ui/example/lib/theme/assetbar/custom_asset_bar_theme.dart create mode 100644 guru_ui/example/lib/theme/button/custom_button_decoration.dart create mode 100644 guru_ui/example/lib/theme/button/custom_standard_button_theme.dart create mode 100644 guru_ui/example/lib/theme/example_theme.dart create mode 100644 guru_ui/example/lib/theme/tabbar/custom_tab_bar_theme.dart create mode 100644 guru_ui/example/pubspec.lock create mode 100644 guru_ui/example/pubspec.yaml create mode 100644 guru_ui/example/test/widget_test.dart create mode 100644 guru_ui/l10n.yaml create mode 100644 guru_ui/lib/generated/intl/messages_all.dart create mode 100644 guru_ui/lib/generated/intl/messages_en.dart create mode 100644 guru_ui/lib/generated/l10n.dart create mode 100644 guru_ui/lib/guru_ui.dart create mode 100644 guru_ui/lib/guru_ui_test_page.dart create mode 100644 guru_ui/lib/guru_widget.dart create mode 100644 guru_ui/lib/localizations/l10n/app_en.arb create mode 100644 guru_ui/lib/localizations/l10n/generated/app_localizations.dart create mode 100644 guru_ui/lib/localizations/l10n/generated/app_localizations_en.dart create mode 100644 guru_ui/lib/localizations/ui_strings.dart create mode 100644 guru_ui/lib/pages/store/bundle_card.dart create mode 100644 guru_ui/lib/pages/store/bundle_card.g.dart create mode 100644 guru_ui/lib/pages/store/purchase_banner.dart create mode 100644 guru_ui/lib/pages/store/purchase_banner.g.dart create mode 100644 guru_ui/lib/pages/store/purchase_card.dart create mode 100644 guru_ui/lib/pages/store/purchase_card.g.dart create mode 100644 guru_ui/lib/pages/store/store_controller.dart create mode 100644 guru_ui/lib/pages/store/store_design_spec.dart create mode 100644 guru_ui/lib/pages/store/store_design_spec.g.dart create mode 100644 guru_ui/lib/pages/store/store_page.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_buttons_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_buttons_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_buttons_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_error_picture_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_error_picture_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_error_picture_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_how_to_play_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_how_to_play_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_how_to_play_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_double_button_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_double_button_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_double_button_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_single_button_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_single_button_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_image_single_button_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_internet_error_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_internet_error_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_internet_error_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_label_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_label_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_label_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_single_input_alert_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_single_input_alert_design_model.g.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_single_input_alert_widget.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_standard_container.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_standard_container_design_model.dart create mode 100644 guru_ui/lib/widget/alerts/dialog_standard_container_design_model.g.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_collection_design_model.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_collection_design_model.g.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_collection_widget.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_design_model.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_design_model.g.dart create mode 100644 guru_ui/lib/widget/daily_reward/dialog_daily_reward_gift_widget.dart create mode 100644 guru_ui/lib/widget/dialog/dialog_core.dart create mode 100644 guru_ui/lib/widget/dialog/dialog_utils.dart create mode 100644 guru_ui/lib/widget/image/adaptive_image.dart create mode 100644 guru_ui/lib/widget/rating/rating_style.dart create mode 100644 guru_ui/lib/widget/ratingbar/rating_bar.dart create mode 100644 guru_ui/lib/widget/ratingbar/rating_bar_indicator.dart create mode 100644 guru_ui/lib/widget/tips/tips.dart create mode 100644 guru_ui/lib/widget/tips/tips_clipper.dart create mode 100644 guru_ui/lib/widget/tips/tips_painter.dart create mode 100644 guru_ui/lib/widget/tips/tips_widget.dart create mode 100644 guru_ui/packages/daily_challenge/.gitignore create mode 100644 guru_ui/packages/daily_challenge/CHANGELOG.md create mode 100644 guru_ui/packages/daily_challenge/LICENSE create mode 100644 guru_ui/packages/daily_challenge/README.md create mode 100644 guru_ui/packages/daily_challenge/analysis_options.yaml create mode 100644 guru_ui/packages/daily_challenge/assets/lottie/animated_trophy.json create mode 100644 guru_ui/packages/daily_challenge/l10n.yaml create mode 100644 guru_ui/packages/daily_challenge/lib/daily_challenge.dart create mode 100644 guru_ui/packages/daily_challenge/lib/daily_challenge_package.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/creators/creators.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/daily_challenge_db.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/entities/award/award_entity.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/entities/daily_challenge/daily_challenge_entity.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/entities/entities.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/entities/entities.g.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/modules/award/award_database.dart create mode 100644 guru_ui/packages/daily_challenge/lib/data/db/modules/daily_challenge/daily_challenge_database.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_af.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_am.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ar.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_az.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_az_AZ.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_be.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_bg.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_bn.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_bn_BD.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ca.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_cs.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_cs_CZ.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_da.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_da_DK.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_de.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_de_DE.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_el.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_el_GR.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_en.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_es.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_es_419.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_es_ES.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_es_US.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_et.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_eu.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_eu_ES.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fa.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fi.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fi_FI.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fil.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fr.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fr_CA.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_fr_FR.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_gl.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_gl_ES.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_gu.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_he.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_he_IL.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hi.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hi_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hr.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hu.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hu_HU.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hy.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_hy_AM.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_id.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_is.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_is_IS.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_it.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_it_IT.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ja.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ja_JP.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ka.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ka_GE.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_kk.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_km.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_km_KH.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_kn.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_kn_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ko.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ko_KR.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ky.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ky_KG.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_lo.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_lo_LA.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_lt.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_lv.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mk.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mk_MK.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ml.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ml_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mn.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mn_MN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mr.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_mr_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ms.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ms_MY.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_my.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_my_MM.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_nb.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_nb_NO.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ne.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ne_NP.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_nl.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_nl_NL.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pa.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pl.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pl_PL.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pt.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pt_BR.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_pt_PT.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ro.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ru.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ru_RU.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_si.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_si_LK.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sk.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sl.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sq.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sr.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sv.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sv_SE.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_sw.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ta.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ta_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_te.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_te_IN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_th.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_tl.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_tr.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_tr_TR.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_uk.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_ur.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_vi.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_zh.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_zh_CN.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_zh_HK.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_zh_TW.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/app_zu.arb create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_af.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_am.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ar.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_az.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_be.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_bg.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_bn.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ca.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_cs.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_da.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_de.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_el.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_en.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_es.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_et.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_eu.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_fa.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_fi.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_fil.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_fr.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_gl.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_gu.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_he.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_hi.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_hr.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_hu.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_hy.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_id.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_is.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_it.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ja.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ka.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_kk.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_km.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_kn.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ko.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ky.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_lo.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_lt.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_lv.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_mk.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ml.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_mn.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_mr.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ms.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_my.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_nb.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ne.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_nl.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_pa.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_pl.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_pt.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ro.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ru.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_si.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sk.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sl.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sq.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sr.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sv.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_sw.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ta.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_te.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_th.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_tl.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_tr.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_uk.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_ur.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_vi.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_zh.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/generated/app_localizations_zu.dart create mode 100644 guru_ui/packages/daily_challenge/lib/l10n/localizations/app_strings.dart create mode 100644 guru_ui/packages/daily_challenge/lib/mgr/daily_challenge_manager.dart create mode 100644 guru_ui/packages/daily_challenge/lib/router/daily_challenge_routes.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/controller/aware/daily_challenge_aware.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/award/trophy_decoration.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/award/trophy_exhibit_controller.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/award/trophy_exhibit_widget.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/award/trophy_exhibit_widget.g.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/calendar/challenge_calendar_controller.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/calendar/challenge_calendar_page.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/calendar/challenge_calendar_page.g.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/congratulations/congratulations_page.dart create mode 100644 guru_ui/packages/daily_challenge/lib/ui/pages/congratulations/congratulations_page.g.dart create mode 100644 guru_ui/packages/daily_challenge/pubspec.yaml create mode 100644 guru_ui/packages/daily_challenge/test/daily_challenge_test.dart create mode 100644 guru_ui/packages/design/.gitignore create mode 100644 guru_ui/packages/design/CHANGELOG.md create mode 100644 guru_ui/packages/design/LICENSE create mode 100644 guru_ui/packages/design/README.md create mode 100644 guru_ui/packages/design/analysis_options.yaml create mode 100644 guru_ui/packages/design/lib/design.dart create mode 100644 guru_ui/packages/design/lib/design_field.dart create mode 100644 guru_ui/packages/design/lib/design_metrics.dart create mode 100644 guru_ui/packages/design/lib/design_offset.dart create mode 100644 guru_ui/packages/design/lib/design_rect.dart create mode 100644 guru_ui/packages/design/lib/design_size.dart create mode 100644 guru_ui/packages/design/lib/design_spec_model.dart create mode 100644 guru_ui/packages/design/pubspec.yaml create mode 100644 guru_ui/packages/design/test/design_test.dart create mode 100644 guru_ui/packages/design_generator/.gitignore create mode 100644 guru_ui/packages/design_generator/CHANGELOG.md create mode 100644 guru_ui/packages/design_generator/LICENSE create mode 100644 guru_ui/packages/design_generator/README.md create mode 100644 guru_ui/packages/design_generator/analysis_options.yaml create mode 100644 guru_ui/packages/design_generator/build.yaml create mode 100644 guru_ui/packages/design_generator/lib/design_generator.dart create mode 100644 guru_ui/packages/design_generator/lib/src/generator.dart create mode 100644 guru_ui/packages/design_generator/lib/src/hash.dart create mode 100644 guru_ui/packages/design_generator/lib/src/tuple.dart create mode 100644 guru_ui/packages/design_generator/pubspec.yaml create mode 100644 guru_ui/packages/design_generator/test/design_generator_test.dart create mode 100644 guru_ui/packages/design_spec/.gitignore create mode 100644 guru_ui/packages/design_spec/CHANGELOG.md create mode 100644 guru_ui/packages/design_spec/LICENSE create mode 100644 guru_ui/packages/design_spec/README.md create mode 100644 guru_ui/packages/design_spec/analysis_options.yaml create mode 100644 guru_ui/packages/design_spec/lib/design_annotations.dart create mode 100644 guru_ui/packages/design_spec/lib/design_spec.dart create mode 100644 guru_ui/packages/design_spec/pubspec.yaml create mode 100644 guru_ui/packages/design_spec/test/design_spec_test.dart create mode 100644 guru_ui/packages/guru_popup/.gitignore create mode 100644 guru_ui/packages/guru_popup/CHANGELOG.md create mode 100644 guru_ui/packages/guru_popup/LICENSE create mode 100644 guru_ui/packages/guru_popup/README.md create mode 100644 guru_ui/packages/guru_popup/analysis_options.yaml create mode 100644 guru_ui/packages/guru_popup/assets/images/iap_received.png create mode 100644 guru_ui/packages/guru_popup/l10n.yaml create mode 100644 guru_ui/packages/guru_popup/lib/dialog/dialog_aware.dart create mode 100644 guru_ui/packages/guru_popup/lib/guru_popup.dart create mode 100644 guru_ui/packages/guru_popup/lib/localizations/l10n/app_en.arb create mode 100644 guru_ui/packages/guru_popup/lib/localizations/l10n/generated/app_localizations.dart create mode 100644 guru_ui/packages/guru_popup/lib/localizations/l10n/generated/app_localizations_en.dart create mode 100644 guru_ui/packages/guru_popup/lib/localizations/popup_strings.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/banner/banner.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/banner/banner.g.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/overlay_aware.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/tips/tips.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/tips/tips_clipper.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/tips/tips_painter.dart create mode 100644 guru_ui/packages/guru_popup/lib/overlay/tips/tips_widget.dart create mode 100644 guru_ui/packages/guru_popup/lib/package/popup_package.dart create mode 100644 guru_ui/packages/guru_popup/lib/toast/toast_aware.dart create mode 100644 guru_ui/packages/guru_popup/pubspec.yaml create mode 100644 guru_ui/packages/guru_popup/test/guru_popup_test.dart create mode 100644 guru_ui/packages/guru_rating/.gitignore create mode 100644 guru_ui/packages/guru_rating/CHANGELOG.md create mode 100644 guru_ui/packages/guru_rating/LICENSE create mode 100644 guru_ui/packages/guru_rating/README.md create mode 100644 guru_ui/packages/guru_rating/analysis_options.yaml create mode 100644 guru_ui/packages/guru_rating/lib/core/dialog_utils.dart create mode 100644 guru_ui/packages/guru_rating/lib/core/mixins.dart create mode 100644 guru_ui/packages/guru_rating/lib/core/models.dart create mode 100644 guru_ui/packages/guru_rating/lib/core/rating_guide.dart create mode 100644 guru_ui/packages/guru_rating/lib/core/rating_property.dart create mode 100644 guru_ui/packages/guru_rating/lib/guru_rating.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/going_store_design_spec.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/going_store_design_spec.g.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/going_store_loading_page.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/ios_thankyou_design_spec.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/ios_thankyou_design_spec.g.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/ios_thankyou_page.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/rating_design_spec.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/rating_design_spec.g.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/rating_page.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/rating_result.dart create mode 100644 guru_ui/packages/guru_rating/lib/page/rating_style.dart create mode 100644 guru_ui/packages/guru_rating/lib/ratingbar/rating_bar.dart create mode 100644 guru_ui/packages/guru_rating/lib/ratingbar/rating_bar_indicator.dart create mode 100644 guru_ui/packages/guru_rating/pubspec.yaml create mode 100644 guru_ui/packages/guru_rating/test/guru_rating_test.dart create mode 100644 guru_ui/packages/guru_widgets/.gitignore create mode 100644 guru_ui/packages/guru_widgets/CHANGELOG.md create mode 100644 guru_ui/packages/guru_widgets/LICENSE create mode 100644 guru_ui/packages/guru_widgets/README.md create mode 100644 guru_ui/packages/guru_widgets/analysis_options.yaml create mode 100644 guru_ui/packages/guru_widgets/assets/images/ic_close.png create mode 100644 guru_ui/packages/guru_widgets/assets/images/pic_success.png create mode 100644 guru_ui/packages/guru_widgets/assets/lottie/fail.json create mode 100644 guru_ui/packages/guru_widgets/assets/lottie/loading.json create mode 100644 guru_ui/packages/guru_widgets/assets/lottie/successful.json create mode 100644 guru_ui/packages/guru_widgets/l10n.yaml create mode 100644 guru_ui/packages/guru_widgets/lib/animation/lottie/composition_provider.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/lottie/lottie_controller.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/lottie/lottie_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/animated_transform_builder.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/animated_transform_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/animator.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/curved_offset_animation.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/curves_ext.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/popup_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/animation/standard/transform_animation.dart create mode 100644 guru_ui/packages/guru_widgets/lib/appbar/guru_app_bar.dart create mode 100644 guru_ui/packages/guru_widgets/lib/appbar/guru_app_bar.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/assetbar/guru_asset_bar.dart create mode 100644 guru_ui/packages/guru_widgets/lib/assetbar/guru_asset_bar.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/banner/purchase_banner.dart create mode 100644 guru_ui/packages/guru_widgets/lib/banner/purchase_banner.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/circle_button.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/guru_button.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/guru_button.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/purchase_button.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/single_tap_inkwell.dart create mode 100644 guru_ui/packages/guru_widgets/lib/button/single_tap_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/custom_rrect_tab_indicator.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/divider.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/flexible_container.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/keep_screen_on_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/layout_widget.dart create mode 100644 guru_ui/packages/guru_widgets/lib/common/spacer.dart create mode 100644 guru_ui/packages/guru_widgets/lib/dialog/guru_dialog.dart create mode 100644 guru_ui/packages/guru_widgets/lib/dialog/guru_dialog.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/gem_overlay/guru_gem_overlay.dart create mode 100644 guru_ui/packages/guru_widgets/lib/guru_widgets.dart create mode 100644 guru_ui/packages/guru_widgets/lib/image/adaptive_image.dart create mode 100644 guru_ui/packages/guru_widgets/lib/localizations/l10n/app_en.arb create mode 100644 guru_ui/packages/guru_widgets/lib/localizations/l10n/generated/app_localizations.dart create mode 100644 guru_ui/packages/guru_widgets/lib/localizations/l10n/generated/app_localizations_en.dart create mode 100644 guru_ui/packages/guru_widgets/lib/localizations/widgets_strings.dart create mode 100644 guru_ui/packages/guru_widgets/lib/navigationbar/guru_navigation_bar.dart create mode 100644 guru_ui/packages/guru_widgets/lib/navigationbar/guru_navigation_bar.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/asset/asset_background.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/asset/asset_reward.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/asset/asset_text.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/guru_asset.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/guru_asset_controller.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/guru_loading.dart create mode 100644 guru_ui/packages/guru_widgets/lib/overlay/guru_loading.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/awards/guru_awards_page.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/awards/guru_awards_page.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/navigation/guru_navigation_page.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/navigation/guru_navigation_page.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/settings/guru_settings_page.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/settings/guru_settings_page.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/pages/webview/guru_webview_page.dart create mode 100644 guru_ui/packages/guru_widgets/lib/sliderbar/guru_slider_bar.dart create mode 100644 guru_ui/packages/guru_widgets/lib/sliderbar/guru_slider_bar.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/tabbar/guru_tab_bar.dart create mode 100644 guru_ui/packages/guru_widgets/lib/tabbar/guru_tab_bar.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/theme/guru_theme.dart create mode 100644 guru_ui/packages/guru_widgets/lib/theme/guru_theme.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/tile/guru_list_tile.dart create mode 100644 guru_ui/packages/guru_widgets/lib/tile/guru_list_tile.g.dart create mode 100644 guru_ui/packages/guru_widgets/lib/toast/guru_toast.dart create mode 100644 guru_ui/packages/guru_widgets/pubspec.yaml create mode 100644 guru_ui/packages/guru_widgets/test/guru_widgets_test.dart create mode 100644 guru_ui/pubspec.lock create mode 100644 guru_ui/pubspec.yaml create mode 100644 guru_ui/test/guru_ui_test.dart create mode 100644 guru_ui/upgrade.py diff --git a/guru_app/.github/release.yaml b/guru_app/.github/release.yaml new file mode 100644 index 0000000..f7970b8 --- /dev/null +++ b/guru_app/.github/release.yaml @@ -0,0 +1,9 @@ +# .github/release.yml +changelog: + categories: + - title: 🟢 Features + labels: + - Feature + - title: 🟠 Optimize + labels: + - optimize diff --git a/guru_app/.github/workflows/github-project-issue-to-sheets.yaml b/guru_app/.github/workflows/github-project-issue-to-sheets.yaml new file mode 100644 index 0000000..b2cc324 --- /dev/null +++ b/guru_app/.github/workflows/github-project-issue-to-sheets.yaml @@ -0,0 +1,21 @@ +name: github-project-issue-to-sheets + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + workflow_dispatch: + issues: + types: [opened, deleted, transferred, closed, reopened, assigned, unassigned, labeled, unlabeled] + +jobs: + github-project-issue-to-sheets: + runs-on: ubuntu-latest + name: github-project-issue-to-sheets + steps: + - name: Transfer GitHub Project Issues into Google Sheets + id: github-project-issue-to-sheets + uses: ViRGiL175/github-project-issue-to-sheets@v2.0.0 + with: + google-api-service-account-credentials: ${{ secrets.GOOGLE_SERVICE_ACCOUNT_DATA }} + document-id: '1TMTFBE7xPmgIsJVfYbTMIoQ7D_s42KGqFHxqu3kAFEA' + sheet-name: 'GitHub Issues' \ No newline at end of file diff --git a/guru_app/.gitignore b/guru_app/.gitignore new file mode 100644 index 0000000..2ee8465 --- /dev/null +++ b/guru_app/.gitignore @@ -0,0 +1,120 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.vscode +.gradle +.idea +/local.properties +.DS_Store +/build +.metadata +ios/Flutter/flutter_export_environment.sh + +**/.settings +**/.project +**/.classpath + + +# build id +build_id.properties + +# IntelliJ related + +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ +flutter_* +.flutter-plugins-dependencies + +# goCli related +go-cli/.packages +go-cli/pubspec.lock + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/gradlew +**/android/gradlew.bat +**/android/fastlane/report.xml +**/android/fastlane/README.md + +# 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/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* +**/ios/build/* +**/ios/fastlane/README.md +**/ios/fastlane/report.xml + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +# Crashlytics +debugSymbols/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# i18n +**/android/res/values/strings_en.arb +lib/generated/i18n.dart + +# output +output/ios/adhok/* +output/ios/appstore/* +ios/fastlane/report.xml +android/fastlane/report.xml + +**/android/fastlane/metadata/android/**/images/** +**/ios/fastlane/screenshots/** \ No newline at end of file diff --git a/guru_app/CHANGELOG.md b/guru_app/CHANGELOG.md new file mode 100644 index 0000000..46dadf8 --- /dev/null +++ b/guru_app/CHANGELOG.md @@ -0,0 +1,74 @@ +## v1.2.0(beta) +- **`[guru_app]`** + - 在financial模块添加igc购买流程 + - 取消iapManager的restorePurchase机制,改用reloadOrders(本地读取机制) + - Deployment中添加`autoRestoreIap`、`enableAnalyticsStatistic`、`initIgc`和`igcBalanceSecret`的支持 +- **`[guru_spec]`** + - deployment解析器添加`auto_restore_iap`的支持,取值范围为true或false,true表示在IapManager将自动进行restore操作,false反之 + - deployment解析器添加`enable_analytics_statistic`的支持,取值范围为true或false,true表示在GuruAnalytics将自动添加统计的UserProperty + - deployment解析器添加`init_igc`的支持,取值为int型,在IgcManager初始化的时候第一次使用时会给予相应的igc数量做为初始值 + - deployment解析器添加`igcBalanceSecret`的支持,取值int型,在igc混淆用于防修改的安全secret key + +## v1.1.0 +- **`[guru_app]`** + - 在financial模块添加reward购买流程 + - 升级数据库,针对order表添加category字段,来记录商品分类,方便后续搜索 + - 移除guru_app中的通用广告model定义(移至**guru_utils**) + - 移除BaseController,LifecycleController和AdsController(移至**guru_utils**) + - 移除RewardsAware,InterstitialAware,BannerAware(移至**guru_utils**) +- **`[guru_spec]`** + - 添加`products`解析器 + - 支持`manifest`定义 + - 支持manifest category的汇总 + - 支持category的lint检查(在定义相似内容时会报错) + - 支持同category的manifest参数lint检查(在定义同category的manifest时,如果参数不匹配将报错) + - 移除`iap_profile`解析器 +- **`[guru_utils]`** + - 添加通用广告model定义 + - 添加controller定义 + - 添加RewardsAware,InterstitialAware,BannerAware +- **`[guru_navigator]`** + - 添加`guru_navigator`plugin,针对Android的deepLink和ios的universalLink的处理 + +## v1.0.1 +- **`[guru_app]`** + - iap相关逻辑优化 +- **`[guru_utils]`** + - 抽象RemoteUtils以便兼容老项目 + - 抽象AnalyticsUtils以便兼容老项目 + - Vibration库的抽象及优化 +- **`[guru_spec]`** + - 强化对兄弟包的支持 + +## v1.0.0 +- **`[guru_app]`** + 该库包含guru自身的相关业务逻辑,将公司的业务逻辑进行统一封装统一管理,相应三方库的版本进行统一调优主要包括如下主要模块 + - ***`Account`*** + 处理匿名登陆相关逻辑,并完成设备上报,错误重试,恢复等相关机制 + - ***`Ads`*** + 处理广告逻辑(MAX),支持插屏,激励视频,Banner + - ***`Analytics`*** + 处理打点相关逻辑,现集成Firebase、Facebook、Guru和Adjust,并封装了相应的标准点和Guru标准点 + - ***`DxLink`*** + 支持处理DynamicLink和Deeplink的回跳相关逻辑 + - ***`CloudMessaging`*** + 处理Push/In-app Messaging相关逻辑 + - ***`RemoteConfig`*** + 处理相关的RemoteConfig相关逻辑,这个依赖于GuruApp中**GuruSpec**的配置生成 + - ***`Financial`*** + 处理相关交易信息,当前版本支持IAP,后续将扩展虚拟货币及Rewards相关的购买逻辑 + - ***`Audio`*** + 音频处理逻辑,通过soundpool逻辑进行二次封装,支持更高效的音效输出 + - ***`Router`*** + 依赖于Get的路由机制 + - ***`Controller`*** + 依赖于Get的GetWidget来配合Controller的逻辑,现在实现了LifecycleController和AdsController,并封装了相应的业务逻辑,并实现了相应的Aware来支持辅助扩展 + +- **`[guru_utils]`** + 该packages是一个通用的工具类,实现了大部分常用操作大概模块(集合,网络,Math, ui),该库没有引用任何GP,ADS, Firebase相关库,因此老项目可以正常引入 +- **`[guru_spec]`** + 该packages是一个方便生成APP基础信息的一个生成器,这样在配置文件中生成后,将可以将信息生成到代码中,支持flavors,该库依赖GP,ADS, Firebase,因此需要引入GuruApp库 +- **`[guru_platform_data]`** + 该库封装了一些平台相关的原生操作,该库弥补pub.dev上未实现的原生特殊功能 +- **`[soundpool]`** + 该库移植自原有soundpool但由于该库长期不更新,并内部依赖有错误,因此单独抽出来进行适配。 diff --git a/guru_app/LICENSE b/guru_app/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/guru_app/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/guru_app/README.md b/guru_app/README.md new file mode 100644 index 0000000..8b55e73 --- /dev/null +++ b/guru_app/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/guru_app/analysis_options.yaml b/guru_app/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/guru_app/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/guru_app/flavors/spider/guru_spec.yaml b/guru_app/flavors/spider/guru_spec.yaml new file mode 100644 index 0000000..ce968b7 --- /dev/null +++ b/guru_app/flavors/spider/guru_spec.yaml @@ -0,0 +1,125 @@ +app_name: Spider + +# App接入GuruApp的基础信息(下面内容必填) +details: + # 中台接口上报时的app_id,影响中台push接入和后期的中台打点接入(必填) + saas_app_id: spider + + # 针对DynamicLink和Deeplink的判断(必填) + authority: solitaire.fungame.studio + + # 对应Firebase项目中的基础链接(必填) + storage_prefix: https://firebasestorage.googleapis.com/v0/b/solitaire-66fbf.appspot.com/o + + # 对应CDN云控中的默认cdn链接(必填) + default_cdn_prefix: https://cdn1.solitaire.fungame.studio + + # Android的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + android_gp_url: https://play.google.com/store/apps/details?id=solitaire.patience.card.games.klondike.free + + # IOS的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + ios_spp_store_url: + + # 隐私协议的链接(必填) + policy_url: https://solitaire.fungame.studio/policy.html + + # 隐私条款的链接(必填) + terms_url: https://solitaire.fungame.studio/termsofservice.html + + # 联系邮箱 (必填) + email_url: card@fungame.studio + +deployment: + # AppProperty Cache的大小,默认是256 + property_cache_size: 512 + + # Paint.enableDithering,默认是true + enable_dithering: false + + # 禁用激励视频,默认是false + disable_rewards_ads: true + + +# 广告配置 +ads_profile: + # Banner广告ID(变现提供) + banner_ad_unit_id: + android: a1dc70299fd5d487 + ios: 97da0e2028ba80b7 + + # Interstitial广告ID(变现提供) + interstitial_ad_unit_id: + android: 25b7c47878fcbf6a + ios: 4e7ba2c4921ecdfb + + # Rewards广告ID(变现提供) + rewards_ad_unit_id: + android: 3cd13a4e5c388e7b + ios: 2a65c75c3ed690b2 + + # Amazon广告的AppId(变现提供) + amz_app_id: + android: 22296b56-f6b3-4bee-9fd1-0cd6d5cc69bc + ios: 9fdfd4c0-3f34-4bd4-b9b4-1f649ff50a2a + + # Amazon广告的Banner Slot Id(变现提供) + banner_amz_slot_id: + android: 3c10ec33-a2bf-44be-ac9f-707853e63ff2 + ios: 7cb36f8a-2953-4f02-a1cb-ec3dfdf33878 + + # Amazon广告的Interstitial Slot Id(变现提供) + interstitial_amz_slot_id: + android: b7fac191-5986-4144-9fdb-691556b2e092 + ios: 82d23cfa-2b5d-4501-bfc3-1cd2b688ed41 + +# attr +# possessive: 购买后永久有效 +# consumable: 可消耗商品 +# subscriptions: 订阅类商品 +iap_profile: + # 去广告的 SKU(名称固定不可变,否则无法适配相关模块的去广告机制,内部sku值可改变) +# no_ads: +# android: so.a.iap.noads.699 +# ios: so.i.iap.noads.699 +# attr: possessive + + # 名字可自定义根据自身产品定义 + # coin200: + # android: so.a.iapc.coin.200 + # ios: so.i.iapc.coin.200 + # attr: consumable + +remote_config: + iads_config: '{"free_s":600,"win_count":4,"scene":"game_start|new_block|p2g|p2h|reset_keep|reset_scs|ads_break|double|nap","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}' + + rads_config: '{"win_count":3}' + + bads_config: '{"free_s":180,"win_count":1}' + +# adjust 相关配置 +adjust_profile: + # 对应adjust的appToken,必填项 + app_token: + android: fwbn7l32vpc0 + ios: xxakw3rgxnnk + + # 如果有对应的事件映射在这里统一定义 + event_map: + level_start: + android: hq0xzz + ios: b8khry + + in_app_purchase: + android: yzy3uh + ios: z0gje7 + revenue: true + + level_end: + android: so63k4 + ios: 1p8z5t + + tutorial_complete: + android: 95fu7q + ios: 1p8z5t + + diff --git a/guru_app/guru/guru_spec.yaml b/guru_app/guru/guru_spec.yaml new file mode 100644 index 0000000..4f7092c --- /dev/null +++ b/guru_app/guru/guru_spec.yaml @@ -0,0 +1,431 @@ +app_name: GuruApp + +flavor: "guru_test" + +# App接入GuruApp的基础信息(下面内容必填) +details: + # 中台接口上报时的app_id,影响中台push接入和后期的中台打点接入(必填) + saas_app_id: guruapp + + # 针对DynamicLink和Deeplink的判断(必填) + authority: demo.gurugame.fun + + # 对应Firebase项目中的基础链接(必填) + storage_prefix: https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o + + # 对应CDN云控中的默认cdn链接(必填) + default_cdn_prefix: https://cdn1.example.gurugame.fun + + # Android的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + android_gp_url: https://play.google.com/store/apps/details?id=app_package_id + + # IOS的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + ios_spp_store_url: + + # 隐私协议的链接(必填) + policy_url: https://solitaire.fungame.studio/policy.html + + # 隐私条款的链接(必填) + terms_url: https://solitaire.fungame.studio/termsofservice.html + + # 联系邮箱 (必填) + email_url: demo@gurugame.fun + + # Android Package Name (必填) + package_name: guru.app.demo + + # iOS Bundle Id (必填) + bundle_id: guru.app.demo + + # Facebook App Id + facebook_app_id: 123456789 + +deployment: + # AppProperty Cache的大小,默认是256 + property_cache_size: 512 + + # Paint.enableDithering,默认是true + enable_dithering: false + + # 禁用激励视频,默认是false + disable_rewards_ads: true + + # 是否启用 Analytics Statistic 统计 + enable_analytics_statistic: true + + # 是否自动恢复IAP购买数据 + auto_restore_iap: false + + # 初始的游戏币数量,默认是 0 + init_igc: 500 + + # igc(游戏内货币) 验证密钥混,int类型,防止igc被外部修改 + igc_balance_secret: 2654404609 + + # GuruApp Persistent Log 默认10M + log_file_size_limit: 10485760 + + # GuruApp Persistent Log 保存的个数,默认7个 + log_file_count: 7 + + # 使用persistent log的最小等级,最终 >= 该level的日志将会被存储到本地 + # verbose: 0 + # debug: 1 + # info: 2 + # warning: 3 + # error: 4 + # wtf: 5 + # nothing: 6 + persistent_log_level: 1 + + # ios 验证服务器的密码 + ios_validate_receipt_password: aa998877665544332211bb00cc + + + # 被标注的conversion点,在自打点库中将被以Emergency的优先级进行发送 + conversion_events: + - first_rads_rewarded + - level_end_success_1 + - level_end_success_6 + - level_end_success_10 + - level_end_success_12 + - level_end_success_15 + - level_up + - level_up_1 + - level_up_3 + - level_up_5 + - level_up_7 + - level_up_10 + - level_up_12 + - level_up_15 + - tch_ad_rev_roas_001 + - tutorial_complete + + api_connect_timeout: 15000 + + api_receive_timeout: 15000 + + # + # Sandbox lets you test subscription events, such as renewals, state changes, and interrupted purchases, + # without having to wait the length of the subscription duration. Once you added testers in sandbox, + # you can choose a subscription renewal speed for each tester to determine how quickly subscriptions renew. + # By default, accounts are set to a speed equalization of 1 month = 5 minutes, + # but you can slow down or speed up the renewal period, based on the options below. + # Subscriptions renew up to 12 times before auto-renewal turns off on the thirteenth renewal attempt. + # ┌───────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┐ + # │ Subscription │ Renewal every │ Renewal every │ Renewal every │ Renewal every │ Renewal every │ + # │ Duration │ 3 Minutes │ 5 Minutes │ 15 Minutes │ 30 Minutes │ Hour │ + # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ + # │ 1 Week │ 3 minutes │ 3 minutes │ 5 minutes │ 10 minutes │ 15 minutes │ + # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ + # │ 1 Month │ 3 minutes │ 5 minutes │ 15 minutes │ 30 minutes │ 1 hour │ + # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ + # │ 6 Months │ 18 minutes │ 30 minutes │ 90 minutes │ 3 hours │ 6 hours │ + # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ + # │ 1 Year │ 36 minutes │ 1 hour │ 3 hours │ 6 hours │ 12 hours │ + # └───────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┘ + # + # level 1: Renewal every 3 minutes per month + # level 2: Renewal every 5 minutes per month (default) + # level 3: Renewal every 15 minutes per month + # level 4: Renewal every 30 minutes per month + # level 5: Renewal every 1 hour per month + ios_sandbox_subs_renewal_speed: 2 + + # 是否使用广告合规初始化的逻辑,合规初始化是指先收集GDPR在初始化广告 + ads_compliant_initialization: false + + # 自动请求通知栏权限,默认是false + auto_request_notification_permission: false + + # 请求通知栏权限时的提示出发机制 + # rationale: 依赖Android原生的shouldShowRequestRationale返回值来展示对应的Rationale页面 + # request: 依赖请求的次数来展示对应的Rationale页面 + notification_permission_prompt_trigger: rationale + + # 是否追踪通知栏权限的通过率,默认是false。 + # 如果为true时将会上报对应noti_perm_req_`n`和noti_perm_pass_`n` + # n: 表示第几次请求 + # 注意!如果开启了追踪通知栏权限的通过率统计点位,那么firebase打点中将会出现`n`个noti_perm_req_`n`和noti_perm_pass_`n`这两个打点 + # 这里的n的限制需要配置tracking_notification_permission_pass_limit_times + tracking_notification_permission_pass: false + + # 如果追踪通知栏权限的通过率,这个值表示最大的追踪次数,超过最大次数后将不再追踪 + tracking_notification_permission_pass_limit_times: 10 + + # 是否打开GuruAnalytics的策略,默认是false + enabled_guru_analytics_strategy: false + + # 在RewardedAware中调用 showRewardedAd 方法时 + # 在激励视频不可用时,是否允许使用插屏做为替代奖励,默认是 false + # 注意:即使这里设置成 True,在你使用的页面 Controller中,要确保 with InterstitialAware + allow_interstitial_as_alternative_reward: false + + # 在 Banner 广告未成功加载的期间,填充一个内部的广告,可以是一个推广,一个内部的广告。 + # 它不会影响正常的广告展示逻辑,只要 Banner 广告正常加载,都会将其进行隐藏。 + # 因此它的优先级永远不会大于正常的 Banner 广告, 默认值是 false + show_internal_ads_when_banner_unavailable: true + +# 广告配置 +ads_profile: + # Banner广告ID(变现提供) + banner_ad_unit_id: + android: xxxxxxxxxxxxxxxx + ios: xxxxxxxxxxxxxxxx + + # Interstitial广告ID(变现提供) + interstitial_ad_unit_id: + android: xxxxxxxxxxxxxxxx + ios: xxxxxxxxxxxxxxxx + + # Rewards广告ID(变现提供) + rewards_ad_unit_id: + android: xxxxxxxxxxxxxxxx + ios: xxxxxxxxxxxxxxxx + + # Amazon广告的AppId(变现提供) + amz_app_id: + android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + # Amazon广告的Banner Slot Id(变现提供) + banner_amz_slot_id: + android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + # Amazon广告的Interstitial Slot Id(变现提供) + interstitial_amz_slot_id: + android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + rewarded_amz_slot_id: + android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + +remote_config: + # 保留配置,插屏广告相关配置 + iads_config: '{"free_s":600,"win_count":4,"scene":"game_start","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}' + + # 保留配置,激励广告相关配置 + rads_config: '{"win_count":3}' + + # 保留配置,Banner广告相关配置 + bads_config: '{"free_s":180,"win_count":1}' + + # 保留配置,打点相关配置 + analytics_config: '{"cap":"firebase|facebook|guru", "init_delay_s": 10}' + +products: + # sku + # 商品的ID,如果同时指定了android和ios,优先级sku为主 + # 支持参数定义,见下面的样例商品theme的sku + # + # android,ios + # 各个平台的SKU,如果指定了sku将忽略这两个选择 + # + # attr + # possessive: 购买后永久有效 + # consumable: 可消耗商品 + # subscriptions: 订阅类商品 + # + # method: + # 购买的方式,支持iap,igc,reward + # iap: 通过IAP购买的商品 + # igc: 通过虚拟游戏币购买的商品 + # reward: 通过奖励的方式获取的商品 + # 如果这个商品支持多种方式购买,可以通过逗号的形式进行串联 + # + # capabilities: + # 表示该商品的能力,现阶段只支持noAds + # + # manifest: + # 指购买该商品后所获得的清单 + # category: + # 该manifest的种类,这个主要用于后面的打点 + # 如果在guru_spec.yaml中定义相同的category,该category的名字必须能保证名字是不相似的, + # 如果出现名字相似的情况下,将会视为冲突,如:noAds和no_ads这类相似的名字都将无法生成 + # details,details1,details2...detailsN + # 指该商品的获取明细,如igc多少个,道具多少个 + # details中必须定义type和amount否则将无法生成 + # details中的type,现阶段系统预定义了igc(表示游戏内货币) + # 如果需要处理模板库不支持的类型,需要在使用模板库的时候添加相应的distributor + # 自定义参数 + # 可以指定不同的参数,也可以引用sku中的参数,见下面的样例商品theme的manifest + # 如果在guru_spec.yaml中定义相同的category的商品,自定义参数必须一至, + # 否则将无法生成 + # + + no_ads: + android: so.a.iap.noads.699 + ios: so.i.iap.noads.699 + attr: asset + method: iap,reward,igc + manifest: + category: "no_ads" + + no_ads_coin_bundle: + android: so.a.iap.noads.coin.799 + ios: so.i.iap.noads.coin.799 + attr: asset + method: iap + capabilities: noAds + manifest: + category: "no_ads" + details: + type: "igc" # in-game currency + amount: 500 + details1: + type: "cup" + amount: 1 + details2: + type: "frag" + amount: 20 + + theme: + sku: "theme_{theme_id}" + method: igc,reward + attr: possessive + manifest: + category: "theme_{1}" + theme_id: "{1}" + + # theme2: + # sku: "theme2_{theme_id}" + # method: igc,reward + # attr: possessive + # manifest: + # category: "theme" + # theme_id: "{1}" + # details: + # type: "theme" + # amount: 1 + # details2: + # type: "theme3" + # amount: 1 + + prop: + sku: "theme_{prop_id}_{pc_id}" + method: igc,reward + attr: possessive + manifest: + category: "prop" + details: + type: "prop" + amount: 1 + theme_id: "{1}" + details2: + type: "pc" + amount: 1 + theme_id: "{2}" + + no_ads2: + android: so.a.iap.noads.699 + ios: so.i.iap.noads.699 + attr: possessive + method: iap + capabilities: noAds + manifest: + category: no_ads + details: + type: no_ads + amount: 1 + ignore_sales: true + + coin200: + android: so.a.iapc.coin.200 + ios: so.i.iapc.coin.200 + method: iap + attr: consumable + points: true + manifest: + category: coin + details: + type: coin + amount: 200 + + stage_pack: + android: so.a.iap.stage.1 + ios: so.i.iap.stage.1 + attr: consumable + method: iap + manifest: + category: "stage_1" + details: + type: "stage" # in-game currency + amount: 1 + stage: 1 + + premium_week: + android: "m2.a.sub.premium" + ios: "m2.i.sub.premium.p1w" + attr: subscriptions + method: iap + capabilities: noAds + base_plan: weekly + group: premium + offers: + - freetrial + - discount + manifest: + category: "sub" + details: + type: "igc" + amount: 8000 + + premium_year: + android: "m2.a.sub.premium" + ios: "m2.i.sub.premium.p1y" + attr: subscriptions + method: iap + capabilities: noAds + base_plan: yearly + group: premium + offers: + - freetrial + - discount + manifest: + category: "sub" + details: + type: "igc" + amount: 16000 + + theme_mul: + sku: "theme_{category}_{theme_id}" + attr: possessive + method: igc + manifest: + category: "{1}" + theme_id: "{2}" + cate: "{1}" + +# adjust 相关配置 +adjust_profile: + # 对应adjust的appToken,必填项 + app_token: + android: testapptoken + ios: testapptoken + + # 如果有对应的事件映射在这里统一定义 + event_map: + level_start: + android: hq0xzz + ios: b8khry + + iap_purchase: + android: yzy3uh + ios: z0gje7 + params: true + sub_purchase: + android: yzy3uh + ios: z0gje7 + params: true + + level_end: + android: so63k4 + ios: 1p8z5t + + tutorial_complete: + android: 95fu7q + ios: 1p8z5t + diff --git a/guru_app/guru/spider/guru_spec.yaml b/guru_app/guru/spider/guru_spec.yaml new file mode 100644 index 0000000..9794155 --- /dev/null +++ b/guru_app/guru/spider/guru_spec.yaml @@ -0,0 +1,151 @@ +app_name: Spider + +flavor: Spider + +# App接入GuruApp的基础信息(下面内容必填) +details: + # 中台接口上报时的app_id,影响中台push接入和后期的中台打点接入(必填) + saas_app_id: spider + + # 针对DynamicLink和Deeplink的判断(必填) + authority: solitaire.fungame.studio + + # 对应Firebase项目中的基础链接(必填) + storage_prefix: https://firebasestorage.googleapis.com/v0/b/solitaire-66fbf.appspot.com/o + + # 对应CDN云控中的默认cdn链接(必填) + default_cdn_prefix: https://cdn1.solitaire.fungame.studio + + # Android的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + android_gp_url: https://play.google.com/store/apps/details?id=solitaire.patience.card.games.klondike.free + + # IOS的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) + ios_spp_store_url: + + # 隐私协议的链接(必填) + policy_url: https://solitaire.fungame.studio/policy.html + + # 隐私条款的链接(必填) + terms_url: https://solitaire.fungame.studio/termsofservice.html + + # 联系邮箱 (必填) + email_url: card@fungame.studio + + # Android Package Name + package_name: guru.app.demo + + # iOS Bundle Id + bundle_id: guru.app.demo + + # Facebook App Id + facebook_app_id: 987654321 + +deployment: + # AppProperty Cache的大小,默认是256 + property_cache_size: 512 + + # Paint.enableDithering,默认是true + enable_dithering: false + + # 禁用激励视频,默认是false + disable_rewards_ads: true + + +# 广告配置 +ads_profile: + # Banner广告ID(变现提供) + banner_ad_unit_id: + android: a1dc70299fd5d487 + ios: 97da0e2028ba80b7 + + # Interstitial广告ID(变现提供) + interstitial_ad_unit_id: + android: 25b7c47878fcbf6a + ios: 4e7ba2c4921ecdfb + + # Rewards广告ID(变现提供) + rewards_ad_unit_id: + android: 3cd13a4e5c388e7b + ios: 2a65c75c3ed690b2 + + # Amazon广告的AppId(变现提供) + amz_app_id: + android: 22296b56-f6b3-4bee-9fd1-0cd6d5cc69bc + ios: 9fdfd4c0-3f34-4bd4-b9b4-1f649ff50a2a + + # Amazon广告的Banner Slot Id(变现提供) + banner_amz_slot_id: + android: 3c10ec33-a2bf-44be-ac9f-707853e63ff2 + ios: 7cb36f8a-2953-4f02-a1cb-ec3dfdf33878 + + # Amazon广告的Interstitial Slot Id(变现提供) + interstitial_amz_slot_id: + android: b7fac191-5986-4144-9fdb-691556b2e092 + ios: 82d23cfa-2b5d-4501-bfc3-1cd2b688ed41 + +# attr +# asset(or possessive): 购买后永久有效 +# consumable: 可消耗商品 +# subscriptions: 订阅类商品 + +# capabilities +# noAds +products: + # 去广告的 SKU(名称固定不可变,否则无法适配相关模块的去广告机制,内部sku值可改变) + no_ads: + android: so.a.iap.noads.699 + ios: so.i.iap.noads.699 + attr: possessive + capabilities: noAds + + # 名字可自定义根据自身产品定义 + coin200: + android: so.a.iapc.coin.200 + ios: so.i.iapc.coin.200 + attr: consumable + + theme: + sku: "theme_{theme_id}" + method: igc,reward + attr: possessive + manifest: + category: "{1}" + theme_id: "{1}" + details: + type: "theme" + amount: 1 + +remote_config: + iads_config: '{"free_s":600,"win_count":4,"scene":"game_start|new_block|p2g|p2h|reset_keep|reset_scs|ads_break|double|nap","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}' + + rads_config: '{"win_count":3}' + + bads_config: '{"free_s":180,"win_count":1}' + +# adjust 相关配置 +adjust_profile: + # 对应adjust的appToken,必填项 + app_token: + android: fwbn7l32vpc0 + ios: xxakw3rgxnnk + + # 如果有对应的事件映射在这里统一定义 + event_map: + level_start: + android: hq0xzz + ios: b8khry + + in_app_purchase: + android: yzy3uh + ios: z0gje7 + revenue: true + + level_end: + android: so63k4 + ios: 1p8z5t + + tutorial_complete: + android: 95fu7q + ios: 1p8z5t + + diff --git a/guru_app/lib/account/account_auth_extension.dart b/guru_app/lib/account/account_auth_extension.dart new file mode 100644 index 0000000..06e5155 --- /dev/null +++ b/guru_app/lib/account/account_auth_extension.dart @@ -0,0 +1,51 @@ +/// Created by Haoyi on 2021/7/26 + +part of "account_manager.dart"; + +extension AccountAuthExtension on AccountManager { + Future _authenticate(SaasUser saasUser, + {bool canRefreshFirebaseToken = true}) async { + User? firebaseUser; + SaasUser newSaasUser = saasUser; + firebaseUser = await _authenticateFirebase(saasUser).catchError((error) { + Log.e("_authenticateFirebase error! $error", tag: "Account"); + return null; + }); + if (firebaseUser == null && canRefreshFirebaseToken) { + try { + newSaasUser = await _refreshFirebaseToken(saasUser); + return _authenticate(newSaasUser, canRefreshFirebaseToken: false); + } catch (error, stacktrace) { + return AccountAuth(saasUser, null); + } + } + + return AccountAuth(newSaasUser, firebaseUser); + } + + Future _refreshFirebaseToken(SaasUser oldSaasUser) async { + return await GuruApi.instance + .renewFirebaseToken() + .then((tokenData) => oldSaasUser.copyWith(firebaseToken: tokenData.firebaseToken)); + } + + Future _authenticateFirebase(SaasUser saasUser) async { + int retry = 0; + dynamic lastError; + while (retry < 1) { + try { + Log.i("[$retry] _authenticateFirebase:${saasUser.firebaseToken}", tag: "Account"); + + return await FirebaseAuth.instance + .signInWithCustomToken(saasUser.firebaseToken) + .then((result) => result.user); + } catch (error, stacktrace) { + await Future.delayed(const Duration(milliseconds: 600)); + retry++; + Log.i("[$retry] _authenticateFirebase error :$error, $stacktrace", tag: "Account"); + lastError = error; + } + } + throw lastError ?? ("_authenticateFirebase error!"); + } +} diff --git a/guru_app/lib/account/account_data_store.dart b/guru_app/lib/account/account_data_store.dart new file mode 100644 index 0000000..53fc9bd --- /dev/null +++ b/guru_app/lib/account/account_data_store.dart @@ -0,0 +1,124 @@ +import 'dart:convert'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:guru_app/account/model/account_profile.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/api/guru_api.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/device/device_info.dart'; +import 'package:guru_utils/extensions/extensions.dart'; + +import 'package:http/http.dart' as http; + +/// Created by Haoyi on 6/3/21 +/// +enum AccountDataStatus { idle, initializing, initialized, waiting, error } + +class AccountDataStore { + static final AccountDataStore instance = AccountDataStore._(); + + final BehaviorSubject _deviceInfoSubject = BehaviorSubject.seeded(null); + final BehaviorSubject _saasUserSubject = BehaviorSubject.seeded(null); + final BehaviorSubject _firebaseUser = BehaviorSubject.seeded(null); + final BehaviorSubject _accountProfile = BehaviorSubject.seeded(null); + final BehaviorSubject _accountDataStatus = + BehaviorSubject.seeded(AccountDataStatus.idle); + int initRetryCount = 0; + + Stream get observableAccountProfile => _accountProfile.stream; + + // final EnvConfig envConfig; + + AccountDataStore._(); + + String? get saasToken => _saasUserSubject.value?.token; + + String? get uid => _saasUserSubject.value?.uid; + + AccountProfile? get accountProfile => _accountProfile.value; + + String? get nickname => _accountProfile.value?.nickname; + + String? get countryCode => _accountProfile.value?.countryCode; + + SaasUser? get user => _saasUserSubject.value; + + String? get avatar => _accountProfile.value?.avatar; + + DeviceInfo? get currentDevice => _deviceInfoSubject.value; + + AccountDataStatus get accountDataStatus => _accountDataStatus.value; + + bool get initialized => _accountDataStatus.value == AccountDataStatus.initialized; + + Stream get observableInitialized => + _accountDataStatus.stream.map((status) => status == AccountDataStatus.initialized); + + Stream get observableSaasUser => _saasUserSubject.stream; + + void dispose() { + _deviceInfoSubject.close(); + _saasUserSubject.close(); + _firebaseUser.close(); + _accountProfile.close(); + } + + Future signInAnonymousInLocked() async { + // 这里需要使用原始的http post请求。否则这里将会死锁DIO所有请求 + final secret = await AppProperty.getInstance().getAnonymousSecretKey(); + final headers = { + "X-APP-ID": GuruApp.instance.details.saasAppId, + "content-type": "application/json" + }; + try { + final uri = Uri.parse("${GuruApi.saasApiHost}/auth/api/v1/tokens/provider/secret"); + final response = await http + .post(uri, + headers: headers, + body: jsonEncode(AnonymousLoginReqBody(secret: secret)), + encoding: utf8) + .timeout(const Duration(seconds: 30)); + final data = const Utf8Decoder().convert(response.bodyBytes); + if (data.isNotEmpty) { + final result = json.decode(data); + return SaasUser.fromJson(result["data"]); + } + } catch (error, stacktrace) { + Log.v("signInAnonymousInLocked error:$error", tag: "Account"); + } + return null; + } + + Future refreshAuth() async { + final saasUser = await signInAnonymousInLocked(); + if (saasUser != null) { + updateSaasUser(saasUser); + } + } + + void updateDeviceInfo(DeviceInfo deviceInfo) { + _deviceInfoSubject.addEx(deviceInfo); + } + + void updateSaasUser(SaasUser saasUser) { + _saasUserSubject.addEx(saasUser); + + if (saasUser.createAtTimestamp > 0) { + GuruAnalytics.instance + .setUserProperty("user_created_timestamp", saasUser.createAtTimestamp.toString()); + } + } + + void updateFirebaseUser(User user) { + _firebaseUser.addEx(user); + } + + void updateAccountProfile(AccountProfile profile) { + _accountProfile.addEx(profile); + } + + bool transitionTo(AccountDataStatus status, {AccountDataStatus? expectStatus}) { + return _accountDataStatus.addIfChanged(status); + } +} diff --git a/guru_app/lib/account/account_manager.dart b/guru_app/lib/account/account_manager.dart new file mode 100644 index 0000000..1527813 --- /dev/null +++ b/guru_app/lib/account/account_manager.dart @@ -0,0 +1,161 @@ +import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/account/model/account.dart'; +import 'package:guru_app/account/model/account_profile.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/api/guru_api.dart'; +import 'package:guru_app/firebase/firebase.dart'; +import 'package:guru_app/firebase/firestore/firestore_manager.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/settings/guru_settings.dart'; +import 'package:guru_utils/collection/collectionutils.dart'; +import 'package:guru_utils/core/ext.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/device/device_info.dart'; +import 'package:guru_utils/device/device_utils.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/network/network_utils.dart'; + +/// Created by Haoyi on 6/3/21 +/// +/// +part "account_service_extension.dart"; + +part "account_auth_extension.dart"; + +class ModifyNicknameException implements Exception { + final String? message; + final dynamic cause; + + ModifyNicknameException(this.message, {this.cause}); + + @override + String toString() { + return "ModifyNicknameException: $message cause:$cause"; + } +} + +class ModifyLevelException implements Exception { + final String? message; + final dynamic cause; + + ModifyLevelException(this.message, {this.cause}); + + @override + String toString() { + return "ModifyLevelException: $message cause:$cause"; + } +} + +class AccountManager { + final AccountDataStore accountDataStore; + + // final FirestoreService firestoreService; + + Timer? retryTimer; + + static AccountManager instance = AccountManager(); + + AccountManager() : accountDataStore = AccountDataStore.instance; + + Future init({Completer? completer}) async { + try { + final result = accountDataStore.transitionTo(AccountDataStatus.initializing); + if (!result) { + Log.w( + "init account error, current initializing! please wait result! retry[${accountDataStore.initRetryCount}]", + tag: "Account"); + return; + } + retryTimer?.cancel(); + final account = await AppProperty.getInstance().loadAccount(); + final restoreResult = await _restoreAccount(account); + if (!restoreResult) { + Log.v("init account error: restoreAccount error! retry[${accountDataStore.initRetryCount}]", + tag: "Account"); + _retry(); + } else { + accountDataStore.initRetryCount = 0; + accountDataStore.transitionTo(AccountDataStatus.initialized); + Log.v("init account success!", tag: "Account"); + } + } catch (error, stacktrace) { + completer?.complete(error); + Log.v("init account error retry[${accountDataStore.initRetryCount}]:$error $stacktrace", + tag: "Account"); + _retry(); + } + completer?.complete(true); + } + + void _retry() { + final intervalSeconds = (accountDataStore.initRetryCount * 2 + 8).clamp(8, 30); + retryTimer?.cancel(); + accountDataStore.transitionTo(AccountDataStatus.waiting); + retryTimer = Timer(Duration(seconds: intervalSeconds), () { + init(); + accountDataStore.initRetryCount++; + }); + } + + Future updateLocalProfile(Map modifiedJson) async { + modifiedJson[AccountProfile.dirtyField] = true; + final dirtyAccountProfile = accountDataStore.accountProfile?.merge(modifiedJson) ?? + AccountProfile.fromJson(modifiedJson); + AppProperty.getInstance().setAccountProfile(dirtyAccountProfile); + accountDataStore.updateAccountProfile(dirtyAccountProfile); + } + + Future modifyProfile( + {String? nickname, + String? avatar, + String? countryCode, + Map userData = const {}}) async { + int retryCount = 2; + Log.i("modifyProfile $nickname $avatar $countryCode", syncFirebase: true, tag: "Account"); + if (nickname == null && avatar == null && countryCode == null && userData.isEmpty) { + return false; + } + final now = DateTimeUtils.currentTimeInMillis(); + final modifiedJson = CollectionUtils.filterOutNulls({ + AccountProfile.uidField: accountDataStore.uid, + AccountProfile.nicknameField: nickname, + AccountProfile.countryField: countryCode?.toLowerCase(), + AccountProfile.avatarField: avatar, + AccountProfile.updateAtField: now, + AccountProfile.versionField: GuruSettings.instance.version.get(), + AccountProfile.roleField: + GuruSettings.instance.debugMode.get() == true ? UserAttr.tester : UserAttr.real, + AccountProfile.dirtyField: true, + ...userData + }); + await updateLocalProfile(modifiedJson); + + while ((await NetworkUtils.isNetworkConnected()) && retryCount-- > 0) { + final accountProfile = + await FirestoreManager.instance.modifyProfile(modifiedJson).onError((error, stackTrace) { + Log.i("modifyProfile error!:$error"); + GuruAnalytics.instance.logException(ModifyLevelException("modifyProfile error!:$error"), + stacktrace: stackTrace); + return null; + }); + if (accountProfile != null) { + Log.i("modifyProfile success! $accountProfile", tag: "Account"); + AppProperty.getInstance().setAccountProfile(accountProfile); + accountDataStore.updateAccountProfile(accountProfile); + return true; + } else { + Log.i("[$retryCount] modify profile error!", tag: "Account"); + await authenticate().timeout(const Duration(seconds: 15)).catchError((error, stackTrace) { + Log.i("re-authenticate error:$error", stackTrace: stackTrace, tag: "Account"); + }); + await Future.delayed(const Duration(seconds: 1)); + } + } + + return false; + } +} diff --git a/guru_app/lib/account/account_service_extension.dart b/guru_app/lib/account/account_service_extension.dart new file mode 100644 index 0000000..4fd7bfa --- /dev/null +++ b/guru_app/lib/account/account_service_extension.dart @@ -0,0 +1,151 @@ +/// Created by Haoyi on 6/3/21 + +part of "account_manager.dart"; + +extension AccountServiceExtension on AccountManager { + Future _restoreAccount(Account account) async { + SaasUser? saasUser = account.saasUser; + Log.d("restoreAccount $saasUser", tag: "Account"); + saasUser ??= await signInWithAnonymous().catchError((error, stacktrace) { + Log.v("signInWithAnonymous error:$error, $stacktrace"); + return null; + }); + + Log.v("_restoreAccount saasUser:$saasUser", tag: "Account"); + final device = account.device; + if (device != null) { + _updateDevice(device); + } + + final accountProfile = account.accountProfile; + if (accountProfile != null) { + _updateAccountProfile(accountProfile); + } + + if (saasUser != null) { + _updateSaasUser(saasUser); + await _verifyOrReportAuthDevice(saasUser); + final auth = await authenticate(); + if (auth == null) { + return false; + } + if (accountProfile != null) { + await _checkOrUploadAccountProfile(accountProfile); + } + return true; + } else { + return false; + } + } + + Future authenticate() async { + final saasUser = accountDataStore.user; + if (saasUser == null) { + return null; + } + try { + final auth = await _authenticate(saasUser); + final newSaasUser = auth.user; + if (newSaasUser != null && !saasUser.isSame(newSaasUser)) { + _updateSaasUser(newSaasUser); + } + if (auth.firebaseUser != null) { + _updateFirebaseUser(auth.firebaseUser!); + Log.i("_updateFirebaseUser success!", tag: "Account"); + } + return auth; + } catch (error, stacktrace) { + GuruAnalytics.instance.logException(error, stacktrace: stacktrace); + } + return null; + } + + Future _buildDevice(SaasUser saasUser) async { + final DeviceInfo? deviceInfo = await AppProperty.getInstance().getAccountDevice(); + final firebasePushToken = await RemoteMessagingManager.instance.getToken(); + + if (firebasePushToken != null) { + final deviceId = await AppProperty.getInstance().getDeviceId(); + final newDeviceInfo = await DeviceUtils.buildDeviceInfo( + deviceId: deviceId, firebasePushToken: firebasePushToken, uid: saasUser.uid); + return DeviceTrack(newDeviceInfo, deviceInfo); + } + return DeviceTrack(null, deviceInfo); + } + + Future signInWithAnonymous() async { + final anonymousSecretKey = await AppProperty.getInstance().getAnonymousSecretKey(); + return GuruApi.instance.signInWithAnonymous(secret: anonymousSecretKey); + } + + Future _verifyOrReportAuthDevice(SaasUser saasUser) async { + final deviceTrack = await _buildDevice(saasUser); + final latestReportDeviceTimestamp = + await AppProperty.getInstance().getLatestReportDeviceTimestamp(); + final elapsedInterval = DateTimeUtils.currentTimeInMillis() - latestReportDeviceTimestamp; + final isChanged = (elapsedInterval > DateTimeUtils.sixHourInMillis) || deviceTrack.isChanged; + final reportDevice = deviceTrack.device; + final deviceId = deviceTrack.device?.deviceId ?? ""; + if (deviceId.isNotEmpty) { + GuruAnalytics.instance.setDeviceId(deviceId); + } + if (isChanged && reportDevice?.isValid == true && saasUser.isValid == true) { + final result = await GuruApi.instance.reportDevice(reportDevice!).then((_) { + return true; + }).catchError((error) { + Log.i("reportDevice error:$error", tag: "Account"); + return false; + }); + if (result) { + reportDevice.dumpDevice(msg: "REPORT DEVICE SUCCESS"); + _updateDevice(reportDevice); + AppProperty.getInstance() + .setLatestReportDeviceTimestamp(DateTimeUtils.currentTimeInMillis()); + AppProperty.getInstance().setAccountDevice(reportDevice); + } + } + } + + Future _checkOrUploadAccountProfile(AccountProfile accountProfile) async { + bool upload = accountProfile.dirty; + + String? changedCountryCode = DeviceUtils.buildLocaleInfo().countryCode.toLowerCase(); + if (DartExt.isBlank(changedCountryCode) || accountProfile.countryCode == changedCountryCode) { + changedCountryCode = null; + } else { + upload = true; + } + + Log.d( + "_checkOrUploadAccountProfile dirty:${accountProfile.dirty} upload:$upload $changedCountryCode", + tag: "Account"); + if (upload) { + await modifyProfile(countryCode: changedCountryCode); + } + } + + void refreshFcmToken() { + final saasUser = accountDataStore.user; + if (saasUser != null) { + _verifyOrReportAuthDevice(saasUser); + } + } + + void _updateDevice(DeviceInfo device) { + accountDataStore.updateDeviceInfo(device); + } + + void _updateSaasUser(SaasUser saasUser) { + accountDataStore.updateSaasUser(saasUser); + AppProperty.getInstance().setAccountSaasUser(saasUser); + GuruAnalytics.instance.setUserId(saasUser.uid); + } + + void _updateFirebaseUser(User user) { + accountDataStore.updateFirebaseUser(user); + } + + void _updateAccountProfile(AccountProfile accountProfile) { + accountDataStore.updateAccountProfile(accountProfile); + } +} diff --git a/guru_app/lib/account/model/account.dart b/guru_app/lib/account/model/account.dart new file mode 100644 index 0000000..594be12 --- /dev/null +++ b/guru_app/lib/account/model/account.dart @@ -0,0 +1,40 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:guru_app/account/model/account_profile.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_utils/device/device_info.dart'; + + +/// Created by Haoyi on 6/3/21 + +class Account { + final SaasUser? saasUser; + final DeviceInfo? device; + final AccountProfile? accountProfile; + final User? firebaseUser; + + String? get uid => saasUser?.uid; + + String? get nickname => accountProfile?.nickname; + + Account.restore({this.saasUser, this.device, this.accountProfile, this.firebaseUser}); +} + +class AccountAuth { + final SaasUser? user; + final User? firebaseUser; + + AccountAuth(this.user, this.firebaseUser); + + bool get isValid => uid != null && uid != ""; + + String? get saasToken => user?.token; + + String? get uid => user?.uid; + + bool get existsFirebaseUser => firebaseUser != null; + + @override + String toString() { + return 'AccountAuth{user: $user, firebaseUser: $firebaseUser}'; + } +} diff --git a/guru_app/lib/account/model/account_profile.dart b/guru_app/lib/account/model/account_profile.dart new file mode 100644 index 0000000..5d5d887 --- /dev/null +++ b/guru_app/lib/account/model/account_profile.dart @@ -0,0 +1,135 @@ +import 'package:json_annotation/json_annotation.dart'; + +/// Created by Haoyi on 2021/7/28 +/// + +part "account_profile.g.dart"; + +class AccountRole { + static const normal = 0; + static const tester = 10; + static const machine = 100; +} + +// 这里没有使用genericArgumentFactories是外部构造方法都需要单独提供解析器。 +// 这样做的好处是可以flatten到同级数据 +@JsonSerializable() +class AccountProfile { + static const String uidField = "uid"; + static const String nicknameField = "nickname"; + static const String countryField = "country"; + static const String bestScoreField = "score"; + static const String avatarField = "avatar"; + static const String versionField = "ver"; + static const String updateAtField = "upt"; + static const String dirtyField = "dirty"; + static const String roleField = "role"; + + static final _generalFieldSet = { + uidField, + nicknameField, + countryField, + bestScoreField, + avatarField, + versionField, + updateAtField, + dirtyField, + roleField + }; + + @JsonKey(name: uidField, defaultValue: "") + final String uid; + + @JsonKey(name: nicknameField, defaultValue: "") + final String nickname; + + @JsonKey(name: countryField, defaultValue: "") + final String countryCode; + + @JsonKey(name: avatarField, defaultValue: "") + final String avatar; + + @JsonKey(name: versionField, defaultValue: "") + final String version; + + @JsonKey(name: dirtyField, defaultValue: false) + final bool dirty; + + @JsonKey(name: updateAtField, defaultValue: 0) + final int updateAt; + + @JsonKey(name: roleField, defaultValue: 0) + final int role; + + @JsonKey(ignore: true) + final Map userData; + + const AccountProfile._({this.uid = "", + this.nickname = "", + this.countryCode = "", + this.avatar = "avatar_1", + this.version = "", + this.dirty = false, + this.role = AccountRole.normal, + this.userData = const {}, + this.updateAt = 0}); + + static const AccountProfile empty = AccountProfile._(); + + AccountProfile({this.uid = "", + this.nickname = "", + this.countryCode = "", + this.avatar = "avatar_1", + this.version = "", + this.dirty = false, + this.role = AccountRole.normal, + Map userData = const {}, + this.updateAt = 0}) : userData = Map.from(userData); + + + factory AccountProfile.fromJson(Map json) => + _$AccountProfileFromJson(json) + ..userData.addAll(_validateUserData(json, direct: false)); + + Map toJson() => + _$AccountProfileToJson(this) + ..addAll(_validateUserData(userData)); + + static Map _validateUserData(Map data, {bool direct = true}) { + return (direct ? data : Map.from(data)) + ..removeWhere((key, value) => _generalFieldSet.contains(key)); + } + + AccountProfile copyWith({String? nickname, + String? countryCode, + String? avatar, + String? version, + bool? dirty, + int? role, + Map? userData, + bool mergeUserData = true}) { + final changedUserData = {if (mergeUserData) ...this.userData}; + if (userData != null) { + changedUserData.addAll(userData); + } + return AccountProfile( + uid: uid, + nickname: nickname ?? this.nickname, + countryCode: countryCode ?? this.countryCode, + avatar: avatar ?? this.avatar, + version: version ?? this.version, + role: role ?? this.role, + userData: changedUserData, + dirty: dirty ?? this.dirty); + } + + AccountProfile merge(Map replaceJson) { + return AccountProfile.fromJson(toJson() + ..addAll(replaceJson)); + } + + @override + String toString() { + return 'AccountProfile{nickname: $nickname, countryCode: $countryCode}'; + } +} diff --git a/guru_app/lib/account/model/account_profile.g.dart b/guru_app/lib/account/model/account_profile.g.dart new file mode 100644 index 0000000..f31ad18 --- /dev/null +++ b/guru_app/lib/account/model/account_profile.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'account_profile.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AccountProfile _$AccountProfileFromJson(Map json) => + AccountProfile( + uid: json['uid'] as String? ?? '', + nickname: json['nickname'] as String? ?? '', + countryCode: json['country'] as String? ?? '', + avatar: json['avatar'] as String? ?? '', + version: json['ver'] as String? ?? '', + dirty: json['dirty'] as bool? ?? false, + role: json['role'] as int? ?? 0, + updateAt: json['upt'] as int? ?? 0, + ); + +Map _$AccountProfileToJson(AccountProfile instance) => + { + 'uid': instance.uid, + 'nickname': instance.nickname, + 'country': instance.countryCode, + 'avatar': instance.avatar, + 'ver': instance.version, + 'dirty': instance.dirty, + 'upt': instance.updateAt, + 'role': instance.role, + }; diff --git a/guru_app/lib/account/model/user.dart b/guru_app/lib/account/model/user.dart new file mode 100644 index 0000000..af8844b --- /dev/null +++ b/guru_app/lib/account/model/user.dart @@ -0,0 +1,99 @@ +import 'package:json_annotation/json_annotation.dart'; + +/// Created by Haoyi on 6/3/21 + +part 'user.g.dart'; + +@JsonSerializable() +class SaasUser { + @JsonKey(name: 'uid', defaultValue: "") + final String uid; + + @JsonKey(name: 'token', defaultValue: "") + final String token; + + @JsonKey(name: 'firebaseToken', defaultValue: "") + final String firebaseToken; + + @JsonKey(name: 'createdAtTimestamp', defaultValue: 0) + final int createAtTimestamp; + + // bool get isAnonymous => (type == null) || (type == LOGIN_WITH_ANONYMOUS); + + bool get isValid => + (uid != "") && (token.isNotEmpty == true) && (firebaseToken.isNotEmpty == true); + + SaasUser( + {required this.uid, + required this.token, + required this.firebaseToken, + this.createAtTimestamp = 0}); + + factory SaasUser.fromJson(Map json) => _$SaasUserFromJson(json); + + Map toJson() => _$SaasUserToJson(this); + + SaasUser copyWith({String? firebaseToken, String? token}) { + return SaasUser( + uid: uid, token: token ?? this.token, firebaseToken: firebaseToken ?? this.firebaseToken); + } + + bool isSame(SaasUser? user) { + return uid == user?.uid && + token == user?.token && + firebaseToken == user?.firebaseToken && + createAtTimestamp == user?.createAtTimestamp; + } + + @override + String toString() { + return 'SaasUser{uid: $uid, token: $token, firebaseToken: $firebaseToken, createAtTimestamp: $createAtTimestamp}'; + } +} + +// 匿名登录请求数据 +@JsonSerializable() +class AnonymousLoginReqBody { + @JsonKey(name: 'secret', defaultValue: "") + final String secret; + + AnonymousLoginReqBody({required this.secret}); + + // @override + // String toString() { + // return "{secret: '$secret'}"; + // } + + factory AnonymousLoginReqBody.fromJson(Map json) => + _$AnonymousLoginReqBodyFromJson(json); + + Map toJson() => _$AnonymousLoginReqBodyToJson(this); +} + +@JsonSerializable() +class FirebaseTokenData { + @JsonKey(name: 'uid', defaultValue: "") + final String uid; + + @JsonKey(name: 'firebaseToken', defaultValue: "") + final String firebaseToken; + + FirebaseTokenData({required this.uid, required this.firebaseToken}); + + factory FirebaseTokenData.fromJson(Map json) => + _$FirebaseTokenDataFromJson(json); + + Map toJson() => _$FirebaseTokenDataToJson(this); + + @override + String toString() { + return 'FirebaseTokenData{uid: $uid, firebaseToken: $firebaseToken}'; + } +} + + +class UserAttr { + static const real = 0; + static const tester = 10; + static const machine = 100; +} \ No newline at end of file diff --git a/guru_app/lib/account/model/user.g.dart b/guru_app/lib/account/model/user.g.dart new file mode 100644 index 0000000..ff09843 --- /dev/null +++ b/guru_app/lib/account/model/user.g.dart @@ -0,0 +1,45 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +SaasUser _$SaasUserFromJson(Map json) => SaasUser( + uid: json['uid'] as String? ?? '', + token: json['token'] as String? ?? '', + firebaseToken: json['firebaseToken'] as String? ?? '', + createAtTimestamp: json['createdAtTimestamp'] as int? ?? 0, + ); + +Map _$SaasUserToJson(SaasUser instance) => { + 'uid': instance.uid, + 'token': instance.token, + 'firebaseToken': instance.firebaseToken, + 'createdAtTimestamp': instance.createAtTimestamp, + }; + +AnonymousLoginReqBody _$AnonymousLoginReqBodyFromJson( + Map json) => + AnonymousLoginReqBody( + secret: json['secret'] as String? ?? '', + ); + +Map _$AnonymousLoginReqBodyToJson( + AnonymousLoginReqBody instance) => + { + 'secret': instance.secret, + }; + +FirebaseTokenData _$FirebaseTokenDataFromJson(Map json) => + FirebaseTokenData( + uid: json['uid'] as String? ?? '', + firebaseToken: json['firebaseToken'] as String? ?? '', + ); + +Map _$FirebaseTokenDataToJson(FirebaseTokenData instance) => + { + 'uid': instance.uid, + 'firebaseToken': instance.firebaseToken, + }; diff --git a/guru_app/lib/ads/ads_global_property.dart b/guru_app/lib/ads/ads_global_property.dart new file mode 100644 index 0000000..f38e2fb --- /dev/null +++ b/guru_app/lib/ads/ads_global_property.dart @@ -0,0 +1,12 @@ +part of 'ads_manager.dart'; + +/// Created by Haoyi on 2022/4/28 + +extension AdsGlobalProperty on AdsManager { + int get latestFullscreenAdsHiddenTimestamps => + adsGlobalProperties["latestFullscreenAdsHiddenTimestamps"] as int? ?? 0; + + set latestFullscreenAdsHiddenTimestamps(int ts) { + adsGlobalProperties["latestFullscreenAdsHiddenTimestamps"] = ts; + } +} diff --git a/guru_app/lib/ads/ads_manager.dart b/guru_app/lib/ads/ads_manager.dart new file mode 100644 index 0000000..e02c4a6 --- /dev/null +++ b/guru_app/lib/ads/ads_manager.dart @@ -0,0 +1,636 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_app/ads/applovin/banner/applovin_banner_ads.dart'; +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_app/ads/core/ads_impression.dart'; +import 'package:guru_app/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart'; +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/iap/iap_manager.dart'; +import 'package:guru_app/financial/iap/iap_model.dart'; +import 'package:guru_app/firebase/remoteconfig/remote_config_manager.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_utils/lifecycle/lifecycle_manager.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_app/property/settings/guru_settings.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/tuple/tuple.dart'; +import 'package:guru_utils/ads/ads.dart'; + +import 'applovin/interstitial/applovin_interstitial_ads.dart'; +import 'applovin/rewarded/applovin_rewarded_ads.dart'; +import 'utils/ads_exception.dart'; +import 'package:device_info_plus/device_info_plus.dart'; + +part 'ads_global_property.dart'; + +/// Created by Haoyi on 2022/3/2 + +class AdsManager extends AdsManagerDelegate { + static final AdsManager _instance = AdsManager._(); + + static AdsManager get instance => _instance; + + AdsManager._(); + + final Map interstitialAds = {}; + + final Map rewardsAds = {}; + + final AdImpressionController adImpressionController = AdImpressionController(); + + final BehaviorSubject _adsConfigSubject = + BehaviorSubject.seeded(AdsConfig.defaultAdsConfig); + + final BehaviorSubject _adsProfileSubject = + BehaviorSubject.seeded(GuruApp.instance.adsProfile); + + final BehaviorSubject _initializedSubject = BehaviorSubject.seeded(false); + + final BehaviorSubject connectivityStatusSubject = + BehaviorSubject.seeded(ConnectivityResult.none); + + final BehaviorSubject noBannerAndInterstitialAdsSubject = BehaviorSubject.seeded(false); + + final Map adsGlobalProperties = {}; + + static const Set _reservedKeywords = { + "app_version", + "lt", + "paid", + "blv", + "os_version", + "connection" + }; + + static const List ltSamples = [0, 1, 2, 3, 4, 5, 6, 14, 30, 60, 90, 120, 180]; + + @override + Stream get observableInitialized => _initializedSubject.stream; + + Stream get observableConnectivityStatus => connectivityStatusSubject.stream; + + @override + Stream get observableNoAds => noBannerAndInterstitialAdsSubject.stream; + + final CompositeSubscription subscriptions = CompositeSubscription(); + + AdsProfile get adsProfile => _adsProfileSubject.value; + + AdsConfig get adsConfig => _adsConfigSubject.value; + + bool get hasAmazonBannerAds => adsConfig.bannerConfig.amazonEnable; + + bool get hasAmazonInterstitialAds => adsConfig.interstitialConfig.amazonEnable; + + bool get hasAmazonAds => hasAmazonBannerAds || hasAmazonInterstitialAds; + + ConnectivityResult get connectivityStatus => connectivityStatusSubject.value; + + final BehaviorSubject> keywordsSubject = BehaviorSubject.seeded({}); + + Stream> get observableKeywords => keywordsSubject.stream; + + Map get adsKeywords => keywordsSubject.value; + + String? consentTestDeviceId; + + int? consentDebugGeography; + + static final RegExp _nonAlphaNumeric = RegExp('[^a-zA-Z0-9_]'); + static final RegExp _alpha = RegExp('[a-zA-Z]'); + + @override + bool get isPurchasedNoAd => noBannerAndInterstitialAdsSubject.value; + + void setProperty(String key, String value) { + adsGlobalProperties[key] = value; + } + + void setNoAds(bool noAds) { + noBannerAndInterstitialAdsSubject.addIfChanged(noAds); + GuruSettings.instance.isNoAds.set(noAds); + GuruAnalytics.instance.setUserProperty("user_type", noAds ? "noads" : "default"); + setProperty("user_type", noAds ? "noads" : "default"); + } + + void ensureInitialize() {} + + void listenIap() { + final obs = Rx.combineLatest2, Tuple2>>( + IapManager.instance.observableAvailable, + IapManager.instance.observableAssetStore, + (a, b) => Tuple2(a, b)); + subscriptions.add(obs.listen((tuple) { + final available = tuple.item1; + final purchasedStore = tuple.item2; + if (available && purchasedStore.isActive) { + final tempIsNoAds = + purchasedStore.existsAssets(GuruApp.instance.productProfile.noAdsCapIds); + final isNoAds = isPurchasedNoAd; + Log.i("purchased store changed active! tempIsNoAds:$tempIsNoAds isNoAds:$isNoAds", + syncFirebase: true); + if (isNoAds != tempIsNoAds) { + if (!tempIsNoAds) { + GuruAnalytics.instance.logException(NoAdsException( + "The payment system is abnormal, it shouldn't appear that the purchased item become unpurchased")); + } + + setNoAds(tempIsNoAds); + } + } + })); + } + + Future initialize({SaasUser? saasUser}) async { + _adsProfileSubject.addEx(GuruApp.instance.adsProfile); + await initEnv(); + await initSdk( + saasUser: saasUser, + onInitialized: () { + // loadAds(); + adImpressionController.init(); + initLifecycleConnectivity(); + checkAndPreload(); + // GuruSettings.instance.totalLevelUp + // .observe() + // .throttleTime(const Duration(seconds: 1)) + // .listen((count) { + // checkAndPreload(); + // }); + + Log.i("ADS Initialized", tag: "Ads", syncFirebase: true); + }); + + subscriptions.add(RemoteConfigManager.instance.observeConfig().listen((_) { + refreshAdsConfig(); + }, onError: (error, stacktrace) { + Log.i("init config error!", tag: "Ads", error: error, stackTrace: stacktrace); + })); + listenIap(); + } + + void initLifecycleConnectivity() { + StreamSubscription? streamSubscription; + LifecycleManager.instance.observableAppLifecycle.listen((foreground) { + if (foreground) { + streamSubscription = + Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { + Log.i("Connectivity: $result", tag: "Connectivity"); + if (connectivityStatus == ConnectivityResult.none && result != ConnectivityResult.none) { + Log.i("connectivity changed! retry ads!", tag: "Ads"); + retry(); + } + final changed = connectivityStatusSubject.addIfChanged(result); + if (changed) { + setKeyword("connection", result.toString()); + } + }); + } else { + streamSubscription?.cancel(); + streamSubscription = null; + } + }); + } + + void initAdsProfile() { + final _hasAmazonBannerAds = hasAmazonBannerAds; + final _hasAmazonInterstitialAds = hasAmazonInterstitialAds; + final _hasAmazonAds = _hasAmazonBannerAds || _hasAmazonInterstitialAds; + final defaultAdsProfile = GuruApp.instance.adsProfile; + final strategyInterstitialIds = adsConfig.strategyAdsConfig.interstitialIds; + final newAdsProfile = adsProfile.copyWith( + amazonAppId: _hasAmazonAds ? defaultAdsProfile.amazonAppId : null, + amazonBannerSlotId: _hasAmazonBannerAds ? defaultAdsProfile.amazonBannerSlotId : null, + amazonInterstitialSlotId: + _hasAmazonInterstitialAds ? defaultAdsProfile.amazonInterstitialSlotId : null, + strategyInterstitialIds: strategyInterstitialIds); + _adsProfileSubject.addEx(newAdsProfile); + } + + Future initEnv() async { + final adsPropertyBundle = await AppProperty.getInstance().loadValuesByTag(PropertyTags.ads); + final isNoAds = adsPropertyBundle.getBool(PropertyKeys.isNoAds) ?? false; + + consentTestDeviceId = adsPropertyBundle.getString(PropertyKeys.admobConsentTestDeviceId); + consentDebugGeography = adsPropertyBundle.getInt(PropertyKeys.admobConsentDebugGeography); + noBannerAndInterstitialAdsSubject.addIfChanged(isNoAds); + GuruAnalytics.instance.setUserProperty("user_type", isNoAds ? "noads" : "default"); + setProperty("user_type", isNoAds ? "noads" : "default"); + + final result = await Connectivity().checkConnectivity().catchError((error) { + Log.w("checkConnectivity error! $error"); + }); + connectivityStatusSubject.addEx(result); + setProperty("connectivityStatus", result.toString()); + + refreshAdsConfig(); + initAdsProfile(); + } + + Future initSdk( + {SaasUser? saasUser, + required VoidCallback onInitialized, + Duration retryPeriod = const Duration(seconds: 15)}) async { + final _adsProfile = adsProfile; + bool initializeResult = false; + if (GuruApp.instance.appSpec.deployment.adsCompliantInitialization && + adsConfig.commonAdsConfig.compliantInitialization && + Platform.isAndroid) { + initializeResult = await GuruApplovinFlutter.instance + .gatherConsentAndInitialize( + userId: saasUser?.uid, + amazonAppId: _adsProfile.amazonAppId?.id, + pubmaticStoreUrl: adsProfile.pubmaticAppStoreUrl, + testDeviceId: consentTestDeviceId, + debugGeography: consentDebugGeography) + .catchError((err) => false) ?? + false; + } else { + initializeResult = await GuruApplovinFlutter.instance + .initialize( + userId: saasUser?.uid, + amazonAppId: _adsProfile.amazonAppId?.id, + pubmaticStoreUrl: adsProfile.pubmaticAppStoreUrl) + .catchError((err) => false) ?? + false; + } + + _initializedSubject.addEx(initializeResult); + Log.d("MAX sdk initialize result: $initializeResult"); + if (initializeResult) { + try { + await initKeywords(); + } catch (error, stacktrace) { + Log.e("initKeywords error! $error $stacktrace", tag: "Ads"); + } + onInitialized.call(); + } else { + Future.delayed(retryPeriod, () { + initSdk(onInitialized: onInitialized, retryPeriod: retryPeriod); + }); + Log.w("Ads Initialize error! retry", tag: "Ads", syncFirebase: true); + } + return initializeResult; + } + + void checkAndPreload( + {AdsValidator? rewardedValidator, AdsValidator? interstitialValidator}) async { + final canPreloadReward = + await adsConfig.rewardedConfig.canPreload(validator: rewardedValidator); + if (canPreloadReward) { + Log.d("preload reward canPreload!"); + final reward = await getRewardsAds(); + if (reward.loadCount <= 0) { + reward.preload(); + } + } + + final canPreloadInterstitial = + await adsConfig.interstitialConfig.canPreload(validator: interstitialValidator); + if (!isPurchasedNoAd && canPreloadInterstitial) { + Log.d("preload interstitial canPreload!"); + final interstitial = await getInterstitialAds(); + if (interstitial is AdsAudit && interstitial.loadCount <= 0) { + interstitial.preload(); + } + } + } + + void retry() async { + final canPreloadReward = await adsConfig.rewardedConfig.canPreload(); + if (canPreloadReward) { + final reward = await getRewardsAds(); + reward.retry(); + } + + final canPreload = await adsConfig.interstitialConfig.canPreload(); + if (canPreload) { + Log.d("preload interstitial canPreload!"); + final interstitial = await getInterstitialAds(); + interstitial.retry(); + } + } + + static int _nearestLt(int low, int high, int lt) { + if (low > high) { + return -low; + } + while (low <= high) { + final int mid = (low + high) >> 1; + if (lt == ltSamples[mid]) { + return mid; + } else if (lt < ltSamples[mid]) { + return _nearestLt(low, mid - 1, lt); + } else { + return _nearestLt(mid + 1, high, lt); + } + } + return -low; + } + + Future getKeywordLt() async { + final latestLtDate = await AppProperty.getInstance().getLatestLtDate(); + final dateNum = DateTimeUtils.yyyyMMddUtcNum; + + int lt = await AppProperty.getInstance().getLtDays(); + if (dateNum != latestLtDate) { + if (dateNum > latestLtDate) { + lt = lt + 1; + await AppProperty.getInstance().setLtDays(lt); + } + await AppProperty.getInstance().setLatestLtDate(dateNum); + } + final idx = _nearestLt(0, ltSamples.lastIndex, lt).abs().clamp(0, ltSamples.lastIndex); + Log.d( + "getKeywordLt: installTime:$latestLtDate now:$dateNum lt:$lt keywordLt:${ltSamples[idx]}"); + + return ltSamples[idx]; + } + + Future getOSVersion() async { + try { + final deviceInfo = DeviceInfoPlugin(); + if (Platform.isAndroid) { + final info = await deviceInfo.androidInfo; + return info.version.release; + } else if (Platform.isIOS) { + final info = await deviceInfo.iosInfo; + return info.systemVersion; + } + } catch (error, stacktrace) { + Log.w("getOSVersion error! $error"); + } + return "unknown"; + } + + Future getConnection() async { + try { + final connectivity = await Connectivity().checkConnectivity(); + return connectivity.toString(); + } catch (error, stacktrace) { + Log.w("getConnection error! $error"); + } + return "unknown"; + } + + Future initKeywords() async { + final paidUser = await AppProperty.getInstance().isPaidUser(); + final version = Settings.get().version.get(); + final lt = await getKeywordLt(); + final osVersion = await getOSVersion(); + final connection = await getConnection(); + final keywords = { + "app_version": version, + "paid": paidUser ? "true" : "false", + "lt": lt.toString(), + "os_version": osVersion, + "connection": connection + }; + + keywordsSubject.stream.listen((keywords) { + if (keywords.isNotEmpty) { + Log.i("invoke setKeywords: $keywords", tag: "Ads"); + GuruApplovinFlutter.instance.setKeywords(keywords); + } + }); + keywordsSubject.addEx(keywords); + } + + Future restoreKeywords(Map keywords) async { + if (GuruSettings.instance.debugMode.get()) { + final newKeywords = Map.of(keywords); + keywordsSubject.addEx(newKeywords); + } + } + + void setKeyword(String key, String value, {bool debugForce = false}) { + if (!GuruSettings.instance.debugMode.get() || !debugForce) { + if (_reservedKeywords.contains(key)) { + Log.w("setKeyword error! the key($key) is reserved and cannot be used!", tag: "Ads"); + return; + } + + if (key.isEmpty || + key.length > 36 || + key.indexOf(_alpha) != 0 || + key.contains(_nonAlphaNumeric)) { + Log.w("setKeyword error! the key($key) must contain 1 to 36 alphanumeric characters.", + tag: "Ads"); + return; + } + } + final newKeywords = Map.of(keywordsSubject.value); + newKeywords[key] = value; + keywordsSubject.addEx(newKeywords); + } + + void removeKeyword(String key, {bool debugForce = false}) { + if (!GuruSettings.instance.debugMode.get() || !debugForce) { + if (_reservedKeywords.contains(key)) { + Log.w("removeKeyword error! the key($key) is reserved and cannot be used!", tag: "Ads"); + return; + } + + if (key.isEmpty || + key.length > 36 || + key.indexOf(_alpha) != 0 || + key.contains(_nonAlphaNumeric)) { + Log.w("removeKeyword error! the key($key) must contain 1 to 36 alphanumeric characters.", + tag: "Ads"); + return; + } + } + final newKeywords = Map.of(keywordsSubject.value); + newKeywords.remove(key); + keywordsSubject.addEx(newKeywords); + } + + Future checkConsentDialogStatus() async { + return await GuruApplovinFlutter.instance.checkConsentDialogStatus(); + } + + Future afterAcceptPrivacy(bool consentResult) async { + return await GuruApplovinFlutter.instance.afterAcceptPrivacy(consentResult); + } + + bool testParseAdsDefaultConfig() { + final iadsConfigString = RemoteConfigReservedConstants.getDefaultConfigString( + RemoteConfigReservedConstants.iadsConfig) ?? + ""; + final radsConfigString = RemoteConfigReservedConstants.getDefaultConfigString( + RemoteConfigReservedConstants.radsConfig) ?? + ""; + final badsConfigString = RemoteConfigReservedConstants.getDefaultConfigString( + RemoteConfigReservedConstants.badsConfig) ?? + ""; + final iosAttConfigString = RemoteConfigReservedConstants.getDefaultConfigString( + RemoteConfigReservedConstants.iosAttConfig) ?? + ""; + try { + final adInterstitial = AdInterstitialConfig.fromJson(json.decode(iadsConfigString)); + final adBanner = AdBannerConfig.fromJson(json.decode(badsConfigString)); + final iosAttConfig = IOSAttConfig.fromJson(json.decode(iosAttConfigString)); + Log.d("==== ADS AdsConfig ===="); + Log.d(" ---> [INTERSTITIAL]: $iadsConfigString"); + Log.d(" ---> [BANNER]: $badsConfigString"); + Log.d(" ---> [IOSATT]: $iosAttConfigString"); + Log.d("======================="); + + _adsConfigSubject.addEx(AdsConfig.build( + interstitialConfig: adInterstitial, bannerConfig: adBanner, iosAttConfig: iosAttConfig)); + return true; + } catch (error, stacktrace) { + Log.e("refreshAdsConfig error $error $stacktrace"); + rethrow; + } + } + + bool refreshAdsConfig() { + try { + final commonAdsConfig = RemoteConfigManager.instance.getCommonAdsConfig(); + final adInterstitial = RemoteConfigManager.instance.getIadsConfig(); + final adReward = RemoteConfigManager.instance.getRadsConfig(); + final adBanner = RemoteConfigManager.instance.getBadsConfig(); + final strategyAdsConfig = RemoteConfigManager.instance.getStrategyAdsConfig(); + final iosAttConfig = RemoteConfigManager.instance.getIOSAttConfig(); + Log.d("==== ADS AdsConfig ====", tag: PropertyTags.ads); + Log.d(" ---> [COMMON]: ${commonAdsConfig.toJson()}", tag: PropertyTags.ads); + Log.d(" ---> [INTERSTITIAL]: ${adInterstitial.toJson()}", tag: PropertyTags.ads); + Log.d(" ---> [REWARD]: ${adReward.toJson()}", tag: PropertyTags.ads); + Log.d(" ---> [BANNER]: ${adBanner.toJson()}", tag: PropertyTags.ads); + Log.d(" ---> [STRATEGY]: ${strategyAdsConfig.toJson()}", tag: PropertyTags.ads); + Log.d(" ---> [IOSATT]: ${iosAttConfig.toJson()}", tag: PropertyTags.ads); + Log.d("=======================", tag: PropertyTags.ads); + _adsConfigSubject.addEx(AdsConfig.build( + commonAdsConfig: commonAdsConfig, + interstitialConfig: adInterstitial, + rewardedConfig: adReward, + bannerConfig: adBanner, + strategyAdsConfig: strategyAdsConfig, + iosAttConfig: iosAttConfig)); + return true; + } catch (error, stacktrace) { + Log.e("refreshAdsConfig error $error $stacktrace"); + rethrow; + } + } + + @override + Future getInterstitialAds() async { + final _adsProfile = adsProfile; + final strategyInterstitialIds = adsProfile.strategyInterstitialIds ?? []; + Ads? ad; + if (strategyInterstitialIds.isNotEmpty) { + if (strategyInterstitialIds.length > 1) { + ad = interstitialAds[strategyInterstitialIds.first.adUnitId] ??= + MaxStrategyInterstitialAds.create(strategyInterstitialIds)..init(); + } else { + ad = interstitialAds[strategyInterstitialIds.first.adUnitId] ??= + ApplovinInterstitialAds.create(strategyInterstitialIds.first.adUnitId, + strategyInterstitialIds.first.amazonAdSlotId) + ..init(); + } + } else { + ad = interstitialAds[_adsProfile.interstitialId] ??= ApplovinInterstitialAds.create( + _adsProfile.interstitialId, _adsProfile.amazonInterstitialSlotId) + ..init(); + } + return ad; + } + + @override + Future getRewardsAds() async { + final _adsProfile = adsProfile; + ApplovinRewardedAds? ad = rewardsAds[_adsProfile.rewardsId]; + if (ad == null) { + ad = ApplovinRewardedAds.create(_adsProfile.rewardsId, + adAmazonSlotId: _adsProfile.amazonRewardedSlotId) + ..init(); + rewardsAds[_adsProfile.rewardsId] = ad; + } + return ad; + } + + Future requestGdpr({int? debugGeography, String? testDeviceId}) { + Log.d("requestGdpr! debugGeography:$debugGeography testDeviceId:$testDeviceId", tag: "Ads"); + // adb logcat -s UserMessagingPlatform + // Use new ConsentDebugSettings.Builder().addTestDeviceHashedId("xxxx") to set this as a debug device. + return GuruApplovinFlutter.instance + .requestGdpr(debugGeography: debugGeography, testDeviceId: testDeviceId); + } + + Future resetGdpr() { + return GuruApplovinFlutter.instance.resetGdpr(); + } + + @override + Future createBannerAds({String? scene, AdsLifecycleObserver? observer}) async { + final _adsProfile = adsProfile; + return ApplovinBannerAds.create(_adsProfile.bannerId, _adsProfile.amazonBannerSlotId, + scene: scene, observer: observer); + } + + AdCause canShowInterstitial(String scene) { + if (isPurchasedNoAd) { + return AdCause.noAds; + } + final _adsProfile = adsProfile; + Ads? ad = interstitialAds[_adsProfile.interstitialId]; + int hiddenAt = 0; + if (ad is AdsAudit) { + hiddenAt = ad.latestHiddenAt; + } + + final now = DateTimeUtils.currentTimeInMillis(); + final impGapInMillis = + AdsManager.instance.adsConfig.interstitialConfig.getSceneImpGapInSeconds(scene) * 1000; + Log.d( + "canShowInterstitial($scene): now:$now latestFullscreenAdsHiddenTimestamps:$latestFullscreenAdsHiddenTimestamps hiddenAt:$hiddenAt impGapInMillis:$impGapInMillis", + tag: "Ads"); + if ((now - AdsManager.instance.latestFullscreenAdsHiddenTimestamps) < 60000 || + ((now - hiddenAt) < impGapInMillis)) { + Log.d("show ads too frequency", syncFirebase: true); + return AdCause.tooFrequent; + } + return AdCause.success; + } + + @override + Future validateInterstitial(String? scene, {AdsValidator? validator}) { + final interstitialConfig = adsConfig.interstitialConfig; + return interstitialConfig.check(scene ?? "", validator: validator); + } + + @override + Future validateRewards(String? scene, {AdsValidator? validator}) { + final rewardedConfig = adsConfig.rewardedConfig; + return rewardedConfig.check(scene ?? "", validator: validator); + } + + @override + Future validateBanner(String? scene, {AdsValidator? validator}) { + final rewardedConfig = adsConfig.bannerConfig; + return rewardedConfig.check(scene ?? "", validator: validator); + } + + @override + dynamic getConfig(String type) { + switch (type) { + case "bannerAutoDisposeInterval": + return adsConfig.bannerConfig.autoDisposeIntervalInMinutes; + case "allowInterstitialAsAlternativeReward": + return GuruApp.instance.appSpec.deployment.allowInterstitialAsAlternativeReward; + case "showInternalAdsWhenBannerUnavailable": + return GuruApp.instance.appSpec.deployment.showInternalAdsWhenBannerUnavailable; + } + } +} diff --git a/guru_app/lib/ads/applovin/banner/applovin_banner_ads.dart b/guru_app/lib/ads/applovin/banner/applovin_banner_ads.dart new file mode 100644 index 0000000..9bdc9f7 --- /dev/null +++ b/guru_app/lib/ads/applovin/banner/applovin_banner_ads.dart @@ -0,0 +1,107 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; + +// import 'package:guru_utils/ads/data/ads.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applovin_flutter/banner_ad.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_utils/ads/ads.dart'; + +/// Created by Haoyi on 5/10/21 + +class ApplovinBannerAds extends BannerAds { + late BannerAd bannerAd; + @override + final AdUnitId adUnitId; + final AdSlotId? adAmazonSlotId; + + ApplovinBannerAds.create(this.adUnitId, this.adAmazonSlotId, + {String? scene, AdsLifecycleObserver? observer}) { + bannerAd = BannerAd( + adUnitId: adUnitId.id, adAmazonSlotId: adAmazonSlotId?.id, listener: dispatchEvent); + init(); + this.scene = scene ?? ""; + if (observer != null) { + addObserver(observer); + } + } + + @override + Map get eventsMapping => { + BannerAdEvent.onAdLoaded: AdsEvent.adLoaded, + BannerAdEvent.onAdLoadFailed: AdsEvent.adLoadFailed, + BannerAdEvent.onAdDisplayFailed: AdsEvent.adDisplayFailed, + BannerAdEvent.onAdDisplayed: AdsEvent.adDisplayed, + BannerAdEvent.onAdClicked: AdsEvent.adClick, + BannerAdEvent.onAdHidden: AdsEvent.adHidden, + }; + + void hideOtherBanner() { + // MoPubBannerAd.allBannerAds.forEach((key, value) { + // if (bannerAd.id != key) { + // value.hide(); + // } + // }); + } + + @override + Future requestDispose() async { + try { + return await bannerAd.dispose() ?? false; + } catch (error, stacktrace) { + Log.d("dispose error:$error $stacktrace"); + return false; + } + } + + @override + Future requestHide() async { + try { + return await bannerAd.hide() ?? false; + } catch (error, stacktrace) { + Log.d("requestHide error:$error $stacktrace"); + return false; + } + } + + @override + Future requestLoad() async { + try { + Log.w("[$runtimeType] requestLoad", tag: "Ads"); + final result = await bannerAd.load(placement: scene) ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace"); + return AdCause.internalError; + } + } + + @override + Future requestShow({required String scene, bool ignoreCheck = false}) async { + hideOtherBanner(); + try { + final result = await bannerAd.show(anchorOffset: 3.0) ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.i("Banner show error $error $stacktrace"); + } + return AdCause.internalError; + } + + Future checkLoaded() async { + return true; + } + + @override + Future getStatus() async { + return AdStatus.LOADING; + } +} diff --git a/guru_app/lib/ads/applovin/interstitial/applovin_interstitial_ads.dart b/guru_app/lib/ads/applovin/interstitial/applovin_interstitial_ads.dart new file mode 100644 index 0000000..7e93af6 --- /dev/null +++ b/guru_app/lib/ads/applovin/interstitial/applovin_interstitial_ads.dart @@ -0,0 +1,124 @@ +import 'package:guru_app/ads/ads_manager.dart'; +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_applovin_flutter/interstitial_ad.dart'; +import 'package:guru_utils/ads/ads.dart'; + + + +/// Created by Haoyi on 5/6/21 + +class ApplovinInterstitialAds extends InterstitialAds { + late InterstitialAd interstitialAd; + + @override + final AdUnitId adUnitId; + final AdSlotId? adAmazonSlotId; + + // @override + // RetryConfig get retryConfig { + // final adsService = Injector.provide(); + // return adsService.adsConfig.interstitialConfig.retryConfig; + // } + + ApplovinInterstitialAds.create(this.adUnitId, this.adAmazonSlotId); + + @override + void init() { + super.init(); + interstitialAd = InterstitialAd( + adUnitId: adUnitId.id, adAmazonSlotId: adAmazonSlotId?.id, listener: dispatchEvent); + } + + @override + Map get eventsMapping => { + InterstitialAdEvent.onAdLoaded: AdsEvent.adLoaded, + InterstitialAdEvent.onAdLoadFailed: AdsEvent.adLoadFailed, + InterstitialAdEvent.onAdDisplayFailed: AdsEvent.adDisplayFailed, + InterstitialAdEvent.onAdDisplayed: AdsEvent.adDisplayed, + InterstitialAdEvent.onAdClicked: AdsEvent.adClick, + InterstitialAdEvent.onAdHidden: AdsEvent.adHidden, + }; + + @override + Future requestDispose() async { + try { + return await interstitialAd.dispose() ?? false; + } catch (error, stacktrace) { + Log.w("requestDispose error", error: error, stackTrace: stacktrace); + return false; + } + } + + @override + Future requestHide() async { + return false; + } + + @override + Future requestLoad() async { + try { + Log.w("[$runtimeType] requestLoad", tag: "Ads"); + final result = await interstitialAd.load() ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace"); + return AdCause.internalError; + } + } + + @override + Future requestShow({required String scene, bool ignoreCheck = false}) async { + // final now = DateTimeUtils.currentTimeInMillis(); + // final impGapInMillis = AdsManager.instance.adsConfig.interstitialConfig.impGapInSeconds * 1000; + // if ((now - AdsManager.instance.latestFullscreenAdsHiddenTimestamps) < 60000 || + // ((now - latestHiddenAt) < impGapInMillis)) { + // Log.d("show ads too frequency", syncFirebase: true); + // return AdCause.tooFrequent; + // } + if (!ignoreCheck) { + final result = AdsManager.instance.canShowInterstitial(scene); + if (result != AdCause.success) { + return result; + } + } + Log.d("[$runtimeType] requestShow", tag: "Ads", syncFirebase: true); + try { + final result = await interstitialAd.show(placement: scene) ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestShow error", error: error, stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + } + } + + @override + Future checkLoaded() async { + try { + return await interstitialAd.isLoaded() ?? false; + } catch (error, stacktrace) { + return false; + } + } + + @override + Future getStatus() async { + try { + return await interstitialAd.getAdState(); + } catch (error, stacktrace) { + Log.w("getInterstitialAdStatus error", + error: error, stackTrace: stacktrace, syncFirebase: true); + return AdStatus.FAILED; + } + } +} diff --git a/guru_app/lib/ads/applovin/rewarded/applovin_rewarded_ads.dart b/guru_app/lib/ads/applovin/rewarded/applovin_rewarded_ads.dart new file mode 100644 index 0000000..1822f5e --- /dev/null +++ b/guru_app/lib/ads/applovin/rewarded/applovin_rewarded_ads.dart @@ -0,0 +1,129 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_applovin_flutter/rewarded_video_ad.dart'; +import 'package:guru_utils/ads/ads.dart'; + +/// Created by Haoyi on 5/26/21 + +class ApplovinRewardedAds extends RewardedAds { + late RewardedVideoAd rewardedVideoAd; + + @override + final AdUnitId adUnitId; + final AdSlotId? adAmazonSlotId; + + ApplovinRewardedAds.create(this.adUnitId, {this.adAmazonSlotId}); + + // @override + // RetryConfig get retryConfig { + // final adsService = Injector.provide(); + // return adsService.adsConfig.rewardedConfig.retryConfig; + // } + + @override + void init() { + super.init(); + rewardedVideoAd = RewardedVideoAd( + adUnitId: adUnitId.id, adAmazonSlotId: adAmazonSlotId?.id, listener: dispatchEvent); + } + + @override + Map get eventsMapping => { + RewardedVideoAdEvent.onAdLoaded: AdsEvent.adLoaded, + RewardedVideoAdEvent.onAdLoadFailed: AdsEvent.adLoadFailed, + RewardedVideoAdEvent.onAdDisplayFailed: AdsEvent.adDisplayFailed, + RewardedVideoAdEvent.onAdDisplayed: AdsEvent.adDisplayed, + RewardedVideoAdEvent.onAdClicked: AdsEvent.adClick, + RewardedVideoAdEvent.onAdHidden: AdsEvent.adHidden, + RewardedVideoAdEvent.onUserRewarded: AdsEvent.adRewarded + }; + + @override + Future requestDispose() async { + try { + return await rewardedVideoAd.dispose() ?? false; + } catch (error, stacktrace) { + Log.w("requestDispose error! $error $stacktrace"); + return false; + } + } + + @override + Future requestHide() async { + return false; + } + + @override + Future requestLoad() async { + try { + Log.w("[$runtimeType] requestLoad", tag: "Ads"); + final result = await rewardedVideoAd.load() ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace"); + return AdCause.internalError; + } + } + + @override + Future requestReset() async { + try { + Log.w("[$runtimeType] requestLoad", tag: "Ads"); + final result = await rewardedVideoAd.dispose() ?? false; + if (result) { + rewardedVideoAd = RewardedVideoAd(adUnitId: adUnitId.id, listener: dispatchEvent); + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace"); + return AdCause.internalError; + } + } + + @override + Future requestShow({required String scene, bool ignoreCheck = false}) async { + // final now = DateTimeUtils.currentTimeInMillis(); + // if (now - latestHiddenAt < 60000) { + // Log.i("show ads too frequency"); + // return false; + // } + // Log.i("show interstitial"); + try { + Log.d("[$hashCode]requestShow rewardedAds", syncFirebase: true); + final result = await rewardedVideoAd.show(placement: scene) ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestShow rewarded error", error: error, stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + } + } + + @override + Future getStatus() async { + try { + return await rewardedVideoAd.getAdState(); + } catch (error, stacktrace) { + Log.w("getRewardedAdStatus error", error: error, stackTrace: stacktrace, syncFirebase: true); + return AdStatus.FAILED; + } + } + + @override + bool needReset() { + Log.d("reset check elapsedTimeInMillisSinceStartLoadAds $elapsedTimeInMillisSinceStartLoadAds", + tag: "Ads"); + return elapsedTimeInMillisSinceStartLoadAds > 30 * 1000; + } +} diff --git a/guru_app/lib/ads/core/ads.dart b/guru_app/lib/ads/core/ads.dart new file mode 100644 index 0000000..3542eac --- /dev/null +++ b/guru_app/lib/ads/core/ads.dart @@ -0,0 +1,201 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:math'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:guru_app/ads/ads_manager.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_app/aigc/bi/ai_bi.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/hook/hook_manager.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; + +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:rxdart/rxdart.dart'; +import 'package:guru_utils/ads/ads.dart'; + +part 'banner/banner_ads.dart'; + +part 'banner/banner_ads_handler.dart'; + +part 'handler/ads_audit.dart'; + +part 'interstitial/interstitial_ads.dart'; + +part 'interstitial/interstitial_ads_handler.dart'; + +part 'rewards/rewarded_ads.dart'; + +part 'rewards/rewarded_ads_handler.dart'; + +part 'handler/ads_cache.dart'; + +/// Created by Haoyi on 5/6/21 + +abstract class Ads extends AdsLifecycleOwner with AdsDelegate { + set loaded(bool loaded); + + final Map properties = {}; + + void setProperty(String name, String data) { + properties[name] = data; + } + + void retry() {} + + void preload() {} +} + +abstract class SingleAds extends Ads { + Map get eventsMapping; + + AdUnitId get adUnitId; + + @override + set loaded(bool loaded) { + loadedSubject.addEx(loaded); + setProperty("isLoaded", loaded ? "true" : "false"); + } + + @override + bool get loaded => loadedSubject.value == true; + + final BehaviorSubject loadedSubject = BehaviorSubject.seeded(false); + + @override + Stream get observableLoaded => loadedSubject.stream; + + void dispatchEvent(T event, {Map arguments = const {}}) { + final adsEvent = eventsMapping[event]; + if (adsEvent != null) { + final adsBundle = AdsBundle.create(this, arguments: arguments); + switch (adsEvent) { + case AdsEvent.adLoaded: + onAdLoaded(adsBundle); + break; + case AdsEvent.adLoadFailed: + onAdLoadFailed(adsBundle); + break; + case AdsEvent.adDisplayed: + onAdDisplayed(adsBundle); + break; + case AdsEvent.adDisplayFailed: + onAdDisplayFailed(adsBundle); + break; + case AdsEvent.adClick: + onAdClicked(adsBundle); + break; + case AdsEvent.adHidden: + onAdHidden(adsBundle); + break; + case AdsEvent.adRewarded: + onAdRewarded(adsBundle); + break; + } + } + } + + @override + @mustCallSuper + Future dispose() async { + bool result = false; + try { + result = await requestDispose(); + } catch (error, stacktrace) { + Log.d("requestDispose error:$error $stacktrace"); + } + onRequestDispose(AdsBundle.create(this)); + super.dispose(); + return result; + } + + @override + @mustCallSuper + Future reset() async { + AdCause result = AdCause.internalError; + try { + result = await requestReset(); + } catch (error, stacktrace) { + Log.d("requestReset error:$error $stacktrace"); + } + onRequestReset(AdsBundle.create(this)); + return result == AdCause.success; + } + + @mustCallSuper + void init() { + if (this is AdsAudit) { + Log.d("[$runtimeType]AdsAudit === add AdsAuditObserver", tag: "Ads"); + addObserver(AdsAuditObserver(runtimeType.toString())); + } + if (this is AdsCache) { + Log.d("[$runtimeType]AdsReload === add AdsReloadObserver", tag: "Ads"); + addObserver(AdsCacheObserver(runtimeType.toString())); + } + } + + @override + Future load() async { + final adCause = await requestLoad().catchError((error, stacktrace) { + Log.e("load error! ", tag: "Ads", error: error, stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + }); + Log.d("[$runtimeType]load complete!! $adCause", syncFirebase: true); + onRequestLoad(AdsBundle.create(this, arguments: {"cause": adCause})); + return adCause; + } + + @override + Future hide() async { + onRequestHide(AdsBundle.create(this)); + return await requestHide(); + } + + @override + Future show({required String scene, bool ignoreCheck = false}) async { + final adCause = + await requestShow(scene: scene, ignoreCheck: ignoreCheck).catchError((error, stacktrace) { + Log.e("show error! $error", stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + }); + Log.d("[$runtimeType]show $scene complete!! $adCause", syncFirebase: true); + onRequestShow(AdsBundle.create(this, arguments: {"scene": scene, "cause": adCause})); + return adCause; + } + + Future requestLoad(); + + Future requestShow({required String scene, bool ignoreCheck = false}); + + Future requestHide(); + + Future requestDispose(); + + Future requestReset() async { + return AdCause.internalError; + } + + Future getStatus(); + + @override + Future getState() async { + final status = await getStatus(); + return convertAdStatusToAdState(status); + } +} + +enum AdsEvent { + adLoaded, + adLoadFailed, + adDisplayed, + adDisplayFailed, + adClick, + adHidden, + adRewarded +} diff --git a/guru_app/lib/ads/core/ads_config.dart b/guru_app/lib/ads/core/ads_config.dart new file mode 100644 index 0000000..9709d56 --- /dev/null +++ b/guru_app/lib/ads/core/ads_config.dart @@ -0,0 +1,481 @@ +import 'dart:convert'; + +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:guru_utils/converts/converts.dart'; +import 'package:guru_utils/ads/ads.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; + +part 'ads_config.g.dart'; + +AdState convertAdStatusToAdState(int status) { + switch (status) { + case AdStatus.LOADED: + return AdState.loaded; + case AdStatus.CREATED: + return AdState.created; + case AdStatus.LOADING: + return AdState.loading; + default: + return AdState.failed; + } +} + +@JsonSerializable() +class TaichiConfig { + @JsonKey(name: "enable", defaultValue: false) + final bool enable; + + @JsonKey(name: "threshold", defaultValue: "") + final String threshold; + + @JsonKey(name: "abnormal_threshold", defaultValue: 1.0) + final double abnormalThreshold; + + TaichiConfig({this.enable = false, this.threshold = "", this.abnormalThreshold = 1.0}); + + factory TaichiConfig.fromJson(Map json) => _$TaichiConfigFromJson(json); + + @override + String toString() { + return 'TaichiConfig{enable: $enable, threshold: $threshold}'; + } + + Map toJson() => _$TaichiConfigToJson(this); +} + +@JsonSerializable() +class ImpressionData { + @JsonKey(name: "ad_platform", defaultValue: "MAX") + final String platform; + + @JsonKey(name: "id", defaultValue: "") + final String id; + + @JsonKey(name: "adunit_id", defaultValue: "") + final String unitId; + + @JsonKey(name: "adunit_name", defaultValue: "") + final String unitName; + + @JsonKey(name: "adunit_format", defaultValue: "") + final String unitFormat; + + @JsonKey(name: "adgroup_id", defaultValue: "") + final String groupId; + + @JsonKey(name: "adgroup_name", defaultValue: "") + final String groupName; + + @JsonKey(name: "adgroup_type", defaultValue: "") + final String groupType; + + @JsonKey(name: "currency", defaultValue: "") + final String currency; + + @JsonKey(name: "country", defaultValue: "") + final String country; + + @JsonKey(name: "app_version", defaultValue: "") + final String appVersion; + + @JsonKey(name: "adgroup_priority", defaultValue: 0) + final int groupPriority; + + @JsonKey(name: "publisher_revenue", defaultValue: -1) + final double publisherRevenue; + + @JsonKey(name: "network_name", defaultValue: "") + final String networkName; + + @JsonKey(name: "network_placement_id", defaultValue: "") + final String networkPlacementId; + + @JsonKey(name: "precision", defaultValue: "") + final String precision; + + @JsonKey(ignore: true) + late Map payload; + + ImpressionData derive({double? newPublisherRevenue}) { + final newPayload = Map.from(payload); + newPayload["publisher_revenue"] = newPublisherRevenue ?? publisherRevenue; + return ImpressionData.fromJson(newPayload); + } + + @override + String toString() { + return 'ImpressionData{platform: $platform, id: $id, unitId: $unitId, unitName: $unitName, unitFormat: $unitFormat, groupId: $groupId, groupName: $groupName, groupType: $groupType, currency: $currency, country: $country, appVersion: $appVersion, groupPriority: $groupPriority, publisherRevenue: $publisherRevenue, networkName: $networkName, networkPlacementId: $networkPlacementId, precision: $precision}'; + } + + ImpressionData( + {required this.platform, + required this.id, + required this.unitId, + required this.unitName, + required this.unitFormat, + required this.groupId, + required this.groupName, + required this.groupType, + required this.currency, + required this.country, + required this.appVersion, + required this.groupPriority, + required this.publisherRevenue, + required this.networkName, + required this.networkPlacementId, + required this.precision}); + + factory ImpressionData.fromJson(Map json) => + _$ImpressionDataFromJson(json)..payload = json; + + Map toJson() => _$ImpressionDataToJson(this); +} + +@JsonSerializable() +class CpmCalibrationData { + @JsonKey(name: "list", defaultValue: []) + final List items; + + final Map _interstitialCpmCalibrationCountryMapping = {}; + + final Map _rewardedCpmCalibrationCountryMapping = {}; + + CpmCalibrationData(this.items); + + double getCpm(String format, String country) { + _ensureInitializedData(); + final upperFormat = format.toUpperCase(); + if (upperFormat.contains("FULLSCREEN") || upperFormat.contains("INTERSTITIAL")) { + return _interstitialCpmCalibrationCountryMapping[country] ?? -1; + } + + if (upperFormat.contains("REWARDED")) { + return _rewardedCpmCalibrationCountryMapping[country] ?? -1; + } + return -1; + } + + void _ensureInitializedData() { + if (_interstitialCpmCalibrationCountryMapping.isEmpty || + _rewardedCpmCalibrationCountryMapping.isEmpty) { + for (CpmCalibrationItem item in items) { + if (item.format == "reward") { + _rewardedCpmCalibrationCountryMapping[item.country.toUpperCase()] = item.cpm; + } else if (item.format == "inter") { + _interstitialCpmCalibrationCountryMapping[item.country.toUpperCase()] = item.cpm; + } + } + } + } + + factory CpmCalibrationData.fromJson(Map json) => + _$CpmCalibrationDataFromJson(json); + + Map toJson() => _$CpmCalibrationDataToJson(this); +} + +@JsonSerializable() +class CpmCalibrationItem { + @JsonKey(name: "format") + final String format; + + @JsonKey(name: "cpm") + final double cpm; + + @JsonKey(name: "country") + final String country; + + CpmCalibrationItem(this.format, this.cpm, this.country); + + factory CpmCalibrationItem.fromJson(Map json) => + _$CpmCalibrationItemFromJson(json); + + Map toJson() => _$CpmCalibrationItemToJson(this); +} + +@JsonSerializable() +class IRLDConfig { + @JsonKey(name: "fb_ecpm_cache_h", defaultValue: 12) + final int fbCpmCacheInHour; + + @JsonKey(name: "fb_irld_report", defaultValue: false) + final bool fbIrldReport; + + @JsonKey(name: "abnormal_threshold", defaultValue: 0.1) + final double abnormalThreshold; + + IRLDConfig({this.fbCpmCacheInHour = 12, this.fbIrldReport = false, this.abnormalThreshold = 0.1}); + + factory IRLDConfig.fromJson(Map json) => _$IRLDConfigFromJson(json); + + Map toJson() => _$IRLDConfigToJson(this); + + @override + String toString() { + return 'IRLDConfig{fbCpmCacheInHour: $fbCpmCacheInHour, fbIrldReport: $fbIrldReport, abnormalThreshold: $abnormalThreshold}'; + } +} + +class AdsConfig { + final CommonAdsConfig commonAdsConfig; + final AdInterstitialConfig interstitialConfig; + final AdRewardedConfig rewardedConfig; + final AdBannerConfig bannerConfig; + final StrategyAdsConfig strategyAdsConfig; + final IOSAttConfig iosAttConfig; + + AdsConfig.build( + {CommonAdsConfig? commonAdsConfig, + AdInterstitialConfig? interstitialConfig, + AdRewardedConfig? rewardedConfig, + AdBannerConfig? bannerConfig, + StrategyAdsConfig? strategyAdsConfig, + IOSAttConfig? iosAttConfig}) + : commonAdsConfig = commonAdsConfig ?? CommonAdsConfig.fromJson({}), + interstitialConfig = + interstitialConfig ?? AdInterstitialConfig.fromJson({}), + rewardedConfig = rewardedConfig ?? AdRewardedConfig.fromJson({}), + bannerConfig = bannerConfig ?? AdBannerConfig.fromJson({}), + strategyAdsConfig = strategyAdsConfig ?? StrategyAdsConfig.fromJson({}), + iosAttConfig = iosAttConfig ?? IOSAttConfig.fromJson({}); + + static AdsConfig defaultAdsConfig = AdsConfig.build(); + + Map dump() { + return { + "common_config": commonAdsConfig.toJson().toString(), + "iads_config": interstitialConfig.toJson().toString(), + "rads_config": rewardedConfig.toJson().toString(), + "bads_config": bannerConfig.toJson().toString(), + "sads_config": strategyAdsConfig.toJson().toString(), + "ios_att_config": iosAttConfig.toJson().toString() + }; + } +} + +@JsonSerializable() +class AdBannerConfig { + @JsonKey(name: "free_s", defaultValue: 600) + final int freeInSecond; + + @JsonKey(name: "validation", defaultValue: '') + final String validation; + + @JsonKey(name: "amazon_enable", defaultValue: false) + final bool amazonEnable; + + @JsonKey(name: "pubmatic_enable", defaultValue: false) + final bool pubmaticEnable; + + @JsonKey(name: "auto_dispose_interval_m", defaultValue: 5) + final int autoDisposeIntervalInMinutes; + + @override + String toString() { + return 'AdBannerConfig{freeInSecond: $freeInSecond, validation: $validation, amazonEnable: $amazonEnable, pubmaticEnable: $pubmaticEnable, autoDisposeIntervalInMinutes: $autoDisposeIntervalInMinutes}'; + } + + AdBannerConfig(this.freeInSecond, this.validation, this.amazonEnable, this.pubmaticEnable, + this.autoDisposeIntervalInMinutes); + + factory AdBannerConfig.fromJson(Map json) => _$AdBannerConfigFromJson(json); + + Map toJson() => _$AdBannerConfigToJson(this); + + Future check(String? scene, {AdsValidator? validator}) async { + if (!(await checkFreeTime())) { + return AdCause.invalidRequest; + } + + if (await validator?.call() == false) { + return AdCause.invalidRequest; + } + return AdCause.success; + } + + Future checkFreeTime() async { + final firstInstallTime = + await AppProperty.getInstance().getInt(PropertyKeys.firstInstallTime, defValue: 0); + return ((DateTimeUtils.currentTimeInMillis() - firstInstallTime) / 1000) >= freeInSecond; + } +} + +@JsonSerializable() +class AdInterstitialConfig { + @JsonKey(name: "free_s", defaultValue: 600) + final int freeInSecond; + + @JsonKey(name: "validation", defaultValue: '') + final String validation; + + @JsonKey(name: "scene", defaultValue: []) + @joinedStringConvert + final List scenes; + + @JsonKey(name: "sp_scene", defaultValue: {"new_block": 120, "reset_scs": 120}) + @configStringIntMapStringConvert + final Map specialScenes; + + @JsonKey(name: "retry_min_s", defaultValue: 4) + final int retryMinTimeInSecond; + + @JsonKey(name: "retry_max_s", defaultValue: 600) + final int retryMaxTimeInSecond; + + @JsonKey(name: "amazon_enable", defaultValue: false) + final bool amazonEnable; + + @JsonKey(name: "imp_gap_s", defaultValue: 120) + final int impGapInSeconds; + + AdInterstitialConfig(this.freeInSecond, this.validation, this.scenes, this.retryMinTimeInSecond, + this.retryMaxTimeInSecond, + {this.amazonEnable = true, required this.specialScenes, required this.impGapInSeconds}); + + factory AdInterstitialConfig.fromJson(Map json) => + _$AdInterstitialConfigFromJson(json); + + Map toJson() => _$AdInterstitialConfigToJson(this); + + bool checkSceneEnabled(String scene) { + return scenes.contains(scene); + } + + int getSceneImpGapInSeconds(String scene) { + return specialScenes[scene] ?? impGapInSeconds; + } + + Future checkFreeTime() async { + final firstInstallTime = + await AppProperty.getInstance().getInt(PropertyKeys.firstInstallTime, defValue: 0); + return ((DateTimeUtils.currentTimeInMillis() - firstInstallTime) / 1000) >= freeInSecond; + } + + Future canPreload({AdsValidator? validator}) async { + if (!(await checkFreeTime())) { + return false; + } + if (await validator?.call() == false) { + return false; + } + return true; + } + + Future check(String scene, {AdsValidator? validator}) async { + Log.d("check: $this", tag: "Ads"); + if (!checkSceneEnabled(scene)) { + return AdCause.disabledScene; + } + if (!(await checkFreeTime())) { + return AdCause.invalidRequest; + } + if (await validator?.call() == false) { + return AdCause.invalidRequest; + } + return AdCause.success; + } + + @override + String toString() { + return 'AdInterstitialConfig{freeInSecond: $freeInSecond, validation: $validation, scenes: $scenes, retryMinTimeInSecond: $retryMinTimeInSecond, retryMaxTimeInSecond: $retryMaxTimeInSecond, amazonEnable: $amazonEnable}'; + } + + RetryConfig get retryConfig => RetryConfig(retryMinTimeInSecond, retryMaxTimeInSecond); +} + +@JsonSerializable() +class StrategyAdsConfig { + @JsonKey(name: "iads") + final List? interstitialIds; + + StrategyAdsConfig({this.interstitialIds}); + + factory StrategyAdsConfig.fromJson(Map json) => + _$StrategyAdsConfigFromJson(json); + + Map toJson() => _$StrategyAdsConfigToJson(this); +} + +class RetryConfig { + final int minInSecond; + final int maxInSecond; + + RetryConfig(this.minInSecond, this.maxInSecond); +} + +@JsonSerializable() +class AdRewardedConfig { + @JsonKey(name: "retry_min_s", defaultValue: 4) + final int retryMinTimeInSecond; + + @JsonKey(name: "retry_max_s", defaultValue: 600) + final int retryMaxTimeInSecond; + + @JsonKey(name: "reset_ads", defaultValue: true) + final bool resetAds; + + @JsonKey(name: "validation", defaultValue: '') + final String validation; + + AdRewardedConfig(this.retryMinTimeInSecond, this.retryMaxTimeInSecond, + {this.resetAds = true, this.validation = ''}); + + factory AdRewardedConfig.fromJson(Map json) => _$AdRewardedConfigFromJson(json); + + Map toJson() => _$AdRewardedConfigToJson(this); + + RetryConfig get retryConfig => RetryConfig(retryMinTimeInSecond, retryMaxTimeInSecond); + + Future check(String scene, {AdsValidator? validator}) async { + if (GuruApp.instance.appSpec.deployment.disableRewardsAds) { + return AdCause.adsDisabled; + } + if (await validator?.call() == false) { + return AdCause.invalidRequest; + } + return AdCause.success; + } + + Future canPreload({AdsValidator? validator}) async { + if (GuruApp.instance.appSpec.deployment.disableRewardsAds) { + return false; + } + if (await validator?.call() == false) { + return false; + } + return true; + } + + @override + String toString() { + return 'AdRewardedConfig{retryMinTimeInSecond: $retryMinTimeInSecond, retryMaxTimeInSecond: $retryMaxTimeInSecond, resetAds: $resetAds}'; + } +} + +@JsonSerializable() +class IOSAttConfig { + @JsonKey(name: "enable", defaultValue: false) + bool enable; + + IOSAttConfig({this.enable = false}); + + factory IOSAttConfig.fromJson(Map json) => _$IOSAttConfigFromJson(json); + + Map toJson() => _$IOSAttConfigToJson(this); +} + +@JsonSerializable() +class CommonAdsConfig { + @JsonKey(name: "compliant_init", defaultValue: false) + final bool compliantInitialization; + + CommonAdsConfig({this.compliantInitialization = false}); + + factory CommonAdsConfig.fromJson(Map json) => _$CommonAdsConfigFromJson(json); + + Map toJson() => _$CommonAdsConfigToJson(this); +} diff --git a/guru_app/lib/ads/core/ads_config.g.dart b/guru_app/lib/ads/core/ads_config.g.dart new file mode 100644 index 0000000..b8be8a1 --- /dev/null +++ b/guru_app/lib/ads/core/ads_config.g.dart @@ -0,0 +1,200 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'ads_config.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TaichiConfig _$TaichiConfigFromJson(Map json) => TaichiConfig( + enable: json['enable'] as bool? ?? false, + threshold: json['threshold'] as String? ?? '', + abnormalThreshold: + (json['abnormal_threshold'] as num?)?.toDouble() ?? 1.0, + ); + +Map _$TaichiConfigToJson(TaichiConfig instance) => + { + 'enable': instance.enable, + 'threshold': instance.threshold, + 'abnormal_threshold': instance.abnormalThreshold, + }; + +ImpressionData _$ImpressionDataFromJson(Map json) => + ImpressionData( + platform: json['ad_platform'] as String? ?? 'MAX', + id: json['id'] as String? ?? '', + unitId: json['adunit_id'] as String? ?? '', + unitName: json['adunit_name'] as String? ?? '', + unitFormat: json['adunit_format'] as String? ?? '', + groupId: json['adgroup_id'] as String? ?? '', + groupName: json['adgroup_name'] as String? ?? '', + groupType: json['adgroup_type'] as String? ?? '', + currency: json['currency'] as String? ?? '', + country: json['country'] as String? ?? '', + appVersion: json['app_version'] as String? ?? '', + groupPriority: json['adgroup_priority'] as int? ?? 0, + publisherRevenue: (json['publisher_revenue'] as num?)?.toDouble() ?? -1, + networkName: json['network_name'] as String? ?? '', + networkPlacementId: json['network_placement_id'] as String? ?? '', + precision: json['precision'] as String? ?? '', + ); + +Map _$ImpressionDataToJson(ImpressionData instance) => + { + 'ad_platform': instance.platform, + 'id': instance.id, + 'adunit_id': instance.unitId, + 'adunit_name': instance.unitName, + 'adunit_format': instance.unitFormat, + 'adgroup_id': instance.groupId, + 'adgroup_name': instance.groupName, + 'adgroup_type': instance.groupType, + 'currency': instance.currency, + 'country': instance.country, + 'app_version': instance.appVersion, + 'adgroup_priority': instance.groupPriority, + 'publisher_revenue': instance.publisherRevenue, + 'network_name': instance.networkName, + 'network_placement_id': instance.networkPlacementId, + 'precision': instance.precision, + }; + +CpmCalibrationData _$CpmCalibrationDataFromJson(Map json) => + CpmCalibrationData( + (json['list'] as List?) + ?.map( + (e) => CpmCalibrationItem.fromJson(e as Map)) + .toList() ?? + [], + ); + +Map _$CpmCalibrationDataToJson(CpmCalibrationData instance) => + { + 'list': instance.items, + }; + +CpmCalibrationItem _$CpmCalibrationItemFromJson(Map json) => + CpmCalibrationItem( + json['format'] as String, + (json['cpm'] as num).toDouble(), + json['country'] as String, + ); + +Map _$CpmCalibrationItemToJson(CpmCalibrationItem instance) => + { + 'format': instance.format, + 'cpm': instance.cpm, + 'country': instance.country, + }; + +IRLDConfig _$IRLDConfigFromJson(Map json) => IRLDConfig( + fbCpmCacheInHour: json['fb_ecpm_cache_h'] as int? ?? 12, + fbIrldReport: json['fb_irld_report'] as bool? ?? false, + abnormalThreshold: + (json['abnormal_threshold'] as num?)?.toDouble() ?? 0.1, + ); + +Map _$IRLDConfigToJson(IRLDConfig instance) => + { + 'fb_ecpm_cache_h': instance.fbCpmCacheInHour, + 'fb_irld_report': instance.fbIrldReport, + 'abnormal_threshold': instance.abnormalThreshold, + }; + +AdBannerConfig _$AdBannerConfigFromJson(Map json) => + AdBannerConfig( + json['free_s'] as int? ?? 600, + json['validation'] as String? ?? '', + json['amazon_enable'] as bool? ?? false, + json['pubmatic_enable'] as bool? ?? false, + json['auto_dispose_interval_m'] as int? ?? 5, + ); + +Map _$AdBannerConfigToJson(AdBannerConfig instance) => + { + 'free_s': instance.freeInSecond, + 'validation': instance.validation, + 'amazon_enable': instance.amazonEnable, + 'pubmatic_enable': instance.pubmaticEnable, + 'auto_dispose_interval_m': instance.autoDisposeIntervalInMinutes, + }; + +AdInterstitialConfig _$AdInterstitialConfigFromJson( + Map json) => + AdInterstitialConfig( + json['free_s'] as int? ?? 600, + json['validation'] as String? ?? '', + json['scene'] == null + ? [] + : joinedStringConvert.fromJson(json['scene'] as String), + json['retry_min_s'] as int? ?? 4, + json['retry_max_s'] as int? ?? 600, + amazonEnable: json['amazon_enable'] as bool? ?? false, + specialScenes: json['sp_scene'] == null + ? {'new_block': 120, 'reset_scs': 120} + : configStringIntMapStringConvert + .fromJson(json['sp_scene'] as String), + impGapInSeconds: json['imp_gap_s'] as int? ?? 120, + ); + +Map _$AdInterstitialConfigToJson( + AdInterstitialConfig instance) => + { + 'free_s': instance.freeInSecond, + 'validation': instance.validation, + 'scene': joinedStringConvert.toJson(instance.scenes), + 'sp_scene': + configStringIntMapStringConvert.toJson(instance.specialScenes), + 'retry_min_s': instance.retryMinTimeInSecond, + 'retry_max_s': instance.retryMaxTimeInSecond, + 'amazon_enable': instance.amazonEnable, + 'imp_gap_s': instance.impGapInSeconds, + }; + +StrategyAdsConfig _$StrategyAdsConfigFromJson(Map json) => + StrategyAdsConfig( + interstitialIds: (json['iads'] as List?) + ?.map((e) => AdId.fromJson(e as Map)) + .toList(), + ); + +Map _$StrategyAdsConfigToJson(StrategyAdsConfig instance) => + { + 'iads': instance.interstitialIds, + }; + +AdRewardedConfig _$AdRewardedConfigFromJson(Map json) => + AdRewardedConfig( + json['retry_min_s'] as int? ?? 4, + json['retry_max_s'] as int? ?? 600, + resetAds: json['reset_ads'] as bool? ?? true, + validation: json['validation'] as String? ?? '', + ); + +Map _$AdRewardedConfigToJson(AdRewardedConfig instance) => + { + 'retry_min_s': instance.retryMinTimeInSecond, + 'retry_max_s': instance.retryMaxTimeInSecond, + 'reset_ads': instance.resetAds, + 'validation': instance.validation, + }; + +IOSAttConfig _$IOSAttConfigFromJson(Map json) => IOSAttConfig( + enable: json['enable'] as bool? ?? false, + ); + +Map _$IOSAttConfigToJson(IOSAttConfig instance) => + { + 'enable': instance.enable, + }; + +CommonAdsConfig _$CommonAdsConfigFromJson(Map json) => + CommonAdsConfig( + compliantInitialization: json['compliant_init'] as bool? ?? false, + ); + +Map _$CommonAdsConfigToJson(CommonAdsConfig instance) => + { + 'compliant_init': instance.compliantInitialization, + }; diff --git a/guru_app/lib/ads/core/ads_impression.dart b/guru_app/lib/ads/core/ads_impression.dart new file mode 100644 index 0000000..f3abef7 --- /dev/null +++ b/guru_app/lib/ads/core/ads_impression.dart @@ -0,0 +1,189 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/firebase/remoteconfig/remote_config_manager.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_utils/collection/collectionutils.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applovin_flutter/ad_impression.dart'; + +import 'ads_config.dart'; +import 'exceptions/ads_exceptions.dart'; + +const ltvPhaseNames = [ + "tch_ad_rev_top40", + "tch_ad_rev_top30", + "tch_ad_rev_top20", + "tch_ad_rev_top10", + "tch_ad_rev_top5" +]; + +class AdImpressionController { + final List ltvThresholds = []; + final Map adsParams = {}; + static String latestImpressionPayload = ""; + TaichiConfig? taichiConfig; + + AdImpressionController() {} + + Future _init() async { + try { + taichiConfig = RemoteConfigManager.instance.getTaichiConfig(); + final config = taichiConfig; + if (config != null && config.enable && config.threshold.isNotEmpty) { + Log.d("set thresholds prepare! ${config.threshold}"); + final thresholdStrings = config.threshold.split(","); + if (thresholdStrings.isNotEmpty) { + try { + final thresholds = thresholdStrings.map((e) => double.parse(e)).toList(); + ltvThresholds.clear(); + ltvThresholds.addAll(thresholds); + Log.d("set thresholds success! $thresholds"); + } catch (error, stacktrace) { + Log.d("set thresholds error!", error: error, stackTrace: stacktrace); + } + } + } + } catch (error, stacktrace) { + Log.d('AdImpressionController params TaichiConfig err', error: error, stackTrace: stacktrace); + } + } + + void init() async { + await _init(); + + AdImpressionListener.addCallback((event, Map arguments) async { + Log.d("------------addListener arguments$arguments"); + switch (event) { + case AdImpressionEvent.onAdImpression: + if (arguments != null) { + final payload = arguments["payload"]; + if (payload == null || payload.isEmpty) { + break; + } + final payloadMap = json.decode(payload); + ImpressionData impressionData = ImpressionData.fromJson(payloadMap); + // 判断是不是facebook的network + // if (impressionData.networkName == "undisclosed") { + // final calibrationCpm = await facebookCalibrator.getCpm(impressionData.unitFormat, impressionData.country); + // if (calibrationCpm > 0) { + // final newImpressionData = impressionData.derive(newPublisherRevenue: calibrationCpm); + // if (facebookCalibrator.config?.fbIrldReport == true) { + // AnalyticsUtils.logEventEx("tch_fb_ad_rev", value: calibrationCpm, parameters: { + // FirebaseEventsParams.AD_FORMAT: impressionData.unitFormat, + // FirebaseEventsParams.AD_UNIT_NAME: impressionData.unitName, + // FirebaseEventsParams.CURRENCY: impressionData.currency, + // "country": impressionData.country, + // "mopub_rev": impressionData.publisherRevenue + // }); + // } + // + // impressionData = newImpressionData; + // } + // } + await refreshLtv(impressionData); + // _reportAdImpression(arguments); + + final jsonPayload = jsonEncode(impressionData.payload); + latestImpressionPayload = jsonPayload; + if (impressionData.publisherRevenue > 0) { + // AdjustAdRevenue adRevenue = AdjustAdRevenue(AdjustConfig.AdRevenueSourceAppLovinMAX); + // adRevenue.setRevenue(impressionData.publisherRevenue, "USD"); + // adRevenue.adRevenueNetwork = impressionData.networkName; + // adRevenue.adRevenueUnit = impressionData.unitId; + // adRevenue.adRevenuePlacement = impressionData.networkPlacementId; + // Adjust.trackAdRevenueNew(adRevenue); + + GuruAnalytics.instance.loadAdjustAdRevenue(impressionData); + } + } + break; + } + }); + } + + _reportAdImpression(Map arguments) { + // adFormat 为:BANNER,REWARDED,INTER + final adFormat = arguments["ad_format"] ?? ""; + GuruAnalytics.instance.logAdImpression("max_imp", adFormat, + adName: Platform.isIOS ? "isd_$adFormat" : "sd_$adFormat"); + } + + void onImpression(Map arguments) {} + + Future refreshLtv(ImpressionData impressionData) async { + final revenue = impressionData.publisherRevenue; + final adPlatform = impressionData.platform; + final currency = impressionData.currency; + if (revenue != -1) { + _logAdRevenue(impressionData); + // _logAdLtv(revenue: revenue, adPlatform: adPlatform, currency: currency); + } + Log.d("refreshLtv payload:${impressionData.payload}"); + } + + // _logAdLtv({double revenue = 0.0, String adPlatform = "MAX", String currency = ""}) async { + // final nowDate = DateTimeUtils.yyyyMMddUtcNum; + // final appProperty = AppProperty.getInstance(); + // final totalLtv = await appProperty.getDouble(PropertyKeys.totalLtv, defValue: 0.0); + // final previousDate = await appProperty.getInt(PropertyKeys.previousLtvDate, defValue: 0); + // double previousLtv = await appProperty.getDouble(PropertyKeys.previousLtv, defValue: 0.0); + // if (previousDate != nowDate) { + // previousLtv = 0.0; + // appProperty.setInt(PropertyKeys.previousLtvDate, nowDate); + // } + // final currentLtv = previousLtv + revenue; + // for (int i = 0; i < ltvThresholds.length; ++i) { + // if (previousLtv < ltvThresholds[i] && currentLtv >= ltvThresholds[i]) { + // if (i < ltvPhaseNames.length) { + // Analytics.instance.logAdLtv(ltvPhaseNames[i], currentLtv); + // } + // } + // } + // AppProperty.getInstance().setDouble(PropertyKeys.previousLtv, currentLtv); + // AppProperty.getInstance().setDouble(PropertyKeys.totalLtv, totalLtv + revenue); + // } + + _logAdRevenue(ImpressionData data) async { + final appProperty = AppProperty.getInstance(); + + GuruAnalytics.instance.logAdImp(data); + + final abnormalThreshold = taichiConfig?.abnormalThreshold ?? 1; + if (data.publisherRevenue >= abnormalThreshold) { + try { + final parameters = CollectionUtils.filterOutNulls({ + "ad_platform": data.platform, + "value": data.publisherRevenue, + "currency": data.currency, + "ad_format": data.unitFormat, + "ad_source": data.networkName, + "ad_unit_name": data.unitName, + "country": data.country, + "precision": data.precision + }); + GuruAnalytics.instance.logEvent("tch_ad_rev_value_abnormal", parameters); + final payload = data.payload; + GuruAnalytics.instance.logException(AbnormalRevenueException(payload.toString()), + stacktrace: StackTrace.current); + Log.d(payload.toString()); + return; + } catch (error, stacktrace) { + Log.d("convert impression data error! $error", stackTrace: stacktrace); + } + } + + double totalRevenue = await appProperty.getDouble(PropertyKeys.totalRevenue, defValue: 0.0); + totalRevenue += data.publisherRevenue; + if (totalRevenue >= 0.01) { + GuruAnalytics.instance.logAdRevenue(totalRevenue, data.platform, data.currency); + GuruAnalytics.instance.logPurchase(totalRevenue, + currency: data.currency, contentId: "MAX", adPlatform: "MAX"); + + totalRevenue = .0; + } + appProperty.setDouble(PropertyKeys.totalRevenue, totalRevenue); + } +} diff --git a/guru_app/lib/ads/core/banner/banner_ads.dart b/guru_app/lib/ads/core/banner/banner_ads.dart new file mode 100644 index 0000000..c0b8dff --- /dev/null +++ b/guru_app/lib/ads/core/banner/banner_ads.dart @@ -0,0 +1,11 @@ +/// Created by Haoyi on 5/10/21 + +part of '../ads.dart'; + +abstract class BannerAds extends SingleAds with AdsAudit { + @override + void init() { + super.init(); + addObserver(BannerAdsReportEventsObserver()); + } +} diff --git a/guru_app/lib/ads/core/banner/banner_ads_handler.dart b/guru_app/lib/ads/core/banner/banner_ads_handler.dart new file mode 100644 index 0000000..fdf56d6 --- /dev/null +++ b/guru_app/lib/ads/core/banner/banner_ads_handler.dart @@ -0,0 +1,79 @@ +/// Created by Haoyi on 5/11/21 +part of '../ads.dart'; + +class BannerAdsReportEventsObserver extends AdsLifecycleObserver { + void _apply(AdsBundle adsBundle, void Function(BannerAds ads) callback) { + if (adsBundle.ads is BannerAds) { + try { + callback(adsBundle.ads as BannerAds); + } catch (error, stacktrace) { + Log.i('BannerAdsReportEventsHandler apply error:$error, $stacktrace'); + } + } + } + + @override + void onRequestLoad(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("bads_load"); + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + // AnalyticsUtils.logEventEx("bads_loaded", + // parameters: {"duration": ads.elapsedTimeInMillisSinceStartLoadAds}); + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + // TODO + // AnalyticsUtils.logEventEx("bads_failed", itemCategory: "load", parameters: { + // "duration": ads.elapsedTimeInMillisSinceStartLoadAds, + // "error_code": errorCode + // }); + }); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + // TODO + // AnalyticsUtils.logEventEx("bads_failed", + // itemCategory: "imp", + // parameters: {"duration": ads.elapsedTimeInMillisSinceLoadedAds, "error_code": errorCode}); + }); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + // AnalyticsUtils.logAdImpression("bads_imp", AdTypeName.AD_TYPE_BANNER, + // scene: ads.scene, + // adName: ads.scene, + // parameters: {"duration": "${ads.elapsedTimeInMillisSinceLoadedAds}"}); + }); + } + + @override + void onAdClicked(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logAdClick("bads_clk", AdTypeName.AD_TYPE_BANNER, + scene: ads.scene, adName: ads.scene); + AiBi.instance.adsClk(AdsType.banner, adScene: ads.scene); + }); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("bads_close", itemCategory: ads.scene); + AiBi.instance.adsHide(AdsType.banner, adScene: ads.scene); + }); + } +} diff --git a/guru_app/lib/ads/core/exceptions/ads_exceptions.dart b/guru_app/lib/ads/core/exceptions/ads_exceptions.dart new file mode 100644 index 0000000..995c5e7 --- /dev/null +++ b/guru_app/lib/ads/core/exceptions/ads_exceptions.dart @@ -0,0 +1,23 @@ +/// Created by Haoyi on 2021/9/3 + +class AbnormalRevenueException implements Exception { + final String payload; + + AbnormalRevenueException(this.payload); + + @override + String toString() { + return 'AbnormalRevenueException{payload: $payload}'; + } +} + +class ShowRewardedVideoAdsException implements Exception { + final String message; + + ShowRewardedVideoAdsException(this.message); + + @override + String toString() { + return 'ShowRewardedVideoAdsException{payload: $message}'; + } +} diff --git a/guru_app/lib/ads/core/handler/ads_audit.dart b/guru_app/lib/ads/core/handler/ads_audit.dart new file mode 100644 index 0000000..f799da2 --- /dev/null +++ b/guru_app/lib/ads/core/handler/ads_audit.dart @@ -0,0 +1,142 @@ +/// Created by Haoyi on 5/7/21 + +part of '../ads.dart'; + +mixin AdsAudit on Ads { + int latestShownAt = 0; + int latestStartLoadAt = 0; + int latestLoadedAt = 0; + int latestHiddenAt = 0; + String scene = ""; + int loadCount = 0; + + int get elapsedTimeInMillisSinceLoadedAds => DateTimeUtils.currentTimeInMillis() - latestLoadedAt; + + int get elapsedTimeInMillisSinceStartLoadAds => + DateTimeUtils.currentTimeInMillis() - latestStartLoadAt; + + void resetLatestLoadedAt() { + latestLoadedAt = 0; + } + + void resetAudit() { + latestShownAt = 0; + latestHiddenAt = 0; + latestLoadedAt = 0; + latestStartLoadAt = 0; + scene = ""; + } +} + +class AdsAuditObserver extends AdsLifecycleObserver { + String adsName; + + final String tag; + + AdsAuditObserver(this.adsName, {this.tag = PropertyTags.ads}); + + @override + String get name => "$adsName-AuditObs"; + + void _apply(AdsBundle adsBundle, void Function(AdsAudit) callback) { + if (adsBundle.ads is AdsAudit) { + callback(adsBundle.ads as AdsAudit); + } + } + + @override + void onRequestShow(AdsBundle adsBundle) { + Log.i("[$name] onRequestShow! ${adsBundle.arguments}", tag: tag); + _apply(adsBundle, (adsAudit) { + final adCause = adsBundle.getValue("cause", defValue: AdCause.internalError); + if (adCause == AdCause.success) { + adsAudit.scene = adsBundle.getString("scene"); + adsAudit.setProperty("latestScene", adsAudit.scene); + } + }); + } + + @override + void onRequestLoad(AdsBundle adsBundle) { + Log.i("[$name] onRequestLoad! ", tag: tag); + _apply(adsBundle, (adsAudit) { + final adCause = adsBundle.getValue("cause", defValue: AdCause.internalError); + final now = DateTimeUtils.currentTimeInMillis(); + final humanDate = DateTime.fromMillisecondsSinceEpoch(now).toString(); + if (adCause == AdCause.success) { + adsAudit.latestStartLoadAt = now; + adsAudit.setProperty("latestStartLoadTime", humanDate); + adsAudit.loadCount++; + adsAudit.setProperty("winCount", adsAudit.loadCount.toString()); + } else { + adsAudit.setProperty("latestLoadCause", "[$humanDate]:${adCause.toString()}"); + } + }); + } + + @override + void onRequestReset(AdsBundle adsBundle) { + Log.i("[$name] onRequestReset! ", tag: tag); + _apply(adsBundle, (adsAudit) async { + adsAudit.resetAudit(); + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + Log.i("[$name] onAdLoaded! ", tag: tag); + _apply(adsBundle, (adsAudit) { + adsAudit.latestLoadedAt = DateTimeUtils.currentTimeInMillis(); + adsAudit.setProperty("latestLoadedTime", + DateTime.fromMillisecondsSinceEpoch(adsAudit.latestLoadedAt).toString()); + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + Log.i("[$name] onAdLoadFailed! ", tag: tag); + _apply(adsBundle, (adsAudit) { + adsAudit.setProperty("latestLoadFailedTime", DateTime.now().toString()); + }); + } + + @override + Future onAdDisplayFailed(AdsBundle adsBundle) async { + Log.i("[$name] onHidden! ", tag: tag); + _apply(adsBundle, (adsAudit) { + adsAudit.setProperty("latestDisplayFailedTime", DateTime.now().toString()); + adsAudit.setProperty("latestCreativeId", adsBundle.getString("ad_creative_id")); + adsAudit.setProperty("latestNetworkName", adsBundle.getString("ad_network_name")); + }); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + Log.i("[$name] onAdDisplayed! ", tag: tag); + _apply(adsBundle, (adsAudit) { + adsAudit.setProperty("latestDisplayTime", DateTime.now().toString()); + adsAudit.setProperty("latestCreativeId", adsBundle.getString("ad_creative_id")); + adsAudit.setProperty("latestNetworkName", adsBundle.getString("ad_network_name")); + }); + } + + @override + void onAdClicked(AdsBundle adsBundle) {} + + @override + void onAdHidden(AdsBundle adsBundle) { + Log.i("[$name] onHidden! ", tag: tag); + + _apply(adsBundle, (adsAudit) { + final now = DateTime.now(); + adsAudit.latestHiddenAt = now.millisecondsSinceEpoch; + adsAudit.setProperty("latestHiddenTime", now.toString()); + AdsManager.instance.latestFullscreenAdsHiddenTimestamps = now.millisecondsSinceEpoch; + }); + } + + @override + void onAdRewarded(AdsBundle adsBundle) { + HookManager.instance.watchRewardAds(); + } +} diff --git a/guru_app/lib/ads/core/handler/ads_cache.dart b/guru_app/lib/ads/core/handler/ads_cache.dart new file mode 100644 index 0000000..d865158 --- /dev/null +++ b/guru_app/lib/ads/core/handler/ads_cache.dart @@ -0,0 +1,170 @@ +/// Created by Haoyi on 5/7/21 +part of '../ads.dart'; + +class RetryConfig { + final int minInSecond; + final int maxInSecond; + + RetryConfig(this.minInSecond, this.maxInSecond); +} + +mixin AdsCache on Ads { + int retryAttempt = 0; + + DateTime latestPreloadAt = DateTime.now(); + Timer? _retryTimer; + + RetryConfig get retryConfig => RetryConfig(4, 30); + + bool get isLoadingRewardAdsDelayed => _retryTimer != null; + + void _resetRetryTimer() { + try { + _retryTimer?.cancel(); + _retryTimer = null; + } catch (error, stacktrace) { + _retryTimer = null; + } + } + + void _resetPreload() { + retryAttempt = 0; + _resetRetryTimer(); + setProperty("Retry Attempt", "0"); + } + + @override + void preload() { + latestPreloadAt = DateTime.now(); + setProperty("Latest Preload Time", latestPreloadAt.toString()); + _resetRetryTimer(); + if (AdsManager.instance.connectivityStatus != ConnectivityResult.none) { + load(); + } + } + + @override + void retry() { + if (_retryTimer?.isActive == true) { + return; + } + retryAttempt++; + final delaySecond = pow(2, retryAttempt).toInt(); + final config = retryConfig; + final duration = Duration(seconds: delaySecond.clamp(config.minInSecond, config.maxInSecond)); + setProperty("Retry Attempt", retryAttempt.toString()); + setProperty("Retry Interval", duration.toString()); + _retryTimer = Timer(duration, () { + preload(); + }); + } +} + +class AdsCacheObserver extends AdsLifecycleObserver { + final String adsName; + + AdsCacheObserver(this.adsName); + + @override + String get name => "$adsName-AdsCache"; + + void _apply(AdsBundle adsBundle, void Function(AdsCache) callback) { + if (adsBundle.ads is AdsCache) { + callback(adsBundle.ads as AdsCache); + } + } + + @override + void onRequestShow(AdsBundle adsBundle) { + Log.i("[$name] onRequestShow! ${adsBundle.arguments}", tag: "Ads"); + _apply(adsBundle, (adsCache) async { + final adCause = adsBundle.getValue("cause", defValue: AdCause.internalError); + if (adCause != AdCause.success && adCause != AdCause.tooFrequent) { + final state = await adsCache.getState(); + Log.d("[$name] onRequestShow state:$state", tag: "Ads"); + if (state != AdState.loaded) { + adsCache.preload(); + } else { + Log.d("[$name] onRequestShow ignore preload! AdsState: $state", tag: "Ads"); + } + } + }); + } + + @override + void onRequestLoad(AdsBundle adsBundle) { + // Log.i("[$name] onRequestLoad! ${adsBundle.arguments}", tag: "Ads"); + _apply(adsBundle, (adsCache) async { + final state = await adsCache.getState(); + final adCause = adsBundle.getValue("cause", defValue: AdCause.internalError); + if (adCause != AdCause.success && state != AdState.loaded && state != AdState.loading) { + Log.d("[$name] onRequestLoad adCause:$adCause state:$state", tag: "Ads"); + adsCache.retry(); + } else { + if (state == AdState.loaded) { + adsCache._resetPreload(); + adsCache.loaded = true; + } + Log.d("[$name] onRequestLoad ignore preload! AdsState: $state", tag: "Ads"); + } + }); + } + + @override + void onRequestReset(AdsBundle adsBundle) { + Log.i("[$name] onRequestReset! ", tag: "Ads"); + _apply(adsBundle, (adsCache) async { + adsCache._resetPreload(); + }); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + Log.i("[$name] onAdDisplayed! ", tag: "Ads"); + _apply(adsBundle, (adsCache) { + adsCache.loaded = false; + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + Log.i("[$name] onAdLoaded! ", tag: "Ads"); + _apply(adsBundle, (adsCache) { + adsCache._resetPreload(); + adsCache.loaded = true; + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + Log.i("[$name] onAdLoadFailed! ", tag: "Ads"); + _apply(adsBundle, (adsCache) async { + adsCache.retry(); + adsCache.loaded = false; + + }); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) { + Log.i("[$name] onAdDisplayFailed! ", tag: "Ads"); + _apply(adsBundle, (adsCache) { + adsCache.preload(); + adsCache.loaded = false; + }); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + Log.i("[$name] onHidden! ", tag: "Ads"); + _apply(adsBundle, (adsCache) async { + final state = await adsCache.getState(); + if (state != AdState.loaded && state != AdState.loading) { + adsCache.loaded = false; + adsCache.preload(); + } else { + Log.d("[$name] onHidden ignore preload! AdsState: $state", tag: "Ads"); + } + }); + } +} diff --git a/guru_app/lib/ads/core/interstitial/interstitial_ads.dart b/guru_app/lib/ads/core/interstitial/interstitial_ads.dart new file mode 100644 index 0000000..3d2063f --- /dev/null +++ b/guru_app/lib/ads/core/interstitial/interstitial_ads.dart @@ -0,0 +1,11 @@ +/// Created by Haoyi on 5/6/21 + +part of '../ads.dart'; + +abstract class InterstitialAds extends SingleAds with AdsCache, AdsAudit { + @override + void init() { + super.init(); + addObserver(InterstitialAdsReportEventsObserver()); + } +} diff --git a/guru_app/lib/ads/core/interstitial/interstitial_ads_handler.dart b/guru_app/lib/ads/core/interstitial/interstitial_ads_handler.dart new file mode 100644 index 0000000..9275e1a --- /dev/null +++ b/guru_app/lib/ads/core/interstitial/interstitial_ads_handler.dart @@ -0,0 +1,102 @@ +/// Created by Haoyi on 5/10/21 +part of '../ads.dart'; + +class InterstitialAdsReportEventsObserver extends AdsLifecycleObserver { + @override + String get name => "InterstitialAdsReportEventsHandler"; + + void _apply(AdsBundle adsBundle, void Function(AdsAudit ads) callback) { + if (adsBundle.ads is AdsAudit) { + try { + callback(adsBundle.ads as AdsAudit); + } catch (error, stacktrace) { + Log.i('InterstitialAdsHandler apply error:$error, $stacktrace'); + } + } + } + + @override + void onRequestLoad(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("iads_load"); + }); + } + + @override + void onRequestReset(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("iads_rebuild"); + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("iads_loaded", + parameters: {"duration": ads.elapsedTimeInMillisSinceStartLoadAds}); + + AiBi.instance.adsLoaded(AdsType.interstitial, + adScene: ads.scene, duration: ads.elapsedTimeInMillisSinceStartLoadAds); + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + GuruAnalytics.instance.logEventEx("iads_failed", itemCategory: "load", parameters: { + "duration": ads.elapsedTimeInMillisSinceStartLoadAds, + "error_code": errorCode + }); + AiBi.instance.adsFailed(AdsType.interstitial, adScene: ads.scene); + }); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + GuruAnalytics.instance.logEventEx("iads_failed", + itemCategory: "imp", + parameters: {"duration": ads.elapsedTimeInMillisSinceLoadedAds, "error_code": errorCode}); + Log.d( + "iads_display_failed creativeId:${adsBundle.getString("ad_creative_id")} networkName:${adsBundle.getString("ad_network_name")} errorCode:$errorCode duration:${ads.elapsedTimeInMillisSinceLoadedAds}", + syncFirebase: true); + AiBi.instance.adsFailed(AdsType.interstitial, adScene: ads.scene); + }); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logAdImpression("iads_imp", AdTypeName.AD_TYPE_INTERSTITIAL, + scene: ads.scene, + adName: ads.scene, + parameters: {"duration": "${ads.elapsedTimeInMillisSinceLoadedAds}"}); + Log.d( + "iads_imp creativeId:${adsBundle.getString("ad_creative_id")} networkName:${adsBundle.getString("ad_network_name")} duration:${ads.elapsedTimeInMillisSinceLoadedAds}", + syncFirebase: true); + AiBi.instance.adsImp(AdsType.interstitial, + adScene: ads.scene, + adRevenue: adsBundle.getDouble("ad_revenue", defValue: 0.0), + network: adsBundle.getString("ad_network_name", defValue: "unknown")); + }); + } + + @override + void onAdClicked(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logAdClick("iads_clk", AdTypeName.AD_TYPE_INTERSTITIAL, + scene: ads.scene, adName: ads.scene); + AiBi.instance.adsClk(AdsType.interstitial, adScene: ads.scene); + }); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("iads_close", itemCategory: ads.scene); + AiBi.instance.adsHide(AdsType.interstitial, adScene: ads.scene); + }); + } +} diff --git a/guru_app/lib/ads/core/rewards/rewarded_ads.dart b/guru_app/lib/ads/core/rewards/rewarded_ads.dart new file mode 100644 index 0000000..d61b971 --- /dev/null +++ b/guru_app/lib/ads/core/rewards/rewarded_ads.dart @@ -0,0 +1,11 @@ +/// Created by Haoyi on 5/26/21 + +part of '../ads.dart'; + +abstract class RewardedAds extends SingleAds with AdsCache, AdsAudit { + @override + void init() { + super.init(); + addObserver(RewardedAdsReportEventsObserver()); + } +} diff --git a/guru_app/lib/ads/core/rewards/rewarded_ads_handler.dart b/guru_app/lib/ads/core/rewards/rewarded_ads_handler.dart new file mode 100644 index 0000000..09aa677 --- /dev/null +++ b/guru_app/lib/ads/core/rewards/rewarded_ads_handler.dart @@ -0,0 +1,116 @@ +/// Created by Haoyi on 5/26/21 + +part of '../ads.dart'; + +class RewardedAdsReportEventsObserver extends AdsLifecycleObserver { + String get name => "RewardedAdsReportEventsHandler"; + + void _apply(AdsBundle adsBundle, void Function(RewardedAds ads) callback) { + if (adsBundle.ads is RewardedAds) { + try { + callback(adsBundle.ads as RewardedAds); + } catch (error, stacktrace) { + Log.w('RewardedAdsHandler apply error', error: error, stackTrace: stacktrace); + } + } + } + + @override + void onRequestLoad(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("rads_load"); + AiBi.instance.adsLoad(AdsType.rewarded, adScene: ads.scene); + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("rads_loaded", + parameters: {"duration": ads.elapsedTimeInMillisSinceStartLoadAds}); + AiBi.instance.adsLoaded(AdsType.rewarded, + adScene: ads.scene, duration: ads.elapsedTimeInMillisSinceStartLoadAds); + }); + } + + @override + void onRequestReset(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("rads_rebuild"); + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + GuruAnalytics.instance.logEventEx("rads_failed", itemCategory: "load", parameters: { + "duration": ads.elapsedTimeInMillisSinceStartLoadAds, + "error_code": errorCode + }); + AiBi.instance.adsFailed(AdsType.rewarded, adScene: ads.scene); + }); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + String errorCode = adsBundle.arguments["errorName"] ?? "Unknown"; + GuruAnalytics.instance.logEventEx("rads_failed", + itemCategory: "imp", + parameters: {"duration": ads.elapsedTimeInMillisSinceLoadedAds, "error_code": errorCode}); + Log.d( + "rads_display_failed creativeId:${adsBundle.getString("ad_creative_id")} networkName:${adsBundle.getString("ad_network_name")} errorCode:$errorCode duration:${ads.elapsedTimeInMillisSinceLoadedAds}", + syncFirebase: true); + AiBi.instance.adsFailed(AdsType.rewarded, adScene: ads.scene); + }); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logAdImpression("rads_imp", AdTypeName.AD_TYPE_REWARDED_VIDEO, + scene: ads.scene, + adName: ads.scene, + parameters: {"duration": "${ads.elapsedTimeInMillisSinceLoadedAds}"}); + Log.d( + "rads_imp creativeId:${adsBundle.getString("ad_creative_id")} networkName:${adsBundle.getString("ad_network_name")} duration:${ads.elapsedTimeInMillisSinceLoadedAds}", + syncFirebase: true); + AiBi.instance.adsImp(AdsType.rewarded, + adScene: ads.scene, + adRevenue: adsBundle.getDouble("ad_revenue", defValue: 0), + network: adsBundle.getString("ad_network_name", defValue: "unknown")); + }); + } + + @override + void onAdClicked(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logAdClick("rads_clk", AdTypeName.AD_TYPE_REWARDED_VIDEO, + scene: ads.scene, adName: ads.scene); + AiBi.instance.adsClk(AdsType.rewarded, adScene: ads.scene); + }); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + _apply(adsBundle, (ads) { + GuruAnalytics.instance.logEventEx("rads_close", itemCategory: ads.scene); + AiBi.instance.adsHide(AdsType.rewarded, adScene: ads.scene); + }); + } + + @override + void onAdRewarded(AdsBundle adsBundle) { + _apply(adsBundle, (ads) async { + GuruAnalytics.instance.logEventEx("rads_rewarded", itemCategory: ads.scene); + final userRewardedCount = + await AppProperty.getInstance().getInt(PropertyKeys.userRewardedCount, defValue: 0); + if (userRewardedCount == 0) { + GuruAnalytics.instance.logEventEx("first_rads_rewarded", itemCategory: ads.scene); + } + await AppProperty.getInstance().setInt(PropertyKeys.userRewardedCount, userRewardedCount + 1); + AiBi.instance.adsRewarded(ads.scene); + }); + } +} diff --git a/guru_app/lib/ads/core/strategy/ad_unit.dart b/guru_app/lib/ads/core/strategy/ad_unit.dart new file mode 100644 index 0000000..746f93e --- /dev/null +++ b/guru_app/lib/ads/core/strategy/ad_unit.dart @@ -0,0 +1,17 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/strategy/handler/ad_unit_cache.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; + +/// Created by Haoyi on 2023/6/28 + +abstract class AdUnit extends SingleAds with AdsAudit { + @override + final AdUnitId adUnitId; + final AdSlotId? amazonAdSlotId; + + AdUnit(this.adUnitId, {this.amazonAdSlotId}) { + // addObserver(AdUnitCacheObserver(adUnitId.id)); + addObserver(AdsAuditObserver("AdUnit[${adUnitId.id}]", tag: PropertyTags.strategyAds)); + } +} diff --git a/guru_app/lib/ads/core/strategy/handler/ad_unit_cache.dart b/guru_app/lib/ads/core/strategy/handler/ad_unit_cache.dart new file mode 100644 index 0000000..0ea6eb6 --- /dev/null +++ b/guru_app/lib/ads/core/strategy/handler/ad_unit_cache.dart @@ -0,0 +1,70 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/strategy/ad_unit.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; + +import '../../../../guru_app.dart'; + +/// Created by Haoyi on 2023/6/28 + +mixin AdUnitCache on SingleAds { +} + +class AdUnitCacheObserver extends AdsLifecycleObserver { + final String adsName; + + AdUnitCacheObserver(this.adsName); + + @override + String get name => "$adsName-AdUnitCache"; + + void _apply(AdsBundle adsBundle, void Function(AdUnitCache) callback) { + if (adsBundle.ads is AdUnitCache) { + callback(adsBundle.ads as AdUnitCache); + } + } + + @override + void onAdDisplayed(AdsBundle adsBundle) { + _apply(adsBundle, (adsCache) { + adsCache.loaded = false; + }); + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + Log.i("[$name] onAdLoaded! ", tag: PropertyTags.strategyAds); + _apply(adsBundle, (adsCache) { + adsCache.loaded = true; + }); + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) { + Log.i("[$name] onAdLoadFailed! ", tag: PropertyTags.strategyAds); + _apply(adsBundle, (adsCache) async { + adsCache.loaded = false; + }); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) { + Log.i("[$name] onAdDisplayFailed! ", tag: PropertyTags.strategyAds); + _apply(adsBundle, (adsCache) { + adsCache.loaded = false; + }); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + Log.i("[$name] onHidden! ", tag: PropertyTags.strategyAds); + _apply(adsBundle, (adsCache) async { + final state = await adsCache.getStatus(); + if (state != AdStatus.LOADED && state != AdStatus.LOADING) { + adsCache.loaded = false; + } else { + Log.d("[$name] onHidden ignore preload! AdsState: $state", tag: PropertyTags.strategyAds); + } + }); + } +} \ No newline at end of file diff --git a/guru_app/lib/ads/core/strategy/interstitial/max_interstitial_ad_unit.dart b/guru_app/lib/ads/core/strategy/interstitial/max_interstitial_ad_unit.dart new file mode 100644 index 0000000..6cd1fef --- /dev/null +++ b/guru_app/lib/ads/core/strategy/interstitial/max_interstitial_ad_unit.dart @@ -0,0 +1,107 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/strategy/ad_unit.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_applovin_flutter/interstitial_ad.dart'; +import 'package:guru_utils/ads/data/ads_model.dart'; + +/// Created by Haoyi on 2023/6/28 + +class MaxInterstitialAdUnit extends AdUnit { + late InterstitialAd interstitialAd; + + @override + final String name; + + MaxInterstitialAdUnit.create(AdUnitId adUnitId, AdSlotId? amazonAdSlotId) + : name = "MaxInterAdUnit-${adUnitId.id}", + super(adUnitId, amazonAdSlotId: amazonAdSlotId) { + addObserver(InterstitialAdsReportEventsObserver()); + } + + @override + void init() { + super.init(); + interstitialAd = InterstitialAd( + adUnitId: adUnitId.id, adAmazonSlotId: amazonAdSlotId?.id, listener: dispatchEvent); + } + + @override + Map get eventsMapping => { + InterstitialAdEvent.onAdLoaded: AdsEvent.adLoaded, + InterstitialAdEvent.onAdLoadFailed: AdsEvent.adLoadFailed, + InterstitialAdEvent.onAdDisplayFailed: AdsEvent.adDisplayFailed, + InterstitialAdEvent.onAdDisplayed: AdsEvent.adDisplayed, + InterstitialAdEvent.onAdClicked: AdsEvent.adClick, + InterstitialAdEvent.onAdHidden: AdsEvent.adHidden, + }; + + @override + Future requestDispose() async { + try { + return await interstitialAd.dispose() ?? false; + } catch (error, stacktrace) { + Log.w("[$name] requestDispose error", error: error, stackTrace: stacktrace); + return false; + } + } + + @override + Future requestHide() async { + return false; + } + + @override + Future requestLoad() async { + try { + Log.w("[$name] requestLoad", tag: PropertyTags.strategyAds); + final result = await interstitialAd.load() ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace", tag: PropertyTags.strategyAds); + return AdCause.internalError; + } + } + + @override + Future requestShow({required String scene, bool ignoreCheck = false}) async { + Log.d("[$name] requestShow", tag: PropertyTags.strategyAds, syncFirebase: true); + try { + final result = await interstitialAd.show() ?? false; + if (result) { + return AdCause.success; + } else { + return AdCause.requestFailed; + } + } catch (error, stacktrace) { + Log.w("requestShow error", + error: error, stackTrace: stacktrace, syncFirebase: true, tag: PropertyTags.strategyAds); + return AdCause.internalError; + } + } + + @override + Future checkLoaded() async { + try { + return await interstitialAd.isLoaded() ?? false; + } catch (error, stacktrace) { + return false; + } + } + + @override + Future getStatus() async { + try { + return await interstitialAd.getAdState(); + } catch (error, stacktrace) { + Log.w("[$name] getInterstitialAdStatus error", + error: error, stackTrace: stacktrace, syncFirebase: true, tag: PropertyTags.strategyAds); + return AdStatus.FAILED; + } + } +} diff --git a/guru_app/lib/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart b/guru_app/lib/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart new file mode 100644 index 0000000..861e298 --- /dev/null +++ b/guru_app/lib/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart @@ -0,0 +1,522 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; +import 'package:guru_app/ads/ads_manager.dart'; +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/strategy/ad_unit.dart'; +import 'package:guru_app/ads/core/strategy/interstitial/max_interstitial_ad_unit.dart'; +import 'package:guru_app/ads/core/strategy/strategy_ads.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/ads/ads_delegate.dart'; +import 'package:guru_utils/ads/data/ads_model.dart'; +import 'package:guru_utils/ads/handler/ads_handler.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; + +/// Created by Haoyi on 2023/6/28 + +typedef AdsEventDispatcher = void Function(AdsEvent, {Map arguments}); + +abstract class AdsStrategy extends AdsLifecycleObserver { + final AdsEventDispatcher eventDispatcher; + + AdsStrategy(this.eventDispatcher); + + bool get loaded; + + Stream get observableLoaded; + + Future requestLoad(); + + Future requestShow({required String scene}); + + Future requestHide(); + + Future requestReset(); + + Future getState(); + + Future requestDispose(); + + void dispatchEvent(AdsEvent adsEvent, + {Map arguments = const {}}) { + eventDispatcher.call(adsEvent, arguments: arguments); + } +} + +class AdUnitRetryAgent { + MaxInterstitialAdUnit? adUnit; + final RetryConfig retryConfig; + int retryAttempt = 0; + + Timer? _retryTimer; + + AdUnitRetryAgent(this.adUnit, this.retryConfig); + + void dispose() { + _retryTimer?.cancel(); + _retryTimer = null; + adUnit = null; + } + + Future retry() async { + final ad = adUnit; + if (_retryTimer?.isActive == true || ad == null) { + return false; + } + final adState = await ad.getState(); + if (adState == AdState.loaded) { + return false; + } + retryAttempt++; + final delaySecond = pow(2, retryAttempt).toInt(); + final config = retryConfig; + final duration = Duration(seconds: delaySecond.clamp(config.minInSecond, config.maxInSecond)); + _retryTimer = Timer(duration, () { + adUnit?.requestLoad(); + }); + return true; + } +} + +class MaxInterstitialStrategy extends AdsStrategy { + final List adUnits = []; + + MaxInterstitialAdUnit? _showingAdUnit; + + final BehaviorSubject _strategyAdsStateSubject = + BehaviorSubject.seeded(StrategyAdsState.init); + + StrategyAdsState get strategyAdsState => _strategyAdsStateSubject.value; + + set strategyAdsState(StrategyAdsState value) { + _strategyAdsStateSubject.add(value); + } + + Stream get observableStrategyAdsState => _strategyAdsStateSubject.stream; + + @override + bool get loaded => strategyAdsState == StrategyAdsState.loaded; + + final Map _loadedAdsArguments = {}; + + bool upcomingAdLoadedEvent = false; + + @override + Stream get observableLoaded => + observableStrategyAdsState.map((event) => event == StrategyAdsState.loaded); + + final List loadTimers = []; + + AdUnitRetryAgent? retryAgent; + + MaxInterstitialStrategy(List adIds, AdsEventDispatcher dispatcher) : super(dispatcher) { + for (var adId in adIds) { + adUnits.add(MaxInterstitialAdUnit.create(adId.adUnitId, adId.amazonAdSlotId) + ..addObserver(this) + ..init()); + } + } + + @override + void onAdLoaded(AdsBundle adsBundle) { + if (strategyAdsState != StrategyAdsState.loaded) { + disposeRetryAgent(); + strategyAdsState = StrategyAdsState.loaded; + _loadedAdsArguments.clear(); + _loadedAdsArguments.addAll(adsBundle.arguments); + if (_showingAdUnit == null) { + dispatchEvent(AdsEvent.adLoaded, arguments: adsBundle.arguments); + } else { + upcomingAdLoadedEvent = true; + } + } + } + + @override + void onAdLoadFailed(AdsBundle adsBundle) async { + // 如果 retryAgent 存在,证明无底价的广告正在加载,这个时候高价广告不需要加载 + // 这样的设计是该 strategy 的定义,如需修改,请重新定义一个新的 strategy + final _retryAgent = retryAgent; + if (_retryAgent != null) { + // 如果最在 retryAgent,将忽略其它的广告加载失败 + if (_retryAgent.adUnit != adsBundle.ads) { + return; + } + _retryAgent.retry(); + return; + } + final noReservePriceAdUnit = adUnits.safeLast; + // 如果是无底价广告加载失败,那么将会触发重试机制 + if (adsBundle.ads == noReservePriceAdUnit) { + retryAgent = AdUnitRetryAgent(noReservePriceAdUnit, RetryConfig(4, 30))..retry(); + return; + } + checkAndRetry(msg: "onAdLoadFailed"); + } + + @override + void onAdDisplayed(AdsBundle adsBundle) async { + _showingAdUnit = adsBundle.ads as MaxInterstitialAdUnit; + dispatchEvent(AdsEvent.adDisplayed, arguments: adsBundle.arguments); + } + + @override + void onAdDisplayFailed(AdsBundle adsBundle) async { + final failedAdUnit = adsBundle.ads as MaxInterstitialAdUnit; + for (var adUnit in adUnits) { + final state = await adUnit.getState(); + if (state != AdState.loaded || failedAdUnit == adUnit) { + continue; + } + Log.d("[${failedAdUnit.adUnitId}] AdDisplayFailed! use ${adUnit.adUnitId} Ads Instead", + tag: PropertyTags.strategyAds); + try { + final result = await adUnit.show(scene: failedAdUnit.scene); + if (result == AdCause.success) { + _showingAdUnit = adUnit; + return; + } else { + continue; + } + } catch (error, stacktrace) { + Log.w("requestShow error", + tag: PropertyTags.strategyAds, + error: error, + stackTrace: stacktrace, + syncFirebase: true); + continue; + } + } + dispatchEvent(AdsEvent.adDisplayFailed, arguments: adsBundle.arguments); + Log.d("onAdDisplayFailed [$runtimeType] Not Found valid ads! requestLoad", + tag: PropertyTags.strategyAds); + requestLoad(); + } + + @override + void onAdHidden(AdsBundle adsBundle) { + dispatchEvent(AdsEvent.adHidden, arguments: adsBundle.arguments); + Log.d("[${_showingAdUnit?.adUnitId}] onAdHidden!", tag: PropertyTags.strategyAds); + _showingAdUnit = null; + checkAndRetry(msg: "onAdHidden"); + } + + @override + void onAdClicked(AdsBundle adsBundle) { + dispatchEvent(AdsEvent.adClick, arguments: adsBundle.arguments); + } + + void disposeLoadTimer() { + for (var timer in loadTimers) { + timer.cancel(); + } + loadTimers.clear(); + } + + void disposeRetryAgent() { + retryAgent?.dispose(); + retryAgent = null; + } + + @override + Future requestLoad() async { + final loadAdUnits = []; + Log.d("[$runtimeType-$hashCode] requestLoad $strategyAdsState", tag: PropertyTags.strategyAds); + switch (strategyAdsState) { + case StrategyAdsState.init: + loadAdUnits.addAll(adUnits); + break; + case StrategyAdsState.loaded: + consumeUpcomingAdLoadedEvent(); + dispatchEvent(AdsEvent.adLoaded, arguments: _loadedAdsArguments); + return AdCause.success; + case StrategyAdsState.disposed: + return AdCause.loadFailed; + default: + strategyAdsState = StrategyAdsState.idle; + for (var adUnit in adUnits) { + final state = await adUnit.getState(); + Log.d("[$runtimeType] requestLoad check ${adUnit.adUnitId} is $state", + tag: PropertyTags.strategyAds); + if (state == AdState.loaded) { + strategyAdsState = StrategyAdsState.loaded; + consumeUpcomingAdLoadedEvent(); + dispatchEvent(AdsEvent.adLoaded, arguments: _loadedAdsArguments); + return AdCause.success; + } + if (state != AdState.loading && adUnit != _showingAdUnit) { + loadAdUnits.add(adUnit); + } + } + } + + if (loadAdUnits.isEmpty) { + return AdCause.success; + } + disposeLoadTimer(); + disposeRetryAgent(); + final timers = []; + const gap = Duration(seconds: 5); + Duration delay = Duration.zero; + AdCause result = AdCause.requestFailed; + for (var adUnit in loadAdUnits) { + try { + if (delay > Duration.zero) { + timers.add(Timer(delay, () async { + if (strategyAdsState != StrategyAdsState.disposed) { + final r = await adUnit.load(); + Log.d("[$runtimeType] request load ${adUnit.adUnitId} $r", + tag: PropertyTags.strategyAds); + } + })); + delay += gap; + } else { + result = await adUnit.load(); + if (result == AdCause.success) { + Log.d("[$runtimeType] request load ${adUnit.adUnitId} success", + tag: PropertyTags.strategyAds); + delay += gap; + } + } + } catch (error, stacktrace) { + Log.w("requestLoad error! $error $stacktrace", tag: PropertyTags.strategyAds); + continue; + } + } + loadTimers.addAll(timers); + return result; + } + + @override + Future requestShow({required String scene}) async { + final result = AdsManager.instance.canShowInterstitial(scene); + if (result != AdCause.success) { + return result; + } + if (strategyAdsState == StrategyAdsState.disposed) { + Log.d("[$runtimeType] requestShow Ads is disposed!", tag: PropertyTags.strategyAds); + return AdCause.displayFailed; + } + strategyAdsState = StrategyAdsState.idle; + for (var adUnit in adUnits) { + final state = await adUnit.getState(); + if (state != AdState.loaded) { + Log.d("[$runtimeType] requestShow Check!! Ads [${adUnit.adUnitId}] state is $state", + tag: PropertyTags.strategyAds); + continue; + } + + try { + final result = await adUnit.show(scene: scene); + Log.d("[$runtimeType] requestShow [${adUnit.adUnitId}]", tag: PropertyTags.strategyAds); + if (result == AdCause.success) { + _showingAdUnit = adUnit; + return AdCause.success; + } else { + continue; + } + } catch (error, stacktrace) { + Log.w("requestShow error ${adUnit.adUnitId}", + error: error, + stackTrace: stacktrace, + syncFirebase: true, + tag: PropertyTags.strategyAds); + continue; + } + } + Log.d("requestShow [$runtimeType] Not Found valid ads! requestLoad", + tag: PropertyTags.strategyAds); + requestLoad(); + return AdCause.requestFailed; + } + + bool consumeUpcomingAdLoadedEvent() { + final result = upcomingAdLoadedEvent; + upcomingAdLoadedEvent = false; + return result; + } + + @override + Future requestHide() async { + return false; + } + + @override + Future requestDispose() async { + for (var adUnit in adUnits) { + try { + Log.d("[$runtimeType] requestDispose [${adUnit.adUnitId}]", tag: PropertyTags.strategyAds); + await adUnit.dispose(); + } catch (error, stacktrace) { + Log.w("requestDispose error", + error: error, + stackTrace: stacktrace, + syncFirebase: true, + tag: PropertyTags.strategyAds); + } + } + adUnits.clear(); + strategyAdsState = StrategyAdsState.disposed; + return true; + } + + @override + Future getState() async { + final adStates = []; + for (var adUnit in adUnits) { + final state = await adUnit.getState(); + adStates.add(state); + } + + for (var state in adStates) { + if (state == AdState.loaded) { + return AdState.loaded; + } + } + + for (var state in adStates) { + if (state == AdState.loading) { + return AdState.loading; + } + } + + for (var state in adStates) { + if (state != AdState.failed) { + return AdState.created; + } + } + return AdState.failed; + } + + @override + Future requestReset() async { + return AdCause.internalError; + } + + void dispatchAdLoadedEvent() { + dispatchEvent(AdsEvent.adLoaded, arguments: _loadedAdsArguments); + } + + Future checkAndRetry({String? msg}) async { + if (strategyAdsState == StrategyAdsState.disposed) { + Log.d("[${msg ?? runtimeType}] checkAndRetry Ads is disposed!", + tag: PropertyTags.strategyAds); + return; + } + bool loading = false; + for (var adUnit in adUnits) { + try { + final state = await adUnit.getState(); + Log.d("[${msg ?? runtimeType}] checkAndRetry ad [${adUnit.adUnitId}] $state", + tag: PropertyTags.strategyAds); + if (state == AdState.loading) { + loading = true; + continue; + } + if (state == AdState.loaded) { + if (consumeUpcomingAdLoadedEvent()) { + dispatchEvent(AdsEvent.adLoaded, arguments: _loadedAdsArguments); + } + strategyAdsState = StrategyAdsState.loaded; + continue; + } + } catch (error, stacktrace) { + Log.w("check state error", + error: error, stackTrace: stacktrace, tag: PropertyTags.strategyAds); + } + } + if (loading) { + Log.d("[${msg ?? runtimeType}] checkAndRetry loading! waiting ads...", + tag: PropertyTags.strategyAds); + strategyAdsState = StrategyAdsState.idle; + return; + } + if (strategyAdsState != StrategyAdsState.loaded) { + Log.d("[${msg ?? runtimeType}] Not Found loaded ads! requestLoad", + tag: PropertyTags.strategyAds); + strategyAdsState = StrategyAdsState.init; + requestLoad(); + } + } +} + +class MaxStrategyInterstitialAds extends StrategyAds with AdsAudit { + MaxStrategyInterstitialAds.create(List adIds) : super() { + strategy = MaxInterstitialStrategy(adIds, dispatchEvent); + } + + @override + @mustCallSuper + Future dispose() async { + bool result = false; + try { + result = await strategy.requestDispose(); + } catch (error, stacktrace) { + Log.d("requestDispose error:$error $stacktrace", tag: PropertyTags.strategyAds); + } + onRequestDispose(AdsBundle.create(this)); + super.dispose(); + return result; + } + + @override + @mustCallSuper + Future reset() async { + AdCause result = AdCause.internalError; + try { + result = await strategy.requestReset(); + } catch (error, stacktrace) { + Log.d("requestReset error:$error $stacktrace", tag: PropertyTags.strategyAds); + } + onRequestReset(AdsBundle.create(this)); + return result == AdCause.success; + } + + @mustCallSuper + void init() {} + + @override + Future load() async { + final adCause = await strategy.requestLoad().catchError((error, stacktrace) { + Log.e("load error! ", + tag: PropertyTags.strategyAds, error: error, stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + }); + Log.d("[$runtimeType]request load complete!! $adCause", tag: PropertyTags.strategyAds); + onRequestLoad(AdsBundle.create(this, arguments: {"cause": adCause})); + return adCause; + } + + @override + Future hide() async { + onRequestHide(AdsBundle.create(this)); + return await strategy.requestHide(); + } + + @override + Future show({required String scene, bool ignoreCheck = false}) async { + final adCause = await strategy.requestShow(scene: scene).catchError((error, stacktrace) { + Log.e("show error! $error", stackTrace: stacktrace, syncFirebase: true); + return AdCause.internalError; + }); + Log.d("[$runtimeType]show $scene complete!! $adCause", + syncFirebase: true, tag: PropertyTags.strategyAds); + onRequestShow(AdsBundle.create(this, arguments: {"scene": scene, "cause": adCause})); + return adCause; + } + + @override + Future getState() async { + return await strategy.getState(); + } + + @override + void preload() { + if (AdsManager.instance.connectivityStatus != ConnectivityResult.none) { + load(); + } + } +} diff --git a/guru_app/lib/ads/core/strategy/strategy_ads.dart b/guru_app/lib/ads/core/strategy/strategy_ads.dart new file mode 100644 index 0000000..8d4c6c0 --- /dev/null +++ b/guru_app/lib/ads/core/strategy/strategy_ads.dart @@ -0,0 +1,60 @@ +import 'package:guru_app/ads/core/ads.dart'; +import 'package:guru_app/ads/core/strategy/interstitial/max_strategy_interstitial_ads.dart'; +import 'package:guru_utils/ads/ads_delegate.dart'; +import 'package:guru_utils/ads/data/ads_model.dart'; +import 'package:guru_utils/ads/handler/ads_handler.dart'; +import 'package:guru_utils/extensions/extensions.dart'; + +/// Created by Haoyi on 2023/6/27 + +enum StrategyAdsState { init, idle, loaded, disposed } + +enum StrategyAdsPhase { create, loading, loaded, displayed, } + +abstract class StrategyAds extends Ads { + final BehaviorSubject loadedSubject = BehaviorSubject.seeded(false); + + @override + set loaded(bool loaded) { + loadedSubject.addEx(loaded); + setProperty("isLoaded", loaded ? "true" : "false"); + } + + @override + bool get loaded => strategy.loaded; + + @override + Stream get observableLoaded => strategy.observableLoaded; + + late final AdsStrategy strategy; + + StrategyAds(); + + void dispatchEvent(AdsEvent adsEvent, + {Map arguments = const {}}) { + final adsBundle = AdsBundle.create(this, arguments: arguments); + switch (adsEvent) { + case AdsEvent.adLoaded: + onAdLoaded(adsBundle); + break; + case AdsEvent.adLoadFailed: + onAdLoadFailed(adsBundle); + break; + case AdsEvent.adDisplayed: + onAdDisplayed(adsBundle); + break; + case AdsEvent.adDisplayFailed: + onAdDisplayFailed(adsBundle); + break; + case AdsEvent.adClick: + onAdClicked(adsBundle); + break; + case AdsEvent.adHidden: + onAdHidden(adsBundle); + break; + case AdsEvent.adRewarded: + onAdRewarded(adsBundle); + break; + } + } +} diff --git a/guru_app/lib/ads/utils/ads_cpm_calibration.dart b/guru_app/lib/ads/utils/ads_cpm_calibration.dart new file mode 100644 index 0000000..db3ba44 --- /dev/null +++ b/guru_app/lib/ads/utils/ads_cpm_calibration.dart @@ -0,0 +1,6 @@ +/// Created by Haoyi on 2021/11/26 + +class AdsCpmCalibration { + static const defaultAndroidFacebookCpmCalibrationData = ''; + static const defaultIOSFacebookCpmCalibrationData = '{"data":{"list":[{"format":"inter","cpm":0.032877,"country":"us"},{"format":"reward","cpm":0.107767,"country":"us"},{"format":"inter","cpm":0.005034,"country":"in"},{"format":"reward","cpm":null,"country":"in"},{"format":"inter","cpm":0.011241,"country":"ca"},{"format":"reward","cpm":0.094526,"country":"ca"},{"format":"inter","cpm":0.003824,"country":"br"},{"format":"reward","cpm":0.009776,"country":"br"},{"format":"inter","cpm":0.049431,"country":"au"},{"format":"reward","cpm":0.056175,"country":"au"},{"format":"inter","cpm":0.012067,"country":"jp"},{"format":"reward","cpm":0.055358,"country":"jp"},{"format":"inter","cpm":0.01472,"country":"de"},{"format":"reward","cpm":0.020876,"country":"de"},{"format":"inter","cpm":0.011296,"country":"gb"},{"format":"reward","cpm":0.027093,"country":"gb"},{"format":"inter","cpm":0.006439,"country":"fr"},{"format":"reward","cpm":0.018981,"country":"fr"},{"format":"inter","cpm":null,"country":"tw"},{"format":"reward","cpm":null,"country":"tw"},{"format":"inter","cpm":null,"country":"kr"},{"format":"reward","cpm":null,"country":"kr"},{"format":"inter","cpm":0.010416,"country":"ph"},{"format":"reward","cpm":null,"country":"ph"},{"format":"inter","cpm":0.00599,"country":"ru"},{"format":"reward","cpm":0.004472,"country":"ru"},{"format":"inter","cpm":null,"country":"it"},{"format":"reward","cpm":null,"country":"it"},{"format":"inter","cpm":0.010365,"country":"es"},{"format":"reward","cpm":null,"country":"es"},{"format":"inter","cpm":null,"country":"hk"},{"format":"reward","cpm":null,"country":"hk"},{"format":"inter","cpm":0.007427,"country":"mx"},{"format":"reward","cpm":0.01035,"country":"mx"},{"format":"inter","cpm":null,"country":"nl"},{"format":"reward","cpm":null,"country":"nl"},{"format":"inter","cpm":null,"country":"sa"},{"format":"reward","cpm":null,"country":"sa"},{"format":"inter","cpm":null,"country":"be"},{"format":"reward","cpm":null,"country":"be"},{"format":"inter","cpm":null,"country":"se"},{"format":"reward","cpm":null,"country":"se"},{"format":"inter","cpm":null,"country":"sg"},{"format":"reward","cpm":null,"country":"sg"},{"format":"inter","cpm":null,"country":"cl"},{"format":"reward","cpm":null,"country":"cl"},{"format":"inter","cpm":0.01166,"country":"ch"},{"format":"reward","cpm":null,"country":"ch"},{"format":"inter","cpm":null,"country":"fi"},{"format":"reward","cpm":null,"country":"fi"},{"format":"inter","cpm":null,"country":"th"},{"format":"reward","cpm":null,"country":"th"},{"format":"inter","cpm":0.00109,"country":"pl"},{"format":"reward","cpm":null,"country":"pl"},{"format":"inter","cpm":null,"country":"dk"},{"format":"reward","cpm":null,"country":"dk"},{"format":"inter","cpm":null,"country":"ae"},{"format":"reward","cpm":null,"country":"ae"},{"format":"inter","cpm":0.009707,"country":"at"},{"format":"reward","cpm":0.011048,"country":"at"},{"format":"inter","cpm":0.004342,"country":"id"},{"format":"reward","cpm":null,"country":"id"},{"format":"inter","cpm":0.005622,"country":"vn"},{"format":"reward","cpm":0.005026,"country":"vn"},{"format":"inter","cpm":0.001684,"country":"tr"},{"format":"reward","cpm":null,"country":"tr"}]}}'; +} diff --git a/guru_app/lib/ads/utils/ads_exception.dart b/guru_app/lib/ads/utils/ads_exception.dart new file mode 100644 index 0000000..9f072bb --- /dev/null +++ b/guru_app/lib/ads/utils/ads_exception.dart @@ -0,0 +1,15 @@ +import "dart:core"; + +/// Created by Haoyi on 2021/11/29 +/// + +class NoAdsException implements Exception { + final String msg; + + NoAdsException(this.msg); + + @override + String toString() { + return 'NoAdsException{msg: $msg}'; + } +} diff --git a/guru_app/lib/aigc/bi/ai_bi.dart b/guru_app/lib/aigc/bi/ai_bi.dart new file mode 100644 index 0000000..5f7c013 --- /dev/null +++ b/guru_app/lib/aigc/bi/ai_bi.dart @@ -0,0 +1,2 @@ +import "package:guru_utils/aigc/bi/ai_bi.dart"; +export "package:guru_utils/aigc/bi/ai_bi.dart"; \ No newline at end of file diff --git a/guru_app/lib/analytics/data/analytics_model.dart b/guru_app/lib/analytics/data/analytics_model.dart new file mode 100644 index 0000000..64dd11a --- /dev/null +++ b/guru_app/lib/analytics/data/analytics_model.dart @@ -0,0 +1,74 @@ +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:guru_utils/converts/converts.dart'; + +/// Created by Haoyi on 2023/2/9 +/// +part 'analytics_model.g.dart'; + +@JsonSerializable() +class AnalyticsConfig { + @JsonKey(name: "cap", defaultValue: ["firebase", "facebook", "guru"]) + @joinedStringConvert + final List capabilities; + + @JsonKey(name: "init_delay_s", defaultValue: 10) + final int delayedInSeconds; + + @JsonKey(name: "expired_d", defaultValue: 7) + final int expiredInDays; + + @JsonKey(name: "strategy", defaultValue: '') + final String strategy; + + @JsonKey(name: "enabled_strategy", defaultValue: false) + final bool enabledStrategy; + + AppEventCapabilities toAppEventCapabilities() { + int capValue = 0; + if (capabilities.contains("firebase")) { + capValue |= AppEventCapabilities.firebase; + } + if (capabilities.contains("facebook")) { + capValue |= AppEventCapabilities.facebook; + } + if (capabilities.contains("guru")) { + capValue |= AppEventCapabilities.guru; + } + return AppEventCapabilities(capValue); + } + + AnalyticsConfig(this.capabilities, this.delayedInSeconds, this.expiredInDays, this.strategy, + this.enabledStrategy); + + factory AnalyticsConfig.fromJson(Map json) => _$AnalyticsConfigFromJson(json); + + Map toJson() => _$AnalyticsConfigToJson(this); +} + +@JsonSerializable() +class UserIdentification { + @JsonKey(name: 'firebaseAppInstanceId', defaultValue: "") + final String firebaseAppInstanceId; + + @JsonKey(name: 'idfa') + final String? idfa; + + @JsonKey(name: "adid") + final String? adId; + + @JsonKey(name: "gpsAdid") + final String? gpsAdId; + + UserIdentification({this.firebaseAppInstanceId = '', this.idfa, this.adId, this.gpsAdId}); + + factory UserIdentification.fromJson(Map json) => + _$UserIdentificationFromJson(json); + + Map toJson() => _$UserIdentificationToJson(this); + + @override + String toString() { + return 'UserIdentification{firebaseAppInstanceId: $firebaseAppInstanceId, idfa: $idfa, adId: $adId, gpsAdId: $gpsAdId}'; + } +} diff --git a/guru_app/lib/analytics/data/analytics_model.g.dart b/guru_app/lib/analytics/data/analytics_model.g.dart new file mode 100644 index 0000000..47a34ce --- /dev/null +++ b/guru_app/lib/analytics/data/analytics_model.g.dart @@ -0,0 +1,43 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'analytics_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AnalyticsConfig _$AnalyticsConfigFromJson(Map json) => + AnalyticsConfig( + json['cap'] == null + ? ['firebase', 'facebook', 'guru'] + : joinedStringConvert.fromJson(json['cap'] as String), + json['init_delay_s'] as int? ?? 10, + json['expired_d'] as int? ?? 7, + json['strategy'] as String? ?? '', + json['enabled_strategy'] as bool? ?? false, + ); + +Map _$AnalyticsConfigToJson(AnalyticsConfig instance) => + { + 'cap': joinedStringConvert.toJson(instance.capabilities), + 'init_delay_s': instance.delayedInSeconds, + 'expired_d': instance.expiredInDays, + 'strategy': instance.strategy, + 'enabled_strategy': instance.enabledStrategy, + }; + +UserIdentification _$UserIdentificationFromJson(Map json) => + UserIdentification( + firebaseAppInstanceId: json['firebaseAppInstanceId'] as String? ?? '', + idfa: json['idfa'] as String?, + adId: json['adid'] as String?, + gpsAdId: json['gpsAdid'] as String?, + ); + +Map _$UserIdentificationToJson(UserIdentification instance) => + { + 'firebaseAppInstanceId': instance.firebaseAppInstanceId, + 'idfa': instance.idfa, + 'adid': instance.adId, + 'gpsAdid': instance.gpsAdId, + }; diff --git a/guru_app/lib/analytics/guru_analytics.dart b/guru_app/lib/analytics/guru_analytics.dart new file mode 100644 index 0000000..4cb9aaa --- /dev/null +++ b/guru_app/lib/analytics/guru_analytics.dart @@ -0,0 +1,599 @@ +/// Created by Haoyi on 2022/8/24 + +import 'dart:collection'; +import 'dart:core'; +import 'dart:io'; + +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; +import 'package:guru_analytics_flutter/event_logger.dart'; +import 'package:guru_analytics_flutter/event_logger_common.dart'; +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:guru_analytics_flutter/guru/guru_event_logger.dart'; +import 'package:guru_analytics_flutter/guru/guru_statistic.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/ads/ads_manager.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_app/aigc/bi/ai_bi.dart'; +import 'package:guru_app/analytics/data/analytics_model.dart'; +import 'package:guru_app/analytics/strategy/guru_analytics_strategy.dart'; +import 'package:guru_app/firebase/remoteconfig/remote_config_manager.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_app/property/runtime_property.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/device/device_info.dart'; +import 'package:guru_utils/device/device_utils.dart'; +import 'package:guru_utils/analytics/analytics.dart'; +import 'package:guru_utils/network/network_utils.dart'; +import 'package:intl/intl.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:adjust_sdk/adjust_ad_revenue.dart'; +import 'package:adjust_sdk/adjust_config.dart'; +export 'package:adjust_sdk/adjust.dart'; + +part 'modules/ads_analytics.dart'; + +part 'modules/adjust_aware.dart'; + +class GuruAnalytics extends Analytics with AdjustAware { + bool get release => !_mock && _enabledAnalytics && kReleaseMode; + + String appInstanceId = ""; + + static bool _mock = false; + + static bool _enabledAnalytics = true; + + static GuruAnalytics instance = GuruAnalytics._(); + + /// Name of virtual currency type. + static bool initialized = false; + + static final Map facebookEventMapping = {}; + + static String currentScreen = ""; + + static const errorEventCodes = { + 14, // 上报事件失败 + 22, // 网络状态不可用 + 101, // 调用api出错 + 102, // api返回结果错误 + 103, // 设置cacheControl出错 + 104, // 删除过期事件出错 + 105, // 从数据库取事件以及更改事件状态为正在上报出错 + 106, // dns 错误 + }; + + int latestFetchStatisticTs = 0; + + final BehaviorSubject guruEventStatistic = + BehaviorSubject.seeded(GuruStatistic.invalid); + + Stream get observableGuruEventStatistic => guruEventStatistic.stream; + + final BehaviorSubject userIdentificationSubject = + BehaviorSubject.seeded(UserIdentification()); + + UserIdentification get userIdentification => userIdentificationSubject.value; + + AppEventCapabilities get currentAppEventCapabilities => EventLogger.getCapabilities(); + + static void setMock() { + _mock = true; + } + + static void disableAnalytics() { + _enabledAnalytics = false; + } + + static void enableAnalytics() { + _enabledAnalytics = true; + } + + GuruAnalytics._(); + + String? getProperty(String key) { + return Analytics.userProperties[key]; + } + + void init() async { + Log.d( + "AnalyticsUtil init### Platform.localeName :${Platform.localeName} ${Intl.getCurrentLocale()}"); + if (!_mock && !initialized) { + final analyticsConfig = RemoteConfigManager.instance.getAnalyticsConfig(); + EventLogger.setCapabilities(analyticsConfig.toAppEventCapabilities()); + EventLogger.registerTransmitter(EventTransmitter({}, defaultHook: (name, parameters) { + recordEvents(name, parameters); + final fbEvent = facebookEventMapping[name]; + if (fbEvent == null) { + return; + } + Log.d("transmit EVENT [$name] => [$fbEvent]"); + EventLogger.facebookLogEvent(name: fbEvent); + })); + EventLogger.setGuruPriorityGetter((name, parameters) => + GuruApp.instance.conversionEvents.contains(name) + ? EventPriority.EMERGENCE + : EventPriority.DEFAULT); + String xDeviceInfo = ''; + try { + final deviceId = await AppProperty.getInstance().getDeviceId(); + final deviceInfo = await DeviceUtils.buildDeviceInfo(deviceId: deviceId); + xDeviceInfo = deviceInfo.toXDeviceInfo(); + } catch (error, stacktrace) { + Log.e("init deviceInfo error: $error, $stacktrace"); + } + + await GuruAnalyticsStrategy.instance.load(); + EventLogger.initialize( + appId: GuruApp.instance.appSpec.details.saasAppId, + deviceInfo: xDeviceInfo, + delayedInSeconds: analyticsConfig.delayedInSeconds, + eventExpiredInDays: analyticsConfig.expiredInDays, + callback: processAnalyticsCallback, + debug: true, + ); + _initEnvProperties(); + _logLocale(); + _logDeviceType(); + _logFirstOpen(); + Future.delayed(const Duration(seconds: 1), () { + initAdjust(); + initFbEventMapping(); + Log.d("register transmitter"); + }); + initialized = true; + // if (Platform.isAndroid) { + // _logPeerApps(); + // } + } + } + + void processAnalyticsCallback(int code, String? errorInfo) { + if (!errorEventCodes.contains(code)) { + return; + } + final parameters = { + "item_category": "error_event", + "item_name": code.toString(), + "country": AccountDataStore.instance.countryCode, + "network": AdsManager.instance.connectivityStatus.toString(), + }; + + if (errorInfo != null) { + parameters["err"] = errorInfo.length > 32 ? errorInfo.substring(0, 32) : errorInfo; + } + logFirebaseEvent("dev_audit", parameters); + // Guru Analytics Event(GAE) + Log.d("[GAE]($code)=>$errorInfo $parameters", tag: "Analytics"); + } + + void updateUserIdentification( + {String? firebaseAppInstanceId, String? idfa, String? adId, String? gpsAdId}) { + final latestUserIdentification = userIdentificationSubject.value; + bool changed = false; + String? changedFirebaseInstanceId = latestUserIdentification.firebaseAppInstanceId; + String? changedIdfa = latestUserIdentification.idfa; + String? changedAdId = latestUserIdentification.adId; + String? changedGpsAdId = latestUserIdentification.gpsAdId; + + if (firebaseAppInstanceId != null && + latestUserIdentification.firebaseAppInstanceId != firebaseAppInstanceId) { + changedFirebaseInstanceId = firebaseAppInstanceId; + changed = true; + } + if (idfa != null && latestUserIdentification.idfa != idfa) { + changedIdfa = idfa; + changed = true; + } + if (adId != null && latestUserIdentification.adId != adId) { + changedAdId = adId; + changed = true; + } + if (gpsAdId != null && latestUserIdentification.gpsAdId != gpsAdId) { + changedGpsAdId = gpsAdId; + changed = true; + } + if (changed) { + final newUserIdentification = UserIdentification( + firebaseAppInstanceId: changedFirebaseInstanceId ?? '', + idfa: changedIdfa, + adId: changedAdId, + gpsAdId: changedGpsAdId); + userIdentificationSubject.add(newUserIdentification); + Log.d("updateUserIdentification: $newUserIdentification"); + } + } + + void parseFbEventMapping() { + final fbEventMappingString = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.fbEventMapping); + Log.d("parseFbEventMapping first: $fbEventMappingString"); + if (fbEventMappingString == null) { + return; + } + Map result = {}; + final eventEntries = fbEventMappingString.split(";"); + for (String eventEntryString in eventEntries) { + final eventEntry = eventEntryString.split(":"); + if (eventEntry.length == 2) { + result[eventEntry.first] = eventEntry.last; + } + } + facebookEventMapping.clear(); + facebookEventMapping.addAll(result); + Log.d("parseFbEventMapping: $result"); + } + + void initFbEventMapping() { + RemoteConfigManager.instance.observeConfig().listen((config) { + parseFbEventMapping(); + }); + parseFbEventMapping(); + } + + @override + Future getAppInstanceId() async { + if (appInstanceId.isNotEmpty != true) { + appInstanceId = await EventLogger.getAppInstanceId(); + RuntimeProperty.instance.setString(PropertyKeys.appInstanceId, appInstanceId); + } + return appInstanceId; + } + + void _initEnvProperties() async { + final bundle = await AppProperty.getInstance().loadValuesByTag(PropertyTags.analytics); + + final userId = bundle.getString(PropertyKeys.analyticsUserId); + if (userId != null) { + setUserId(userId); + } + + final adjustId = bundle.getString(PropertyKeys.analyticsAdjustId); + if (adjustId != null) { + setAdjustId(adjustId); + } + + final adId = bundle.getString(PropertyKeys.analyticsAdId); + if (adId != null) { + setAdId(adId); + } + refreshEventStatistic(); + + String? firebaseId = await getAppInstanceId(); + if (firebaseId.isEmpty) { + firebaseId = bundle.getString(PropertyKeys.analyticsFirebaseId); + } + if (firebaseId?.isNotEmpty == true) { + setFirebaseId(firebaseId!); + } + + final abProperties = RemoteConfigManager.instance.getABProperties(); + + final PropertyBundle propertyBundle = PropertyBundle(); + if (abProperties.isNotEmpty) { + for (var entry in abProperties.entries) { + setGuruUserProperty(entry.key, entry.value); + propertyBundle.setString(PropertyKeys.buildABTestProperty(entry.key), entry.value); + Log.d("setGuruUserProperty: ${entry.key} = ${entry.value}"); + } + } + AppProperty.getInstance().setProperties(propertyBundle); + } + + void _logFirstOpen() async { + int firstInstallTime = + RuntimeProperty.instance.getInt(PropertyKeys.firstInstallTime, defValue: -1); + if (firstInstallTime == -1) { + firstInstallTime = await AppProperty.getInstance() + .getOrCreateInt(PropertyKeys.firstInstallTime, DateTimeUtils.currentTimeInMillis()); + } + setUserProperty("first_open_time", firstInstallTime.toString()); + } + + void _logLocale() { + if (Platform.localeName.isNotEmpty == true) { + String lanCode = ""; + String countryCode = ""; + final currentLocale = Platform.localeName.split('_'); + if (currentLocale.isNotEmpty) { + setUserProperty("lang_code", currentLocale[0].toLowerCase()); + lanCode = currentLocale[0].toLowerCase(); + } + + if (currentLocale.length > 1) { + setUserProperty("country_code", currentLocale.last.toLowerCase()); + countryCode = currentLocale.last.toLowerCase(); + } + Log.d("## locale: [$currentLocale]"); + + if (lanCode.isNotEmpty && countryCode.isNotEmpty) { + // CountryCodes.init(Locale(lanCode, countryCode)); + } else { + // CountryCodes.init(); + } + } else { + // CountryCodes.init(); + } + } + + void _logDeviceType() async { + setUserProperty("device_type", DeviceUtils.isTablet() ? "tablet" : "phone"); + + final deviceId = await AppProperty.getInstance().getDeviceId(); + setDeviceId(deviceId); + } + + @override + Future setUserProperty(String key, String value) async { + recordEvents("setUserProperty", {key: value}); + recordProperty(key, value); + if (release) { + await EventLogger.setUserProperty(key, value); + } + } + + void setDeviceId(String deviceId) { + Log.d("setDeviceId: $deviceId"); + recordEvents("setDeviceId", {"userId": deviceId}); + recordProperty("deviceId", deviceId); + if (deviceId.isNotEmpty) { + AppProperty.getInstance().setAnalyticsDeviceId(deviceId); + if (release) { + EventLogger.setUserProperty("device_id", deviceId); + EventLogger.setDeviceId(deviceId); + } + } + } + + void setUserId(String userId) { + Log.d("setUserId: $userId"); + recordEvents("setUserId", {"userId": userId}); + recordProperty("userId", userId); + if (userId.isNotEmpty) { + AppProperty.getInstance().setUserId(userId); + if (release) { + EventLogger.setUserId(userId); + FirebaseCrashlytics.instance.setUserIdentifier(userId); + } + } + } + + void setAdjustId(String adjustId) { + Log.d("setAdjustId: $adjustId"); + recordEvents("setAdjustId", {"adjustId": adjustId}); + recordProperty("adjustId", adjustId); + if (adjustId.isNotEmpty) { + AppProperty.getInstance().setAdjustId(adjustId); + updateUserIdentification(adId: adjustId); + if (release) { + EventLogger.setAdjustId(adjustId); + } + } + } + + void setFirebaseId(String firebaseId) { + Log.d("setFirebaseId: $firebaseId"); + recordEvents("setFirebaseId", {"firebaseId": firebaseId}); + recordProperty("firebaseId", firebaseId); + if (firebaseId.isNotEmpty) { + AppProperty.getInstance().setFirebaseId(firebaseId); + updateUserIdentification(firebaseAppInstanceId: firebaseId); + if (release) { + EventLogger.setFirebaseId(firebaseId); + } + } + } + + void setAdId(String adId) { + Log.d("setAdId: $adId"); + recordEvents("setAdId", {"adId": adId}); + recordProperty("adId", adId); + AppProperty.getInstance().setAdId(adId); + updateUserIdentification(gpsAdId: adId); + if (release) { + EventLogger.setAdId(adId); + } + } + + void setIdfa(String idfa) { + Log.d("setIdfa: $idfa"); + recordEvents("setIdfa", {"idfa": idfa}); + recordProperty("idfa", idfa); + AppProperty.getInstance().setIdfa(idfa); + updateUserIdentification(idfa: idfa); + if (release) { + // 自打点中。idfa变是adId + EventLogger.setAdId(idfa); + } + } + + void logScreen(String screenName) { + recordEvents("logScreen", {"name": screenName}); + recordProperty("screen", screenName); + if (release) { + FirebaseCrashlytics.instance.log(screenName); + EventLogger.logScreen(screenName); + } + } + + @override + void setScreen(String screenName) { + if (currentScreen != screenName) { + currentScreen = screenName; + logScreen(screenName); + } + } + + @override + void logFirebase(String msg) async { + if (release) { + try { + FirebaseCrashlytics.instance.log(msg); + if (EventLogger.dumpLog) { + Log.d("[Firebase]: $msg"); + } + } catch (error, stacktrace) {} + } else { + Log.d("[Firebase]: $msg"); + } + } + + AppEventOptions? getOptions(String eventName) { + return GuruAnalyticsStrategy.instance.getStrategyRule(eventName)?.getAppEventOptions(); + } + + @override + void logEvent(String eventName, Map parameters, {AppEventOptions? options}) { + refreshEventStatistic(); + // Firebase Facebook log event + if (release) { + EventLogger.logEvent(eventName, parameters, options: options ?? getOptions(eventName)); + _logAdjustEvent(eventName, parameters); + } else { + Log.d("logEvent: $eventName $parameters"); + EventLogger.transmit(eventName, parameters); + } + } + + @override + void logEventEx(String eventName, + {String? itemCategory, + String? itemName, + double? value, + Map parameters = const {}, + AppEventOptions? options}) async { + Map map = Map.from(parameters); + if (itemCategory != null) { + map["item_category"] = itemCategory; + } + + if (itemName != null) { + map["item_name"] = itemName; + } + + if (value != null) { + map["value"] = value; + } + + logEvent(eventName, map, options: options); + } + + Future refreshEventStatistic({bool force = false}) async { + if (!GuruApp.instance.appSpec.deployment.enableAnalyticsStatistic) { + return; + } + final now = DateTimeUtils.currentTimeInMillis(); + if (force || (now - latestFetchStatisticTs > DateTimeUtils.minuteInMillis * 2)) { + EventLogger.getStatistic().then((statistic) { + Log.d("Event Statistic:$statistic"); + if (statistic != GuruStatistic.invalid && guruEventStatistic.addIfChanged(statistic)) { + setUserProperty("lgd", statistic.logged.toString()); + setUserProperty("uld", statistic.uploaded.toString()); + } + }); + latestFetchStatisticTs = now; + } + } + + Future zipGuruLogs() { + return EventLogger.zipGuruLogs(); + } + + Map filterOutNulls(Map parameters) { + final Map filtered = {}; + parameters.forEach((String key, dynamic value) { + if (value != null) { + filtered[key] = value; + } + }); + return filtered; + } + + @override + void logException(dynamic exception, {StackTrace? stacktrace}) async { + if (release) { + Log.d("exception! $exception"); + FirebaseCrashlytics.instance.log(exception.toString()); + FirebaseCrashlytics.instance + .recordError(exception, stacktrace, printDetails: EventLogger.dumpLog); + } else { + Log.w("Occur Error! $exception $stacktrace", stackTrace: stacktrace); + } + } + + void logPurchase(double amount, + {String currency = "", + String contentId = "", + String adPlatform = "", + Map parameters = const {}}) { + EventLogger.logFbPurchase(amount, + currency: currency, + contentId: contentId, + adPlatform: adPlatform, + additionParameters: parameters); + } + + void logEventShare({String? itemCategory, String? itemName}) { + logEvent("share", { + "item_category": itemCategory, + "item_name": itemName, + "content_type": itemCategory, + "item_id": itemName + }); + } + + void logSpendCredits(String contentId, String contentType, int price, + {required String virtualCurrencyName, required int balance, String scene = ''}) { + if (release) { + EventLogger.logSpendCredits(contentId, contentType, price, + virtualCurrencyName: virtualCurrencyName, balance: balance, scene: scene); + } else { + final parameters = { + "item_name": contentId, + "item_category": contentType, + "virtual_currency_name": virtualCurrencyName, + "value": price, + "balance": balance, + "scene": scene + }; + Log.d("logEvent: spend_virtual_currency $parameters"); + EventLogger.transmit("spend_virtual_currency", parameters); + } + AiBi.instance.spendVirtualCurrency(balance, price.toDouble(), contentType); + } + + Future logEarnVirtualCurrency({ + required String virtualCurrencyName, + required String method, + required int balance, + required int value, + }) async { + logEvent("earn_virtual_currency", { + "virtual_currency_name": virtualCurrencyName, + "item_category": method, + "value": value, + "balance": balance + }); + AiBi.instance.earnVirtualCurrency(balance, value.toDouble(), method); + } + + Future setGuruUserProperty(String key, String value) async { + return await EventLogger.setGuruUserProperty(key, value); + } + + Future logGuruEvent(String eventName, Map parameters) async { + EventLogger.guruLogEvent(name: eventName, parameters: parameters); + } + + Future logFirebaseEvent(String eventName, Map parameters) async { + if (release) { + EventLogger.firebaseLogEvent(name: eventName, parameters: parameters); + } else { + Log.d("logEvent: $eventName $parameters"); + } + EventLogger.transmit(eventName, parameters); + } +} diff --git a/guru_app/lib/analytics/modules/adjust_aware.dart b/guru_app/lib/analytics/modules/adjust_aware.dart new file mode 100644 index 0000000..c42adea --- /dev/null +++ b/guru_app/lib/analytics/modules/adjust_aware.dart @@ -0,0 +1,195 @@ +part of '../guru_analytics.dart'; + +/// Created by Haoyi on 2022/3/12 +typedef AdjustEventConverter = AdjustEvent Function(Map); + +class AdjustProfile { + final String appToken; + final Map eventNameMapping; + + final bool isEnabled; + + AdjustProfile({required this.appToken, required this.eventNameMapping}) + : isEnabled = appToken.isNotEmpty; + + static AdjustEvent createAdjustEvent(String eventToken, Map params) { + final adjustParams = Map.of(params); + final revenue = adjustParams.remove("revenue"); + final currency = adjustParams.remove("currency"); + final event = AdjustEvent(eventToken); + if (revenue is num && currency is String) { + event.setRevenue(revenue, currency); + } + for (var entry in adjustParams.entries) { + event.addCallbackParameter(entry.key, entry.value.toString()); + } + return event; + } +} + +mixin AdjustAware on Analytics { + static final List pendingAdjustEvents = []; + + // + static bool initializedAdjust = false; + + bool get enabledAdjust => GuruApp.instance.adjustProfile.isEnabled; + + static AdjustConfig _defaultAdjustConfigComposition(AdjustConfig adjustConfig) { + return adjustConfig; + } + + static AdjustConfig Function(AdjustConfig) adjustConfigComposition = + _defaultAdjustConfigComposition; + + static AdjustConfig buildAdjustConfig() { + final AdjustConfig config = AdjustConfig(GuruApp.instance.adjustProfile.appToken, + kReleaseMode ? AdjustEnvironment.production : AdjustEnvironment.sandbox); + config.fbAppId = GuruApp.instance.details.facebookAppId; + return adjustConfigComposition(config); + } + + Future initAdjust() async { + if (enabledAdjust) { + await _setupAdjustSessionCall(); + final adjustConfig = buildAdjustConfig(); + Adjust.start(adjustConfig); + initializedAdjust = true; + _trackAllPendingAdjustEvent(); + + final adId = await Adjust.getAdid(); + if (adId != null) { + GuruAnalytics.instance.setAdjustId(adId); + Log.d("initAdjust adId:$adId"); + } else { + // https://github.com/adjust/react_native_sdk/issues/90 + Log.d("adjustId is null! waiting 3s..and retry"); + Future.delayed(const Duration(seconds: 3), () async { + final adId = await Adjust.getAdid(); + if (adId != null) { + GuruAnalytics.instance.setAdjustId(adId); + Log.d("initAdjust adId:$adId"); + } else { + Log.d("initAdjust adId is null"); + } + }); + } + + final googleAdId = await Adjust.getGoogleAdId(); + if (googleAdId != null) { + GuruAnalytics.instance.setAdId(googleAdId); + Log.d("initAdjust googleAdId:$googleAdId"); + } + + final idfa = Platform.isIOS ? await Adjust.getIdfa() : null; + if (idfa != null) { + GuruAnalytics.instance.setIdfa(idfa); + Log.d("initAdjust idfa:$idfa"); + } + } + } + + // 接入Adjust后trackAdRevenueNew要放开 + void loadAdjustAdRevenue(ImpressionData impressionData) { + if (enabledAdjust) { + AdjustAdRevenue adRevenue = AdjustAdRevenue(AdjustConfig.AdRevenueSourceAppLovinMAX); + adRevenue.setRevenue(impressionData.publisherRevenue, "USD"); + adRevenue.adRevenueNetwork = impressionData.networkName; + adRevenue.adRevenueUnit = impressionData.unitId; + adRevenue.adRevenuePlacement = impressionData.networkPlacementId; + Adjust.trackAdRevenueNew(adRevenue); + recordEvents("[Adjust]trackAdRevenue", adRevenue.toMap); + } + } + +// + Future _setupAdjustSessionCall() async { + try { + final deviceId = await AppProperty.getInstance().getDeviceId(); + Adjust.addSessionCallbackParameter("device_id", deviceId); + } catch (error, stacktrace) { + Log.e("setupAdjustSessionCall error $error, $stacktrace"); + } + + final appInstanceId = await getAppInstanceId(); + Log.d("setupAdjustSessionCall $appInstanceId"); + Adjust.addSessionCallbackParameter("user_pseudo_id", appInstanceId); + } + + void logAdjust(String eventName, + {String? itemCategory, + String? itemName, + double? value, + Map parameters = const {}}) { + if (enabledAdjust) { + Map map = Map.from(parameters); + if (itemCategory != null) { + map["item_category"] = itemCategory; + } + if (itemName != null) { + map["item_name"] = itemName; + } + if (value != null) { + map["value"] = value; + } + _logAdjustEvent(eventName, map); + } + } + + void _trackAdjustEvent(AdjustEvent adjustEvent) { + if (!enabledAdjust) { + return; + } + if (!initializedAdjust) { + pendingAdjustEvents.add(adjustEvent); + Log.d("adjust not initialized!"); + return; + } + if (EventLogger.dumpLog || kDebugMode) { + Log.d("[adjust] ${adjustEvent.toMap}"); + } + if (pendingAdjustEvents.isNotEmpty) { + final events = List.of(pendingAdjustEvents); + pendingAdjustEvents.clear(); + for (var event in events) { + Adjust.trackEvent(event); + if (EventLogger.dumpLog || kDebugMode) { + Log.d("[adjust] ${event.toMap}"); + } + } + } + Adjust.trackEvent(adjustEvent); + } + + void _trackAllPendingAdjustEvent() { + if (!enabledAdjust) { + return; + } + final events = List.of(pendingAdjustEvents); + pendingAdjustEvents.clear(); + for (var event in events) { + Adjust.trackEvent(event); + if (EventLogger.dumpLog || kDebugMode) { + Log.d("[adjust] ${event.toMap}"); + } + } + } + + AdjustEventConverter? getAdjustEventConverter(String eventName) { + return GuruAnalyticsStrategy.instance.getAdjustEventConverter(eventName) ?? + GuruApp.instance.adjustProfile.eventNameMapping[eventName]; + } + +// + void _logAdjustEvent(String eventName, Map parameters) { + if (!enabledAdjust) { + return; + } + final AdjustEventConverter? adjustEventConverter = getAdjustEventConverter(eventName); + if (adjustEventConverter != null) { + AdjustEvent adjustEvent = adjustEventConverter(parameters); + Log.d("adjustEvent:${adjustEvent.toMap}"); + _trackAdjustEvent(adjustEvent); + } + } +} diff --git a/guru_app/lib/analytics/modules/ads_analytics.dart b/guru_app/lib/analytics/modules/ads_analytics.dart new file mode 100644 index 0000000..81ae8c0 --- /dev/null +++ b/guru_app/lib/analytics/modules/ads_analytics.dart @@ -0,0 +1,61 @@ +// /// Created by Haoyi on 2022/2/28 +// +// part of "../analytics.dart"; +// +// + +part of "../guru_analytics.dart"; + +extension AdsAnalytics on GuruAnalytics { + void logAdRevenue(double adRevenue, String adPlatform, String currency) { + // logEventEx(name, itemCategory: scene, itemName: adName); + if (release) { + EventLogger.logAdRevenue(adRevenue, adPlatform, currency); + } else { + Log.d("[firebase] logAdRevenue ${{ + "adRevenue": adRevenue, + "adPlatform": adPlatform, + "currency": currency + }}"); + } + } + + void logAdLtv(String phase, double ltv) { + if (release) { + EventLogger.logAdLtv(phase, ltv); + } else { + Log.d("[firebase] logAdLtv ${{"phase": phase, "ltv": ltv}}"); + } + } + + void logAdImpression(String name, String adType, + {String scene = "", String adName = "", Map parameters = const {}}) { + logEventEx(name, itemCategory: scene, itemName: adName, parameters: parameters); + if (release) { + EventLogger.logFbAdImpression(adType); + FirebaseCrashlytics.instance + .log("adImp: name($name) scene($scene) adName($adName) adType($adType)"); + } else { + Log.d("[facebook] logEvent logFbAdImpression: $adType"); + } + } + + void logAdImp(ImpressionData data) { + EventLogger.logAdImpression( + adPlatform: data.platform, + adSource: data.networkName, + adFormat: data.unitFormat, + adUnitName: data.unitName, + value: data.publisherRevenue, + currency: data.currency); + } + + void logAdClick(String name, String adType, {String scene = "", String adName = ""}) { + logEventEx(name, itemCategory: scene, itemName: adName); + if (release) { + EventLogger.logFbAdClick(adType); + } else { + Log.d("[facebook] logEvent logAdClick: $adType"); + } + } +} diff --git a/guru_app/lib/analytics/strategy/guru_analytics_strategy.dart b/guru_app/lib/analytics/strategy/guru_analytics_strategy.dart new file mode 100644 index 0000000..8b70826 --- /dev/null +++ b/guru_app/lib/analytics/strategy/guru_analytics_strategy.dart @@ -0,0 +1,590 @@ +import 'dart:async'; +import 'dart:collection'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/firebase/remoteconfig/remote_config_manager.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/settings/guru_settings.dart'; +import 'package:guru_app/utils/guru_file_utils_extension.dart'; +import 'package:guru_utils/core/ext.dart'; +import 'package:guru_utils/file/file_utils.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/property/runtime_property.dart'; +import 'package:guru_utils/quiver/cache.dart'; +import 'package:guru_utils/quiver/collection.dart'; +import 'package:guru_utils/settings/settings.dart'; +import 'package:guru_utils/tuple/tuple.dart'; + +abstract class EventMatcher { + bool match(String eventName); +} + +class UniversalMatcher extends EventMatcher { + @override + bool match(String eventName) => true; + + @override + String toString() { + return 'UniversalMatcher'; + } +} + +class RegexMatcher extends EventMatcher { + final RegExp re; + + RegexMatcher(String pattern) : re = RegExp(pattern); + + @override + bool match(String eventName) => re.hasMatch(eventName); + + @override + String toString() { + return 'RegexMatcher:${re.pattern}'; + } +} + +class WildcardMatcher extends RegexMatcher { + final String wildcard; + + WildcardMatcher(this.wildcard) : super("^${wildcard.replaceAll("*", ".*")}\$"); + + @override + bool match(String eventName) => super.match(eventName); + + @override + String toString() { + return 'WildcardMatcher:$wildcard => ${re.pattern}'; + } +} + +abstract class StrategyValidator { + bool get alwaysVerify => false; + + const StrategyValidator(); + + bool validate(); +} + +class UnlimitedValidator extends StrategyValidator { + const UnlimitedValidator(); + + @override + bool validate() => true; + + @override + String toString() { + return 'UnlimitedValidator'; + } +} + +class DisabledValidator extends StrategyValidator { + @override + bool validate() => false; + + @override + String toString() { + return 'DisabledValidator'; + } +} + +class PlatformValidator extends StrategyValidator { + final String platform; + + PlatformValidator(this.platform); + + @override + bool validate() => Platform.isAndroid ? platform == "android" : platform == "ios"; + + @override + String toString() { + return 'PlatformValidator($platform)'; + } +} + +class CountryCodeValidator extends StrategyValidator { + final Set included; + final Set excluded; + + CountryCodeValidator(this.included, this.excluded); + + @override + bool validate() { + final countryCode = AccountDataStore.instance.countryCode; + + // 如果excluded不为空,证明存在排除选项,该validate将只判断所有excluded中的逻辑, + // 将不会在判断included中的逻辑 + if (excluded.isNotEmpty) { + return !excluded.contains(countryCode); + } + + if (included.contains(countryCode)) { + return true; + } + return false; + } + + @override + String toString() { + return 'CountryCodeValidator{included: $included, excluded: $excluded}'; + } +} + +class UserPropertyValidator extends StrategyValidator { + @override + bool get alwaysVerify => true; + + final List> validProperties; + + UserPropertyValidator(this.validProperties); + + @override + bool validate() { + for (var tuple in validProperties) { + if (GuruAnalytics.instance.getProperty(tuple.item1) != tuple.item2) { + return false; + } + } + return true; + } + + @override + String toString() { + return 'UserPropertyValidator{validProperties: $validProperties}'; + } +} + +class RandomValidator extends StrategyValidator { + final int percent; + + RandomValidator(int percent) : percent = percent.clamp(10, 90); + + @override + bool validate() { + final firstInstallTime = + RuntimeProperty.instance.getInt(UtilsSettingsKeys.firstInstallTime, defValue: -1); + return (firstInstallTime % 9) >= (percent ~/ 10 - 1); + } + + @override + String toString() { + return 'RandomValidator{percent: $percent}'; + } +} + +class VersionValidator extends StrategyValidator { + final String opt; + final String buildId; + + VersionValidator(this.opt, this.buildId); + + @override + bool validate() { + final buildNumber = GuruSettings.instance.buildNumber.get(); + switch (opt) { + case "ve": + return buildNumber == buildId; + case "vg": + return buildNumber.compareTo(buildId) > 0; + case "vge": + return buildNumber.compareTo(buildId) >= 0; + case "vl": + return buildNumber.compareTo(buildId) < 0; + case "vle": + return buildNumber.compareTo(buildId) <= 0; + default: + return false; + } + } + + @override + String toString() { + return 'VersionValidator{opt: $opt, buildId: $buildId}'; + } +} + +class StrategyRuleTypeException implements Exception { + final String message; + + StrategyRuleTypeException([this.message = "Type mismatch: Expected a StrategyRuleItem."]); + + @override + String toString() => "StrategyRuleTypeException: $message"; +} + +class StrategyRule { + final EventMatcher? matcher; + + final StrategyValidator validator; + + final AppEventCapabilities appEventCapabilities; + + final String? adjustToken; + + AppEventOptions? _options; + + StrategyRule(this.validator, this.appEventCapabilities, {this.matcher, this.adjustToken}); + + AppEventOptions? getAppEventOptions() { + if ((_options != null && !validator.alwaysVerify) || validator.validate()) { + return _options ??= AppEventOptions(capabilities: appEventCapabilities); + } + return null; + } + + @override + String toString() { + return 'StrategyRule{matcher: $matcher, validator: $validator, appEventCapabilities: $appEventCapabilities, adjustToken: $adjustToken}'; + } +} + +class StrategyRuleParser { + static final invalidWildcardReg = RegExp(r'[^a-zA-Z=0-9_*]'); + static final adjustTokenReg = RegExp(r'^[a-z0-9]{6}$'); + static final randomStrategyReg = RegExp(r'^r([1-9]0)$'); + static final userPropertyStrategyReg = RegExp(r'^up:(.+)=(.+)$'); + static final versionStrategyReg = RegExp(r'^(ve|vg|vl|vge|vle)(\d{8})$'); + static final countryStrategyReg = RegExp(r'^cc:(.+)$'); + static final countryCodeValidReg = RegExp(r'^[a-z]{2}|\![a-z]{2}$'); + + final List fields; + + StrategyRuleParser(this.fields); + + EventMatcher? createEventMatcher(String event) { + if (event == "_all_") { + return UniversalMatcher(); + } else if (!invalidWildcardReg.hasMatch(event)) { + if (event.contains("*")) { + return WildcardMatcher(event); + } else { + // 返回空的话,表示精确匹配,无需提供matcher + return null; + } + } else { + return RegexMatcher(event); + } + } + + StrategyValidator? createStrategyValidator(String strategy) { + if (strategy == "unlimited") { + return const UnlimitedValidator(); + } else if (strategy == "disabled") { + return DisabledValidator(); + } else if (strategy == "android" || strategy == "ios") { + return PlatformValidator(strategy); + } else { + final randomMatch = randomStrategyReg.firstMatch(strategy); + final randomPercent = randomMatch?.group(1); + if (!DartExt.isBlank(randomPercent)) { + return RandomValidator(int.parse(randomPercent!)); + } + + final userPropertyMatch = userPropertyStrategyReg.firstMatch(strategy); + final userPropertyKey = userPropertyMatch?.group(1); + final userPropertyValue = userPropertyMatch?.group(2); + if (!DartExt.isBlank(userPropertyKey) && !DartExt.isBlank(userPropertyValue)) { + return UserPropertyValidator([Tuple2(userPropertyKey!, userPropertyValue!)]); + } + + final versionMatch = versionStrategyReg.firstMatch(strategy); + final versionOpt = versionMatch?.group(1); + final versionBuildId = versionMatch?.group(2); + if (!DartExt.isBlank(versionOpt) && !DartExt.isBlank(versionBuildId)) { + return VersionValidator(versionOpt!, versionBuildId!); + } + + final countryCodeMatch = countryStrategyReg.firstMatch(strategy); + final countryCodeExpression = countryCodeMatch?.group(1); + if (!DartExt.isBlank(countryCodeExpression)) { + final included = {}; + final excluded = {}; + final countryCodes = countryCodeExpression! + .split("|") + .where((cc) => countryCodeValidReg.hasMatch(cc)) + .toSet(); + for (var cc in countryCodes) { + if (cc.startsWith("!")) { + excluded.add(cc.substring(1)); + } else { + included.add(cc); + } + } + + return CountryCodeValidator(included, excluded); + } + } + return null; + } + + StrategyRuleItem? fromData(List data) { + if (data.length != fields.length) { + return null; + } + String? event; + EventMatcher? eventMatcher; + StrategyValidator? validator; + int appEventCapabilitiesFlag = 0; + String? adjustToken; + for (int i = 0; i < fields.length; ++i) { + final field = fields[i]; + final value = data[i]; + + if (field == "event") { + event = value; + if (event.isEmpty) { + return null; + } + try { + eventMatcher = createEventMatcher(value); + Log.d("eventMatcher:$eventMatcher"); + } catch (error, stacktrace) { + Log.w("createEventMatcher error! $error", stackTrace: stacktrace); + return null; + } + } else if (field == "guru") { + if (value == '1') { + appEventCapabilitiesFlag |= AppEventCapabilities.guru; + } + } else if (field == "firebase") { + if (value == '1') { + appEventCapabilitiesFlag |= AppEventCapabilities.firebase; + } + } else if (field == "facebook") { + if (value == '1') { + appEventCapabilitiesFlag |= AppEventCapabilities.facebook; + } + } else if (field == "adjust") { + if (value == '1') {} + } else if (field == "strategy") { + validator = createStrategyValidator(value); + } else if ((Platform.isAndroid && field == "ata") || (Platform.isIOS && field == "ati")) { + if (value.isNotEmpty && adjustTokenReg.hasMatch(value)) { + adjustToken = value; + } + } + } + if (event != null && validator != null) { + return StrategyRuleItem( + event, + StrategyRule(validator, AppEventCapabilities(appEventCapabilitiesFlag), + matcher: eventMatcher, adjustToken: adjustToken)); + } + return null; + } +} + +class StrategyRuleItem extends Comparable { + final String eventName; + final StrategyRule rule; + + StrategyRuleItem(this.eventName, this.rule); + + @override + int compareTo(other) { + if (other is StrategyRuleItem) { + return eventName.compareTo(other.eventName); + } + throw StrategyRuleTypeException(); + } +} + +class GuruAnalyticsStrategy { + static const String tag = "GuruAnalyticsStrategy"; + final List priorityRules = []; + final SplayTreeMap explicitRules = SplayTreeMap(); + final Map iosAdjustEventConverters = {}; + final Map androidAdjustEventConverts = {}; + + bool loaded = false; + + final LinkedLruHashMap eventRules = LinkedLruHashMap(maximumSize: 128); + + GuruAnalyticsStrategy._(); + + static final GuruAnalyticsStrategy instance = GuruAnalyticsStrategy._(); + + void reset() { + priorityRules.clear(); + explicitRules.clear(); + } + + static const guruAnalyticsStrategyExtension = ".gas"; // Guru Analytics Strategy + + Future checkAndCreateLocalStrategyFile() async { + final currentLocalStrategy = + "${GuruSettings.instance.buildNumber.get()}$guruAnalyticsStrategyExtension"; + final file = await FileUtils.instance.getGuruConfigFile("analytics", currentLocalStrategy); + if (!file.existsSync()) { + try { + final data = await rootBundle.loadString("assets/guru/analytics_strategy.csv"); + file.writeAsStringSync(data); + Log.i("load local strategy success! [$currentLocalStrategy]", tag: tag); + return file; + } catch (error, stacktrace) { + Log.w("not config local strategy!", tag: tag); + } + } + return null; + } + + Future load() async { + try { + final analyticsConfig = RemoteConfigManager.instance.getAnalyticsConfig(); + + if (!GuruApp.instance.appSpec.deployment.enabledGuruAnalyticsStrategy || + !analyticsConfig.enabledStrategy) { + Log.w("analytics strategy disabled!", tag: tag); + return; + } + + final String remoteAnalyticsStrategy = analyticsConfig.strategy; + final latestAnalyticsStrategy = await AppProperty.getInstance().getLatestAnalyticsStrategy(); + if (remoteAnalyticsStrategy != latestAnalyticsStrategy) { + loaded = false; + } + if (loaded) { + Log.w("already loaded! ignore!", tag: tag); + return; + } + File? file; + // 如果remoteAnalyticsStrategy非空表示云控配置了strategy + if (!DartExt.isBlank(remoteAnalyticsStrategy)) { + file = await FileUtils.instance.getGuruConfigFile("analytics", remoteAnalyticsStrategy); + if (!file.existsSync()) { + try { + await FileUtils.instance.downloadFile( + "${GuruApp.instance.details.storagePrefix}/guru%2Fanalytics%2F$remoteAnalyticsStrategy?alt=media", + file); + Log.i("download analytics strategy[$remoteAnalyticsStrategy] success", tag: tag); + } catch (error, stacktrace) { + Log.w("downloadFile error! $error try to fallback", tag: tag); + // 这里没有使用上一次的strategy做回滚的原因, + // 主要是考虑到上一次的云端strategy可能没有本地的strategy可靠, + // SDK假设本地的strategy比Firebase Storage中配置的strategy更可靠 + // 因此这里在出现下载异常的情况下,会回滚到本地strategy上 + // 如果不想使用这个机制,可以在自己的项目中不配置任何strategy + } + } + if (remoteAnalyticsStrategy != latestAnalyticsStrategy) { + AppProperty.getInstance().setLatestAnalyticsStrategy(remoteAnalyticsStrategy); + final latestStrategyFile = + await FileUtils.instance.getGuruConfigFile("analytics", latestAnalyticsStrategy); + if (latestStrategyFile.existsSync()) { + FileUtils.instance.deleteFile(latestStrategyFile); + } + } + } + + // 如果当前文件为空或是不存在,证明有可能相应的strategy下载失败,或是没有设置 + // 因此这种情况下尝试使用本地的strategy进行加载 + if (file?.existsSync() != true) { + file = await checkAndCreateLocalStrategyFile(); + if (file?.existsSync() != true) { + return; + } + } + + final Stream strategyTextStream = file!.openRead().transform(utf8.decoder); + + StrategyRule? newDefaultRule; + final List newPriorityRules = []; + final Map newExplicitRules = {}; + StrategyRuleParser? parser; + int lineNum = 0; + await for (var line in strategyTextStream.transform(const LineSplitter())) { + final list = line.split(","); + Log.d("[${lineNum++}] $list", tag: tag); + if (parser == null) { + parser = StrategyRuleParser(list); + } else { + final ruleItem = parser.fromData(list); + if (ruleItem == null) { + continue; + } + if (ruleItem.eventName == "_all_") { + newDefaultRule = ruleItem.rule; + } else if (ruleItem.rule.matcher != null) { + newPriorityRules.add(ruleItem.rule); + } else { + newExplicitRules[ruleItem.eventName] = ruleItem.rule; + } + + if (ruleItem.rule.adjustToken != null) { + if (Platform.isAndroid) { + androidAdjustEventConverts[ruleItem.eventName] = + (_) => AdjustEvent(ruleItem.rule.adjustToken!); + } else if (Platform.isIOS) { + iosAdjustEventConverters[ruleItem.eventName] = + (_) => AdjustEvent(ruleItem.rule.adjustToken!); + } + } + } + } + + reset(); + priorityRules.addAll(newPriorityRules.reversed); + if (newDefaultRule != null) { + priorityRules.add(newDefaultRule); + } + explicitRules.addAll(newExplicitRules); + + loaded = true; + Log.d( + "analytics strategy loaded! ${eventRules.length} ${explicitRules.length} ${priorityRules.length}", + tag: tag); + } catch (error, stacktrace) {} + } + + StrategyRule? getStrategyRule(String eventName) { + Log.d( + "[$loaded]getStrategyRule:$eventName ${eventRules.length} ${explicitRules.length} ${priorityRules.length}"); + if (!loaded) { + return null; + } + + final rule = eventRules[eventName]; + if (rule != null) { + return rule; + } + + final explicitRule = explicitRules[eventName]; + if (explicitRule != null) { + return explicitRule; + } + + for (var rule in priorityRules) { + Log.d("matcher: ${rule.matcher} eventName: $eventName ${rule.matcher?.match(eventName)}", + tag: tag); + if (rule.matcher?.match(eventName) == true) { + return rule; + } + } + // 如果没有启用strategy,默认按之前逻辑处理 + return null; + } + + AdjustEventConverter? getAdjustEventConverter(String eventName) { + if (Platform.isAndroid) { + return androidAdjustEventConverts[eventName]; + } else if (Platform.isIOS) { + return iosAdjustEventConverters[eventName]; + } + return null; + } + + void testRule(String eventName) { + final rule = getStrategyRule(eventName); + if (rule?.matcher?.match(eventName) != false) { + Log.d("testMatch: $eventName => $rule success!", tag: tag); + } else { + Log.d("testMatch: $eventName => $rule error!", tag: tag); + } + } +} diff --git a/guru_app/lib/api/custom_transformer.dart b/guru_app/lib/api/custom_transformer.dart new file mode 100644 index 0000000..04fe4e1 --- /dev/null +++ b/guru_app/lib/api/custom_transformer.dart @@ -0,0 +1,46 @@ +import 'dart:convert'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:http_parser/http_parser.dart'; + +/// Created by Haoyi on 2021-06-3. +/// +class CustomTransformer extends DefaultTransformer { + CustomTransformer() : super(jsonDecodeCallback: _parseJson); + + @override + Future transformRequest(RequestOptions options) async { + var data = options.data ?? ''; + if (data is! String) { + if (_isJsonMime(options.contentType)) { + return await _encodeToJson(options.data); + } else if (data is Map) { + return Transformer.urlEncodeMap(data); + } + } + return data.toString(); + } + + bool _isJsonMime(String? contentType) { + if (contentType == null) return false; + return MediaType.parse(contentType).mimeType.toLowerCase() == Headers.jsonMimeType.mimeType; + } + + Future _encodeToJson(dynamic data) async { + return await compute(jsonEncode, data); + } +} + +// Must be top-level function +_parseAndDecode(String response) { + return jsonDecode(response); +} + +_parseJson(String text) { + return compute(_parseAndDecode, text); +} + +platformLogPrint(Object object) { + Log.v("[NETWORK] " + object.toString()); +} diff --git a/guru_app/lib/api/data/orders/orders_model.dart b/guru_app/lib/api/data/orders/orders_model.dart new file mode 100644 index 0000000..5ea9603 --- /dev/null +++ b/guru_app/lib/api/data/orders/orders_model.dart @@ -0,0 +1,138 @@ +import 'dart:io'; + +import 'package:guru_app/analytics/data/analytics_model.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'orders_model.g.dart'; + +/// Created by Haoyi on 2022/7/27 + +@JsonSerializable() +class OrderUserInfo { + @JsonKey(name: 'level', defaultValue: "0") + final String level; + + OrderUserInfo(this.level); + + factory OrderUserInfo.fromJson(Map json) => + _$OrderUserInfoFromJson(json); + + Map toJson() => _$OrderUserInfoToJson(this); +} + +class OrderType { + static const inapp = 0; + static const subs = 1; +} + +@JsonSerializable() +class OrdersReport { + // android + @JsonKey(name: 'orderType', defaultValue: 0) + int? orderType; + @JsonKey(name: 'packageName') + String? packageName; + @JsonKey(name: 'productId') + String? productId; + @JsonKey(name: 'subscriptionId') + String? subscriptionId; + @JsonKey(name: 'token') + String? token; + @JsonKey(name: 'offerId') + String? offerId; + + @JsonKey(name: 'basePlanId') + String? basePlanId; + + // ios + @JsonKey(name: 'bundleId') + String? bundleId; + @JsonKey(name: 'receipt') + String? receipt; + @JsonKey(name: 'sku') + String? sku; + @JsonKey(name: 'country') + String? countryCode; + + // general + @JsonKey(name: 'price') + String? price; + @JsonKey(name: 'currency') + String? currency; + + @JsonKey(name: 'userInfo') + OrderUserInfo? orderUserInfo; + + @JsonKey(name: "eventConfig") + UserIdentification? userIdentification; + + OrdersReport( + {this.orderType, + this.token, + this.packageName, + this.productId, + this.subscriptionId, + this.bundleId, + this.receipt, + this.price, + this.currency, + this.sku, + this.countryCode, + this.orderUserInfo, + this.userIdentification, + this.offerId, + this.basePlanId}); + + @override + String toString() { + final StringBuffer sb = StringBuffer(); + sb.writeln("[OrdersReport]"); + sb.writeln(" productId: $productId"); + sb.writeln(" price: $price"); + sb.writeln(" currency: $currency"); + sb.writeln(" userIdentification: $userIdentification"); + if (Platform.isAndroid) { + sb.writeln(" orderType: $orderType"); + sb.writeln(" packageName: $packageName"); + sb.writeln(" subscriptionId: $subscriptionId"); + sb.writeln(" token: $token"); + sb.writeln(" offerId: $offerId"); + sb.writeln(" basePlanId: $basePlanId"); + } else if (Platform.isIOS) { + sb.writeln(" bundleId: $bundleId"); + sb.writeln(" receipt: $receipt"); + sb.writeln(" sku: $sku"); + sb.writeln(" countryCode: $countryCode"); + } + return sb + .toString(); //'OrdersReport{orderType: $orderType, packageName: $packageName, productId: $productId, subscriptionId: $subscriptionId, token: $token, bundleId: $bundleId, receipt: $receipt, price: $price, currency: $currency, introductoryPrice: $introductoryPrice}'; + } + + factory OrdersReport.fromJson(Map json) => + _$OrdersReportFromJson(json); + + Map toJson() => _$OrdersReportToJson(this); +} + +@JsonSerializable() +class OrdersResponse { + @JsonKey(name: 'usdPrice', defaultValue: 0.0) + final double usdPrice; + + @JsonKey(name: 'test', defaultValue: false) + final bool test; + + bool get isTestOrder => test; + + OrdersResponse(this.usdPrice, this.test); + + factory OrdersResponse.fromJson(Map json) => + _$OrdersResponseFromJson(json); + + Map toJson() => _$OrdersResponseToJson(this); + + @override + String toString() { + return 'OrdersResponse{usdPrice:$usdPrice, test:$test}'; + } +} diff --git a/guru_app/lib/api/data/orders/orders_model.g.dart b/guru_app/lib/api/data/orders/orders_model.g.dart new file mode 100644 index 0000000..2f08f47 --- /dev/null +++ b/guru_app/lib/api/data/orders/orders_model.g.dart @@ -0,0 +1,71 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'orders_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +OrderUserInfo _$OrderUserInfoFromJson(Map json) => + OrderUserInfo( + json['level'] as String? ?? '0', + ); + +Map _$OrderUserInfoToJson(OrderUserInfo instance) => + { + 'level': instance.level, + }; + +OrdersReport _$OrdersReportFromJson(Map json) => OrdersReport( + orderType: json['orderType'] as int? ?? 0, + token: json['token'] as String?, + packageName: json['packageName'] as String?, + productId: json['productId'] as String?, + subscriptionId: json['subscriptionId'] as String?, + bundleId: json['bundleId'] as String?, + receipt: json['receipt'] as String?, + price: json['price'] as String?, + currency: json['currency'] as String?, + sku: json['sku'] as String?, + countryCode: json['country'] as String?, + orderUserInfo: json['userInfo'] == null + ? null + : OrderUserInfo.fromJson(json['userInfo'] as Map), + userIdentification: json['eventConfig'] == null + ? null + : UserIdentification.fromJson( + json['eventConfig'] as Map), + offerId: json['offerId'] as String?, + basePlanId: json['basePlanId'] as String?, + ); + +Map _$OrdersReportToJson(OrdersReport instance) => + { + 'orderType': instance.orderType, + 'packageName': instance.packageName, + 'productId': instance.productId, + 'subscriptionId': instance.subscriptionId, + 'token': instance.token, + 'offerId': instance.offerId, + 'basePlanId': instance.basePlanId, + 'bundleId': instance.bundleId, + 'receipt': instance.receipt, + 'sku': instance.sku, + 'country': instance.countryCode, + 'price': instance.price, + 'currency': instance.currency, + 'userInfo': instance.orderUserInfo, + 'eventConfig': instance.userIdentification, + }; + +OrdersResponse _$OrdersResponseFromJson(Map json) => + OrdersResponse( + (json['usdPrice'] as num?)?.toDouble() ?? 0.0, + json['test'] as bool? ?? false, + ); + +Map _$OrdersResponseToJson(OrdersResponse instance) => + { + 'usdPrice': instance.usdPrice, + 'test': instance.test, + }; diff --git a/guru_app/lib/api/guru_api.dart b/guru_app/lib/api/guru_api.dart new file mode 100644 index 0000000..a1a93fe --- /dev/null +++ b/guru_app/lib/api/guru_api.dart @@ -0,0 +1,158 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/device/device_info.dart'; +import 'package:guru_utils/device/device_utils.dart'; +import 'package:retrofit/retrofit.dart'; +import 'custom_transformer.dart'; +import 'data/orders/orders_model.dart'; + +/// Created by Haoyi on 6/3/21 +part 'modules/guru_api_extension.dart'; + +part 'guru_api.g.dart'; + +abstract class DioBuilder { + Dio build(); +} + +class GuruDioBuilder extends DioBuilder { + final AccountDataStore accountDataStore; + + GuruDioBuilder() : accountDataStore = AccountDataStore.instance; + + Options toOptions(RequestOptions ro) { + return Options( + method: ro.method, + sendTimeout: ro.sendTimeout, + receiveTimeout: ro.receiveTimeout, + extra: ro.extra, + headers: ro.headers, + responseType: ro.responseType, + contentType: ro.contentType, + validateStatus: ro.validateStatus, + receiveDataWhenStatusError: ro.receiveDataWhenStatusError, + followRedirects: ro.followRedirects, + maxRedirects: ro.maxRedirects, + requestEncoder: ro.requestEncoder, + responseDecoder: ro.responseDecoder, + listFormat: ro.listFormat); + } + + @override + Dio build() { + Dio dio = Dio() + ..transformer = CustomTransformer() + ..options.connectTimeout = Duration(milliseconds: GuruApp.instance.appSpec.deployment.apiConnectTimeout) + ..options.receiveTimeout = Duration(milliseconds: GuruApp.instance.appSpec.deployment.apiReceiveTimeout); + + dio.interceptors.add(InterceptorsWrapper( + onRequest: (RequestOptions options, RequestInterceptorHandler handler) async { + DeviceInfo? deviceInfo = accountDataStore.currentDevice; + final deviceId = await AppProperty.getInstance().getDeviceId(); + deviceInfo ??= + await DeviceUtils.buildDeviceInfo(deviceId: deviceId, firebasePushToken: "", uid: ""); + final token = accountDataStore.saasToken; + options.headers + .addAll({"X-APP-ID": GuruApp.instance.details.saasAppId, "X-ACCESS-TOKEN": token ?? ''}); + options.headers.addAll({"X-DEVICE-INFO": Uri.encodeFull(deviceInfo.toXDeviceInfo())}); + handler.next(options); + }, onResponse: (Response response, ResponseInterceptorHandler handler) { + // Log.v("### onResponse ${response.data}"); + response.data = response.data["data"] ?? response.data; + handler.next(response); + }, onError: (DioError err, ErrorInterceptorHandler handler) async { + final token = accountDataStore.saasToken; + final response = err.response; + Log.v("### onError ${err.toString()}"); + if (response != null && token != null && response.statusCode == 401) { + // dio.lock(); + try { + Log.v("accountDataStore.refreshAuth()"); + await accountDataStore.refreshAuth(); //获取新token + } catch (e) { + // Log.v("[NETWORK]: RefreshToken Failed."); + handler.reject(err); + } finally { + // dio.unlock(); + } + final options = err.requestOptions.copyWith(); + options.headers["X-ACCESS-TOKEN"] = accountDataStore.saasToken; + try { + final response = await dio.request(options.path, + data: options.data, + queryParameters: options.queryParameters, + cancelToken: options.cancelToken, + onReceiveProgress: options.onReceiveProgress, + options: toOptions(options)); + handler.resolve(response); + } catch (error, stacktrace) { + Log.v("re-request error:$error $stacktrace"); + handler.reject(err); + } + } else { + handler.reject(err); + } + })); + dio.interceptors + .add(LogInterceptor(requestBody: true, responseBody: true, logPrint: platformLogPrint)); + return dio; + } +} + +@RestApi() +abstract class GuruApiMethods { + factory GuruApiMethods(Dio dio, {String baseUrl}) = _GuruApiMethods; + + static GuruApiMethods create(GuruDioBuilder dioBuilder, String baseUrl) { + return GuruApiMethods(dioBuilder.build(), baseUrl: baseUrl); + } + + // 上报 Device, 初次或者 token 更新后 + @POST("/device/api/v1/devices") + Future reportDevice(@Body() DeviceInfo body); + + // Auth + @POST("/auth/api/v1/tokens/provider/secret") + Future signInWithAnonymous(@Body() AnonymousLoginReqBody body); + + @POST("/auth/api/v1/renewals/token") + Future refreshSaasToken(); + + @POST("/auth/api/v1/renewals/firebase") + Future renewFirebaseToken(); + + @POST("/order/api/v1/orders/ios") + Future iOSOrdersReport(@Body() OrdersReport body); + + @POST("/order/api/v1/orders/android") + Future androidOrdersReport(@Body() OrdersReport body); +} + +class GuruApi { + static const String _saasApiDevHost = "https://dev.saas.castbox.fm"; + static const String _saasApiReleaseHost = "https://saas.castbox.fm"; + + static bool useReleaseApi = kReleaseMode; + + static final GuruApi _releaseApi = + GuruApi._(GuruApiMethods.create(GuruDioBuilder(), _saasApiReleaseHost)); + static final GuruApi _debugApi = + GuruApi._(GuruApiMethods.create(GuruDioBuilder(), _saasApiDevHost)); + + final GuruApiMethods _methods; + + static GuruApi get instance => useReleaseApi ? _releaseApi : _debugApi; + + static String get saasApiHost => useReleaseApi ? _saasApiReleaseHost : _saasApiDevHost; + + GuruApiMethods get methods => _methods; + + GuruApi._(this._methods); +} diff --git a/guru_app/lib/api/guru_api.g.dart b/guru_app/lib/api/guru_api.g.dart new file mode 100644 index 0000000..dc68f39 --- /dev/null +++ b/guru_app/lib/api/guru_api.g.dart @@ -0,0 +1,215 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'guru_api.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers + +class _GuruApiMethods implements GuruApiMethods { + _GuruApiMethods( + this._dio, { + this.baseUrl, + }); + + final Dio _dio; + + String? baseUrl; + + @override + Future reportDevice(DeviceInfo body) async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = {}; + _data.addAll(body.toJson()); + final _result = await _dio.fetch(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/device/api/v1/devices', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = _result.data; + return value; + } + + @override + Future signInWithAnonymous(AnonymousLoginReqBody body) async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = {}; + _data.addAll(body.toJson()); + final _result = + await _dio.fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/auth/api/v1/tokens/provider/secret', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = SaasUser.fromJson(_result.data!); + return value; + } + + @override + Future refreshSaasToken() async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final Map? _data = null; + final _result = + await _dio.fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/auth/api/v1/renewals/token', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = SaasUser.fromJson(_result.data!); + return value; + } + + @override + Future renewFirebaseToken() async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/auth/api/v1/renewals/firebase', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = FirebaseTokenData.fromJson(_result.data!); + return value; + } + + @override + Future iOSOrdersReport(OrdersReport body) async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = {}; + _data.addAll(body.toJson()); + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/order/api/v1/orders/ios', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = OrdersResponse.fromJson(_result.data!); + return value; + } + + @override + Future androidOrdersReport(OrdersReport body) async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = {}; + _data.addAll(body.toJson()); + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/order/api/v1/orders/android', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = OrdersResponse.fromJson(_result.data!); + return value; + } + + RequestOptions _setStreamType(RequestOptions requestOptions) { + if (T != dynamic && + !(requestOptions.responseType == ResponseType.bytes || + requestOptions.responseType == ResponseType.stream)) { + if (T == String) { + requestOptions.responseType = ResponseType.plain; + } else { + requestOptions.responseType = ResponseType.json; + } + } + return requestOptions; + } + + String _combineBaseUrls( + String dioBaseUrl, + String? baseUrl, + ) { + if (baseUrl == null || baseUrl.trim().isEmpty) { + return dioBaseUrl; + } + + final url = Uri.parse(baseUrl); + + if (url.isAbsolute) { + return url.toString(); + } + + return Uri.parse(dioBaseUrl).resolveUri(url).toString(); + } +} diff --git a/guru_app/lib/api/modules/guru_api_extension.dart b/guru_app/lib/api/modules/guru_api_extension.dart new file mode 100644 index 0000000..039212a --- /dev/null +++ b/guru_app/lib/api/modules/guru_api_extension.dart @@ -0,0 +1,25 @@ +/// Created by Haoyi on 6/4/21 +/// +part of "../guru_api.dart"; + +extension GuruApiExtension on GuruApi { + Future signInWithAnonymous({required String secret}) async { + return await methods.signInWithAnonymous(AnonymousLoginReqBody(secret: secret)); + } + + Future reportDevice(DeviceInfo deviceInfo) async { + return await methods.reportDevice(deviceInfo); + } + + Future renewFirebaseToken() async { + return await methods.renewFirebaseToken(); + } + + Future reportOrders(OrdersReport body) async { + if (Platform.isAndroid) { + return await methods.androidOrdersReport(body); + } else { + return await methods.iOSOrdersReport(body); + } + } +} diff --git a/guru_app/lib/app/app_models.dart b/guru_app/lib/app/app_models.dart new file mode 100644 index 0000000..5a69bf6 --- /dev/null +++ b/guru_app/lib/app/app_models.dart @@ -0,0 +1,184 @@ +import 'dart:io'; + +import 'package:guru_app/firebase/messaging/remote_messaging_manager.dart'; +import 'package:json_annotation/json_annotation.dart'; + +/// Created by Haoyi on 2022/8/29 + +part 'app_models.g.dart'; + +@JsonSerializable() +class AppDetails { + @JsonKey(name: "saas_app_id") + final String saasAppId; + @JsonKey(name: "authority") + final String authority; + @JsonKey(name: "storage_prefix") + final String storagePrefix; + @JsonKey(name: "default_cdn_prefix") + final String defaultCdnPrefix; + @JsonKey(name: "android_gp_url") + final String androidGooglePlayUrl; + @JsonKey(name: "ios_spp_store_url") + final String iosAppStoreUrl; + @JsonKey(name: "policy_url") + final String policyUrl; + @JsonKey(name: "terms_url") + final String termsUrl; + @JsonKey(name: "email_url") + final String emailUrl; + @JsonKey(name: "package_name") + final String packageName; + @JsonKey(name: "bundle_id") + final String bundleId; + @JsonKey(name: "facebook_app_id") + final String facebookAppId; + + String get appId => Platform.isAndroid ? packageName : bundleId; + + AppDetails( + {required this.saasAppId, + required this.authority, + required this.storagePrefix, + required this.defaultCdnPrefix, + required this.androidGooglePlayUrl, + this.iosAppStoreUrl = '', + required this.policyUrl, + required this.termsUrl, + required this.emailUrl, + required this.packageName, + required this.bundleId, + required this.facebookAppId}); + + factory AppDetails.fromJson(Map json) => _$AppDetailsFromJson(json); + + Map toJson() => _$AppDetailsToJson(this); +} + +@JsonSerializable() +class Deployment { + static const int defaultIgcBalanceSecret = 2654404609; + static const int defaultLogFileSizeLimit = 1024 * 1024 * 10; + static const int defaultLogFileCount = 7; + static const int defaultPersistentLogLevel = 2; + static const int defaultApiTimeout = 15000; // 15s + static const int defaultIosSandboxSubsRenewalSpeed = 2; + static const int defaultTrackingNotificationPermissionPassLimitTimes = 10; + + @JsonKey(name: "property_cache_size", defaultValue: 256) + final int propertyCacheSize; + + @JsonKey(name: "enable_dithering", defaultValue: true) + final bool enableDithering; + + @JsonKey(name: "disable_rewards_ads", defaultValue: false) + final bool disableRewardsAds; + + @JsonKey(name: "enable_analytics_statistic", defaultValue: true) + final bool enableAnalyticsStatistic; + + @JsonKey(name: "auto_restore_iap", defaultValue: true) + final bool autoRestoreIap; + + @JsonKey(name: "init_igc", defaultValue: 500) + final int initIgc; + + @JsonKey(name: "igc_balance_secret", defaultValue: defaultIgcBalanceSecret) + final int igcBalanceSecret; + + @JsonKey(name: "sync_account_profile", defaultValue: true) + final bool syncAccountProfile; + + @JsonKey(name: "auto_request_notification_permission", defaultValue: false) + final bool autoRequestNotificationPermission; + + @JsonKey(name: "log_file_size_limit", defaultValue: defaultLogFileSizeLimit) + final int logFileSizeLimit; + + @JsonKey(name: "log_file_count", defaultValue: defaultLogFileCount) + final int logFileCount; + + @JsonKey(name: "persistent_log_level", defaultValue: defaultPersistentLogLevel) + final int persistentLogLevel; + + @JsonKey(name: "ios_validate_receipt_password") + final String? iosValidateReceiptPassword; + + @JsonKey(name: "conversion_events", defaultValue: {}) + final Set conversionEvents; + + @JsonKey(name: "api_connect_timeout", defaultValue: defaultApiTimeout) + final int apiConnectTimeout; + + @JsonKey(name: "api_receive_timeout", defaultValue: defaultApiTimeout) + final int apiReceiveTimeout; + + @JsonKey(name: "ios_sandbox_subs_renewal_speed", defaultValue: defaultIosSandboxSubsRenewalSpeed) + final int iosSandboxSubsRenewalSpeed; + + @JsonKey(name: "ads_compliant_initialization", defaultValue: false) + final bool adsCompliantInitialization; + + @JsonKey(name: "notification_permission_prompt_trigger", defaultValue: PromptTrigger.rationale) + final PromptTrigger notificationPermissionPromptTrigger; + + @JsonKey(name: "tracking_notification_permission_pass", defaultValue: false) + final bool trackingNotificationPermissionPass; + + @JsonKey( + name: "tracking_notification_permission_pass_limit_times", + defaultValue: defaultTrackingNotificationPermissionPassLimitTimes) + final int trackingNotificationPermissionPassLimitTimes; + + @JsonKey(name: "enabled_guru_analytics_strategy", defaultValue: false) + final bool enabledGuruAnalyticsStrategy; + + @JsonKey(name: "allow_interstitial_as_alternative_reward", defaultValue: false) + final bool allowInterstitialAsAlternativeReward; + + @JsonKey(name: "show_internal_ads_when_banner_unavailable", defaultValue: false) + final bool showInternalAdsWhenBannerUnavailable; + + Deployment( + {this.propertyCacheSize = 256, + this.enableDithering = true, + this.disableRewardsAds = false, + this.enableAnalyticsStatistic = true, + this.autoRestoreIap = false, + this.initIgc = 0, + this.igcBalanceSecret = defaultIgcBalanceSecret, + this.syncAccountProfile = true, + this.autoRequestNotificationPermission = false, + this.logFileSizeLimit = defaultLogFileSizeLimit, + this.logFileCount = defaultLogFileCount, + this.persistentLogLevel = defaultPersistentLogLevel, + this.iosValidateReceiptPassword, + this.conversionEvents = const {}, + this.apiConnectTimeout = defaultApiTimeout, + this.apiReceiveTimeout = defaultApiTimeout, + this.iosSandboxSubsRenewalSpeed = defaultIosSandboxSubsRenewalSpeed, + this.adsCompliantInitialization = false, + this.notificationPermissionPromptTrigger = PromptTrigger.rationale, + this.trackingNotificationPermissionPass = false, + this.trackingNotificationPermissionPassLimitTimes = + defaultTrackingNotificationPermissionPassLimitTimes, + this.enabledGuruAnalyticsStrategy = false, + this.allowInterstitialAsAlternativeReward = false, + this.showInternalAdsWhenBannerUnavailable = false}); + + factory Deployment.fromJson(Map json) => _$DeploymentFromJson(json); + + Map toJson() => _$DeploymentToJson(this); +} + +@JsonSerializable() +class RemoteDeployment { + @JsonKey(name: "keep_screen_on_duration_m", defaultValue: 0) + final int keepScreenOnDuration; + + RemoteDeployment({this.keepScreenOnDuration = 0}); + + factory RemoteDeployment.fromJson(Map json) => _$RemoteDeploymentFromJson(json); + + Map toJson() => _$RemoteDeploymentToJson(this); +} diff --git a/guru_app/lib/app/app_models.g.dart b/guru_app/lib/app/app_models.g.dart new file mode 100644 index 0000000..14d032d --- /dev/null +++ b/guru_app/lib/app/app_models.g.dart @@ -0,0 +1,131 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'app_models.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AppDetails _$AppDetailsFromJson(Map json) => AppDetails( + saasAppId: json['saas_app_id'] as String, + authority: json['authority'] as String, + storagePrefix: json['storage_prefix'] as String, + defaultCdnPrefix: json['default_cdn_prefix'] as String, + androidGooglePlayUrl: json['android_gp_url'] as String, + iosAppStoreUrl: json['ios_spp_store_url'] as String? ?? '', + policyUrl: json['policy_url'] as String, + termsUrl: json['terms_url'] as String, + emailUrl: json['email_url'] as String, + packageName: json['package_name'] as String, + bundleId: json['bundle_id'] as String, + facebookAppId: json['facebook_app_id'] as String, + ); + +Map _$AppDetailsToJson(AppDetails instance) => + { + 'saas_app_id': instance.saasAppId, + 'authority': instance.authority, + 'storage_prefix': instance.storagePrefix, + 'default_cdn_prefix': instance.defaultCdnPrefix, + 'android_gp_url': instance.androidGooglePlayUrl, + 'ios_spp_store_url': instance.iosAppStoreUrl, + 'policy_url': instance.policyUrl, + 'terms_url': instance.termsUrl, + 'email_url': instance.emailUrl, + 'package_name': instance.packageName, + 'bundle_id': instance.bundleId, + 'facebook_app_id': instance.facebookAppId, + }; + +Deployment _$DeploymentFromJson(Map json) => Deployment( + propertyCacheSize: json['property_cache_size'] as int? ?? 256, + enableDithering: json['enable_dithering'] as bool? ?? true, + disableRewardsAds: json['disable_rewards_ads'] as bool? ?? false, + enableAnalyticsStatistic: + json['enable_analytics_statistic'] as bool? ?? true, + autoRestoreIap: json['auto_restore_iap'] as bool? ?? true, + initIgc: json['init_igc'] as int? ?? 500, + igcBalanceSecret: json['igc_balance_secret'] as int? ?? 2654404609, + syncAccountProfile: json['sync_account_profile'] as bool? ?? true, + autoRequestNotificationPermission: + json['auto_request_notification_permission'] as bool? ?? false, + logFileSizeLimit: json['log_file_size_limit'] as int? ?? 10485760, + logFileCount: json['log_file_count'] as int? ?? 7, + persistentLogLevel: json['persistent_log_level'] as int? ?? 2, + iosValidateReceiptPassword: + json['ios_validate_receipt_password'] as String?, + conversionEvents: (json['conversion_events'] as List?) + ?.map((e) => e as String) + .toSet() ?? + {}, + apiConnectTimeout: json['api_connect_timeout'] as int? ?? 15000, + apiReceiveTimeout: json['api_receive_timeout'] as int? ?? 15000, + iosSandboxSubsRenewalSpeed: + json['ios_sandbox_subs_renewal_speed'] as int? ?? 2, + adsCompliantInitialization: + json['ads_compliant_initialization'] as bool? ?? false, + notificationPermissionPromptTrigger: $enumDecodeNullable( + _$PromptTriggerEnumMap, + json['notification_permission_prompt_trigger']) ?? + PromptTrigger.rationale, + trackingNotificationPermissionPass: + json['tracking_notification_permission_pass'] as bool? ?? false, + trackingNotificationPermissionPassLimitTimes: + json['tracking_notification_permission_pass_limit_times'] as int? ?? + 10, + enabledGuruAnalyticsStrategy: + json['enabled_guru_analytics_strategy'] as bool? ?? false, + allowInterstitialAsAlternativeReward: + json['allow_interstitial_as_alternative_reward'] as bool? ?? false, + showInternalAdsWhenBannerUnavailable: + json['show_internal_ads_when_banner_unavailable'] as bool? ?? false, + ); + +Map _$DeploymentToJson(Deployment instance) => + { + 'property_cache_size': instance.propertyCacheSize, + 'enable_dithering': instance.enableDithering, + 'disable_rewards_ads': instance.disableRewardsAds, + 'enable_analytics_statistic': instance.enableAnalyticsStatistic, + 'auto_restore_iap': instance.autoRestoreIap, + 'init_igc': instance.initIgc, + 'igc_balance_secret': instance.igcBalanceSecret, + 'sync_account_profile': instance.syncAccountProfile, + 'auto_request_notification_permission': + instance.autoRequestNotificationPermission, + 'log_file_size_limit': instance.logFileSizeLimit, + 'log_file_count': instance.logFileCount, + 'persistent_log_level': instance.persistentLogLevel, + 'ios_validate_receipt_password': instance.iosValidateReceiptPassword, + 'conversion_events': instance.conversionEvents.toList(), + 'api_connect_timeout': instance.apiConnectTimeout, + 'api_receive_timeout': instance.apiReceiveTimeout, + 'ios_sandbox_subs_renewal_speed': instance.iosSandboxSubsRenewalSpeed, + 'ads_compliant_initialization': instance.adsCompliantInitialization, + 'notification_permission_prompt_trigger': + _$PromptTriggerEnumMap[instance.notificationPermissionPromptTrigger]!, + 'tracking_notification_permission_pass': + instance.trackingNotificationPermissionPass, + 'tracking_notification_permission_pass_limit_times': + instance.trackingNotificationPermissionPassLimitTimes, + 'enabled_guru_analytics_strategy': instance.enabledGuruAnalyticsStrategy, + 'allow_interstitial_as_alternative_reward': + instance.allowInterstitialAsAlternativeReward, + 'show_internal_ads_when_banner_unavailable': + instance.showInternalAdsWhenBannerUnavailable, + }; + +const _$PromptTriggerEnumMap = { + PromptTrigger.rationale: 0, + PromptTrigger.request: 1, +}; + +RemoteDeployment _$RemoteDeploymentFromJson(Map json) => + RemoteDeployment( + keepScreenOnDuration: json['keep_screen_on_duration_m'] as int? ?? 0, + ); + +Map _$RemoteDeploymentToJson(RemoteDeployment instance) => + { + 'keep_screen_on_duration_m': instance.keepScreenOnDuration, + }; diff --git a/guru_app/lib/controller/account_aware.dart b/guru_app/lib/controller/account_aware.dart new file mode 100644 index 0000000..296036e --- /dev/null +++ b/guru_app/lib/controller/account_aware.dart @@ -0,0 +1,92 @@ +// +// +// import 'package:guru_app/account/account_data_store.dart'; +// import 'package:guru_app/account/model/account_profile.dart'; +// import 'package:guru_app/account/model/user.dart'; +// import 'package:guru_utils/controller/controller.dart'; +// +// /// Created by Haoyi on 2022/5/23 +// +// mixin AccountAware on LifecycleController { +// AccountDataStore get accountDataStore => AccountDataStore.instance; +// +// Stream get observableAccountProfile => accountDataStore.observableAccountProfile; +// +// String? get saasToken => accountDataStore.saasToken; +// +// String? get uid => accountDataStore.uid; +// +// AccountProfile? get accountProfile => accountDataStore.accountProfile; +// +// String? get nickname => accountDataStore.nickname; +// +// String? get countryCode => accountDataStore.countryCode; +// +// SaasUser? get user => accountDataStore.user; +// +// DeviceInfo? get currentDevice => accountDataStore.currentDevice; +// +// String? get userAvatar => accountProfile?.avatar; +// +// CumulativeInt? get bestScore => accountProfile?.bestScore; +// +// bool get accountInitialized => accountDataStore.initialized; +// +// Stream get observableNickname => +// observableAccountProfile.map((accountProfile) => accountProfile?.nickname); +// +// Stream get observableAccountInitialized => accountDataStore.observableInitialized; +// +// void initAccount() { +// Injector.provide().init(); +// } +// +// Future updateAccountProfile( +// {String? nickname, String? avatar, CumulativeInt? bestScore, String? countryCode}) async { +// final accountService = Injector.provide(); +// // final rankService = Injector.provide(); +// return await accountService.modifyProfile( +// nickname: nickname, avatar: avatar, bestScore: bestScore, countryCode: countryCode); +// // if (result) { +// // await rankService.refreshAccountProfile(); +// // } +// return true; +// } +// +// // Future uploadBestScore() async { +// // final accountService = Injector.provide(); +// // final rankService = Injector.provide(); +// // final latestBestScore = StatisticManager.instance.peekBestScore(); +// // final accountBestScore = bestScore ?? CumulativeInt.zero; +// // +// // Log.w("uploadBestScore latestBestScore! $latestBestScore $accountBestScore", +// // syncFirebase: true); +// // if (latestBestScore > accountBestScore) { +// // String? changedCountryCode = DeviceUtils.buildLocaleInfo().countryCode.toUpperCase(); +// // if (DartExt.isBlank(changedCountryCode) || countryCode == changedCountryCode) { +// // changedCountryCode = null; +// // } +// // try { +// // await accountService.modifyProfile( +// // bestScore: latestBestScore, countryCode: changedCountryCode); +// // } catch (error, stacktrace) { +// // Log.w("modifyProfile error!", error: error, stackTrace: stacktrace, syncFirebase: true); +// // } +// // } +// // await rankService.uploadBestScore(latestBestScore); +// // return true; +// // } +// // +// // RankData buildEmptyRankData(String boardId, {CumulativeInt? bestScore}) { +// // return RankData( +// // boardId, +// // uid ?? "", +// // -1, +// // bestScore ?? this.bestScore, +// // LbUserInfo( +// // nickname: nickname ?? "", +// // countryCode: DeviceUtils.buildLocaleInfo().countryCode.toUpperCase(), +// // avatar: "avatar_1", +// // attr: UserAttr.real)); +// // } +// } diff --git a/guru_app/lib/controller/assets_aware.dart b/guru_app/lib/controller/assets_aware.dart new file mode 100644 index 0000000..bfb9a1c --- /dev/null +++ b/guru_app/lib/controller/assets_aware.dart @@ -0,0 +1,87 @@ +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/financial_manager.dart'; +import 'package:guru_app/financial/iap/iap_manager.dart'; +import 'package:guru_app/financial/iap/iap_model.dart'; +import 'package:guru_app/financial/igc/igc_manager.dart'; +import 'package:guru_app/financial/igc/igc_model.dart'; +import 'package:guru_app/financial/product/product_store.dart'; +import 'package:guru_app/financial/reward/reward_manager.dart'; +import 'package:guru_app/financial/reward/reward_model.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/test/test_guru_app_creator.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/controller/controller.dart'; + +/// Created by Haoyi on 2022/4/7 + +mixin AssetsAware on LifecycleController { + final BehaviorSubject> _productStoreSubject = + BehaviorSubject.seeded(ProductStore()); + + ProductStore get currentProductStore => _productStoreSubject.value; + + AssetsStore get currentIapAssetStore => IapManager.instance.purchasedStore; + + AssetsStore get currentRewardedStore => RewardManager.instance.rewardedStore; + + Stream> get observableProductStore => _productStoreSubject.stream; + + Stream> get observableIapPurchased => IapManager.instance.observableAssetStore; + + Stream> get observableRewarded => RewardManager.instance.observableAssetStore; + + Stream> get observableAssets => FinancialManager.instance.observableAssets; + + int _latestRefreshIapProductTimestamp = 0; + + bool get isIapCanceled => IapManager.instance.latestIapCause == IapCause.canceled; + + bool get isIapError => IapManager.instance.latestIapCause == IapCause.error; + + int get currentIgcBalance => IgcManager.instance.currentBalance; + + Stream get observableIgcBalance => IgcManager.instance.observableCurrentBalance; + + Future restorePurchases() async { + return await IapManager.instance.restorePurchases(); + } + + Future clearIapAssets() async { + return await IapManager.instance.clearAssetRecord(); + } + + void observeIapProducts(Set intents) { + addSubscription(IapManager.instance.observableProductDetails.listen((details) async { + final productStore = await IapManager.instance.buildProducts(intents); + _productStoreSubject.addEx(productStore); + })); + } + + void refreshIapProducts() async { + final now = DateTimeUtils.currentTimeInMillis(); + if (now - _latestRefreshIapProductTimestamp > DateTimeUtils.minuteInMillis) { + IapManager.instance.refreshProducts(); + _latestRefreshIapProductTimestamp = now; + } else { + Log.w("refreshIapProducts Too Frequency!", tag: "IAP"); + } + } + + Future buildRewardProduct(TransactionIntent intent) { + return RewardManager.instance.buildRewardProduct(intent); + } + + Future requestProduct(Product product, {String from = ""}) async { + if (product is IapProduct) { + return await IapManager.instance.buy(product); + } else if (product is IgcProduct) { + return await IgcManager.instance.purchase(product); + } else if (product is RewardProduct) { + return await RewardManager.instance.claim(product); + } else { + return false; + } + } +} diff --git a/guru_app/lib/controller/gems_controller.dart b/guru_app/lib/controller/gems_controller.dart new file mode 100644 index 0000000..2574cd7 --- /dev/null +++ b/guru_app/lib/controller/gems_controller.dart @@ -0,0 +1,61 @@ +import 'dart:math'; + +import 'package:get/get.dart' hide Rx; + +import 'dart:ui' as ui show Image; + +/// Created by Haoyi on 2022/7/16 +/// +/// +// abstract class GemsController extends AdsController +// with AssetsAware, InterstitialAware, RewardedAware, VisualFeastAware { +// Future loadGemsResource(VisualFeastEngine engine) async { +// final imageFutures = [ +// Flame.images.load("ic_gem.png"), +// Flame.images.load("ic_gem_add.png"), +// ]; +// final loadedResources = await Future.wait([ +// Future.wait(imageFutures), +// // Future.wait(lottieFutures) +// ]); +// final images = loadedResources[0] as List; +// addSprite("gem", VisualFeastSprite.fromImage(images[0])); +// addSprite("gemAdd", VisualFeastSprite.fromImage(images[1])); +// } +// +// void startClaim(int gems, String method, {bool useBg = true, VoidCallback? onCompleted}) async { +// final engine = createEngine(onCompleted: onCompleted); +// await loadGemsResource(engine); +// +// final designSpec = GemsRewardsDesignSpec.get(); +// final gemsBarSpec = designSpec.buildGemBarSpec(); +// final gemsBar = GemsBar( +// gemBarSpec: gemsBarSpec, +// gemSprite: getSprite("gem"), +// gemAddSprite: getSprite("gemAdd"), +// assetsAware: this); +// final size = designSpec.measuredSize / 2; +// final gemsReward = GemsReward( +// Rect.fromCenter( +// center: Offset(size.width, size.height + gemsBarSpec.gemRect.width * 2), +// width: gemsBarSpec.gemRect.width, +// height: gemsBarSpec.gemRect.width), onFirstGemComplete: () { +// claimGems(gems, method); +// }); +// final background = Background(gemsBarSpec); +// final gemsHeight = gemsBarSpec.gemRect.width; +// final gemsText = GemsText(gems, Offset(size.width, size.height), +// Offset(size.width, size.height - gemsHeight * 2)); +// engine.attachRenders( +// ListUtils.filterOutNulls([useBg ? background : null, gemsBar, gemsReward, gemsText])); +// +// dispatch(engine); +// } +// +// Future claimGems(int gems, String method) async { +// onClaimed(gems, method); +// } +// +// void onClaimed(int gems, String method) { +// } +// } diff --git a/guru_app/lib/database/creators/creators.dart b/guru_app/lib/database/creators/creators.dart new file mode 100644 index 0000000..53b329b --- /dev/null +++ b/guru_app/lib/database/creators/creators.dart @@ -0,0 +1,13 @@ +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_utils/database/database.dart'; +import 'package:guru_utils/property/storage/db/property_database.dart'; + +/// Created by Haoyi on 2023/1/13 + +final List _creatorV1 = [PropertyEntity.createTable]; + +final List _creatorV2 = [OrderEntity.createTable]; + +class Creators { + static final List creators = [..._creatorV1, ..._creatorV2]; +} diff --git a/guru_app/lib/database/guru_db.dart b/guru_app/lib/database/guru_db.dart new file mode 100644 index 0000000..f4fb968 --- /dev/null +++ b/guru_app/lib/database/guru_db.dart @@ -0,0 +1,29 @@ +import 'package:guru_app/database/creators/creators.dart'; +import 'package:guru_utils/database/database.dart'; +import 'package:guru_utils/property/storage/property_storage.dart'; +import 'package:guru_utils/property/storage/db/property_database.dart'; +import "migrations/migrations.dart"; + +/// Created by Haoyi on 2022/9/7 + +abstract class _GuruDB extends AppDatabase with PropertyStorage {} + +class GuruDB extends _GuruDB with PropertyDatabase { + static final GuruDB instance = GuruDB._(); + + GuruDB._() { + setDatabase(this); + } + + @override + String get dbName => "guru"; + + @override + List get migrations => Migrations.migrations; + + @override + List get tableCreators => Creators.creators; + + @override + int get version => 3; +} diff --git a/guru_app/lib/database/migrations/migration_v1_to_v2.dart b/guru_app/lib/database/migrations/migration_v1_to_v2.dart new file mode 100644 index 0000000..ff9a50c --- /dev/null +++ b/guru_app/lib/database/migrations/migration_v1_to_v2.dart @@ -0,0 +1,13 @@ +/// Created by Haoyi on 2020/5/22 +/// +part of "migrations.dart"; + +class _MigrationV1toV2 implements Migration { + @override + Future migrate(Transaction transaction) async { + await OrderEntity.createTable(transaction); + return MigrateResult.success; + } +} + +final migration1to2 = _MigrationV1toV2(); diff --git a/guru_app/lib/database/migrations/migration_v2_to_v3.dart b/guru_app/lib/database/migrations/migration_v2_to_v3.dart new file mode 100644 index 0000000..cc76599 --- /dev/null +++ b/guru_app/lib/database/migrations/migration_v2_to_v3.dart @@ -0,0 +1,22 @@ +/// Created by Haoyi on 2023/2/16 + +part of "migrations.dart"; + +class _MigrationV2toV3 implements Migration { + @override + Future migrate(Transaction transaction) async { + // 由于这里无法保证所在平台是否支持IF NOT EXISTS,所以这里用try catch来处理 + try { + await transaction + .execute( + "ALTER TABLE ${OrderEntity.tbName} ADD ${OrderEntity.dbCategory} TEXT DEFAULT ''"); + await transaction.execute( + "CREATE INDEX trans_category_idx ON ${OrderEntity.tbName} (${OrderEntity.dbCategory});"); + } catch(error, stacktrace) { + Log.w("ignore alter cmd!"); + } + return MigrateResult.success; + } +} + +final migration2to3 = _MigrationV2toV3(); diff --git a/guru_app/lib/database/migrations/migrations.dart b/guru_app/lib/database/migrations/migrations.dart new file mode 100644 index 0000000..0e4500d --- /dev/null +++ b/guru_app/lib/database/migrations/migrations.dart @@ -0,0 +1,13 @@ +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_utils/database/database.dart'; +import 'package:guru_utils/log/log.dart'; + +part "migration_v1_to_v2.dart"; +part 'migration_v2_to_v3.dart'; + +/// Created by @Haoyi on 2020/5/22 +/// + +class Migrations { + static final migrations = [migration1to2, migration2to3]; +} diff --git a/guru_app/lib/financial/asset/assets_model.dart b/guru_app/lib/financial/asset/assets_model.dart new file mode 100644 index 0000000..197dd3e --- /dev/null +++ b/guru_app/lib/financial/asset/assets_model.dart @@ -0,0 +1,11 @@ +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/product/product_model.dart'; + +/// Created by Haoyi on 6/1/21 + +class Asset { + final ProductId productId; + final OrderEntity order; + + Asset(this.productId, this.order); +} \ No newline at end of file diff --git a/guru_app/lib/financial/asset/assets_store.dart b/guru_app/lib/financial/asset/assets_store.dart new file mode 100644 index 0000000..d8472b1 --- /dev/null +++ b/guru_app/lib/financial/asset/assets_store.dart @@ -0,0 +1,70 @@ +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/product/product_model.dart'; + +/// Created by Haoyi on 6/1/21 +/// + +class AssetsStore { + final bool isActive; + final Map data = {}; + + AssetsStore.inactive() : isActive = false; + + AssetsStore() : isActive = true; + + Map toStringMap() { + final result = {}; + int index = 0; + for (var entry in data.entries) { + result["${index++}"] = entry.toString(); + } + return result; + } + + void forEach(void Function(ProductId productId, T asset) callback) { + for (var element in data.entries) { + callback.call(element.key, element.value); + } + } + + void removeWhere(bool Function(ProductId productId, T asset) callback) { + data.removeWhere((key, value) => callback.call(key, value)); + } + + void addAsset(T asset) { + data[asset.productId] = asset; + } + + void clearAsset({String? category, TransactionMethod? method}) { + data.removeWhere((key, value) => + (category == null || value.order.category == category) && + (method == null || value.order.method == method.index)); + } + + void addAllAssets(List assets) { + for (var asset in assets) { + addAsset(asset); + } + } + + T? getAsset(ProductId? productId) { + return productId?.isValid() == true ? data[productId] : null; + } + + bool isOwned(ProductId productId) { + return data.containsKey(productId); + } + + bool existsAssets(Iterable productIds) { + for (var productId in productIds) { + if (isOwned(productId)) { + return true; + } + } + return false; + } + + AssetsStore clone() { + return AssetsStore()..data.addAll(data); + } +} diff --git a/guru_app/lib/financial/data/db/order_database.dart b/guru_app/lib/financial/data/db/order_database.dart new file mode 100644 index 0000000..3a353d2 --- /dev/null +++ b/guru_app/lib/financial/data/db/order_database.dart @@ -0,0 +1,391 @@ +import 'package:guru_app/database/guru_db.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/id/id_utils.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:json_annotation/json_annotation.dart'; + +import '../../manifest/manifest.dart'; + +/// Created by Haoyi on 2022/9/5 + +part 'order_database.g.dart'; + +@JsonSerializable() +class AssetEntity { + static const tbName = "assets"; // Product Transaction Table + static const dbSku = "sku"; + static const dbState = "state"; + static const dbAttribute = "attr"; // 商品属性(所有,消耗品,订阅) + static const dbMethod = "method"; // 购买方式(免费获取,金币购买,IAP购买,激励视频购买) + static const dbCurrency = "currency"; // 货币类型(法币,虚拟币) + static const dbCost = "cost"; // 消费多少 + static const dbTimestamp = "ts"; + static const dbManifest = "manifest"; // 本次交易中的清单 +} + +@JsonSerializable() +class OrderEntity { + static const tbName = "orders"; // Product Transaction Table + static const dbOrderId = "oid"; + static const dbSku = "sku"; + static const dbState = "state"; + static const dbErrorInfo = "err_info"; + static const dbAttribute = "attr"; // 商品属性(所有,消耗品,订阅) + static const dbMethod = "method"; // 购买方式(免费获取,金币购买,IAP购买,激励视频购买) + static const dbCurrency = "currency"; // 货币类型(法币,虚拟币) + static const dbCategory = "category"; + static const dbCost = "cost"; // 消费多少 + static const dbTimestamp = "ts"; + static const dbManifest = "manifest"; // 本次交易中的清单 + + @JsonKey(name: dbOrderId) + final String orderId; + + @JsonKey(name: dbSku) + final String sku; + + @JsonKey(name: dbState) + final int state; + + @JsonKey(name: dbAttribute) + final int attr; + + @JsonKey(name: dbMethod) + final int method; + + @JsonKey(name: dbErrorInfo, defaultValue: "") + final String errorInfo; + + @JsonKey(name: dbCurrency, defaultValue: "") + final String currency; + + @JsonKey(name: dbCost, defaultValue: 0.0) + final double cost; + + @JsonKey(name: dbTimestamp, defaultValue: 0) + final int timestamp; + + @JsonKey(name: dbCategory, defaultValue: "") + final String category; + + @JsonKey(name: dbManifest) + @manifestStringConvert + final Manifest? manifest; + + @JsonKey(ignore: true) + ProductId? _productId; + + OrderEntity( + {required this.orderId, + required this.sku, + required this.state, + required this.attr, + required this.method, + required this.currency, + required this.cost, + required this.timestamp, + required this.category, + required this.manifest, + this.errorInfo = ""}); + + OrderEntity success() { + return OrderEntity( + orderId: orderId, + sku: sku, + state: TransactionState.success, + attr: attr, + method: method, + currency: currency, + cost: cost, + category: category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest); + } + + OrderEntity error(String errorInfo) { + return OrderEntity( + orderId: orderId, + sku: sku, + state: TransactionState.error, + attr: attr, + method: method, + currency: currency, + cost: cost, + category: category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest, + errorInfo: errorInfo); + } + + OrderEntity expired() { + return OrderEntity( + orderId: orderId, + sku: sku, + state: TransactionState.expired, + attr: attr, + method: method, + currency: currency, + cost: cost, + category: category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest, + errorInfo: "Subscription Expired"); + } + + bool get isConsumable => attr == TransactionAttributes.consumable; + + bool get isAsset => attr == TransactionAttributes.asset; + + bool get isSubscription => attr == TransactionAttributes.subscriptions; + + bool get isSuccess => state == TransactionState.success; + + static Future createTable(Transaction delegate) async { + // v1 + const v1Fields = "$dbOrderId TEXT PRIMARY KEY," + "$dbSku TEXT NOT NULL," + "$dbState INTEGER NOT NULL," + "$dbAttribute INTEGER NOT NULL," + "$dbMethod INTEGER NOT NULL," + "$dbErrorInfo TEXT DEFAULT ''," + "$dbCurrency TEXT NOT NULL," + "$dbCost REAL DEFAULT 0.0," + "$dbTimestamp INTEGER NOT NULL," + "$dbManifest TEXT DEFAULT '',"; + + const v2Fields = "$dbCategory TEXT DEFAULT ''"; + + const cmd = "CREATE TABLE $tbName (" + "$v1Fields" + "$v2Fields" + ");"; + + Log.v("#### cmd: $cmd"); + + await delegate.execute(cmd); + await delegate.execute("CREATE INDEX trans_sku_idx ON $tbName ($dbSku);"); + await delegate.execute("CREATE INDEX trans_category_idx ON $tbName ($dbCategory);"); + } + + @override + String toString() { + return 'OrderEntity{tid: $dbOrderId, sku: $sku, state: $state, attr: $attr, method: $method, errorInfo: $errorInfo, currency: $currency, cost: $cost, timestamp: $timestamp, manifest: $manifest}'; + } + + factory OrderEntity.fromMap(Map json) => _$OrderEntityFromJson(json); + + Map toMap() => _$OrderEntityToJson(this); + + Map toUpdateMap() => toMap()..remove(dbOrderId); + + ProductId get productId { + _productId ??= GuruApp.instance.defineProductId(sku, attr, TransactionMethod.values[method]); + return _productId!; + } +} + +extension OrderDatabase on GuruDB { + Future> loadAllOrders() async { + final db = getDb(); + final result = await db.rawQuery("SELECT * FROM ${OrderEntity.tbName}"); + if (result.isNotEmpty) { + return {for (var map in result) map[OrderEntity.dbOrderId] as String: map.toString()}; + } + return {}; + } + + Future> selectOrders( + {required TransactionMethod method, + required List attrs, + int state = TransactionState.success}) async { + final db = getDb(); + final List conditions = [ + "${OrderEntity.dbMethod} = ${method.index}", + "${OrderEntity.dbState} = $state" + ]; + if (attrs.isNotEmpty) { + conditions.add("${OrderEntity.dbAttribute} IN (${attrs.map((attr) => '"$attr"').join(",")})"); + } + final result = + await db.rawQuery("SELECT * FROM ${OrderEntity.tbName} WHERE ${conditions.join(" AND ")}"); + if (result.isNotEmpty) { + return result.map((map) => OrderEntity.fromMap(map)).toList(); + } + return []; + } + + Future> getCompleteOrders(ProductId productId) async { + final db = getDb(); + String where = + "${OrderEntity.dbSku} = '${productId.sku}' AND ${OrderEntity.dbState} = ${TransactionState.success}"; + final result = await db.rawQuery("SELECT * FROM ${OrderEntity.tbName} WHERE $where"); + if (result.isNotEmpty) { + return result.map((map) => OrderEntity.fromMap(map)).toList(); + } + return []; + } + + Future> getPendingOrders(ProductId productId, + {TransactionMethod method = TransactionMethod.iap}) async { + final db = getDb(); + String where = + "${OrderEntity.dbSku} = '${productId.sku}' AND ${OrderEntity.dbMethod} = ${method.index} AND ${OrderEntity.dbState} = ${TransactionState.pending}"; + final result = await db.rawQuery( + "SELECT * FROM ${OrderEntity.tbName} WHERE $where ORDER BY ${OrderEntity.dbTimestamp} DESC"); + if (result.isNotEmpty) { + return result.map((map) => OrderEntity.fromMap(map)).toList(); + } + return []; + } + + Future> completePendingOrders(Set productIds, + {TransactionMethod method = TransactionMethod.iap}) async { + final db = getDb(); + final batch = db.batch(); + final updateValues = { + OrderEntity.dbState: TransactionState.success, + OrderEntity.dbTimestamp: DateTimeUtils.currentTimeInMillis() + }; + for (var productId in productIds) { + final String where = + "${OrderEntity.dbSku} = '${productId.sku}' AND ${OrderEntity.dbMethod} = ${method.index} AND ${OrderEntity.dbState} = ${TransactionState.pending}"; + if (productId.isConsumable) { + batch.delete( + OrderEntity.tbName, + where: where, + ); + } else { + batch.update( + OrderEntity.tbName, + updateValues, + where: where, + ); + } + } + await batch.commit(); + return updateValues; + } + + Future removePendingOrders(Set productIds, + {TransactionMethod method = TransactionMethod.iap}) async { + final db = getDb(); + final batch = db.batch(); + for (var productId in productIds) { + final String where = + "${OrderEntity.dbSku} = '${productId.sku}' AND ${OrderEntity.dbMethod} = ${method.index} AND ${OrderEntity.dbState} = ${TransactionState.pending}"; + batch.delete( + OrderEntity.tbName, + where: where, + ); + } + batch.commit(); + return true; + } + + Future upsertOrder({required OrderEntity order}) { + return runInTransaction((txn) async { + final upsertMap = order.toMap(); + if (!order.isConsumable) { + final result = await txn.rawQuery( + "SELECT * FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbSku} = '${order.sku}'"); + if (result.isNotEmpty) { + upsertMap[OrderEntity.dbOrderId] = result.first[OrderEntity.dbOrderId] ?? order.orderId; + } + } + await txn.insert(OrderEntity.tbName, upsertMap, conflictAlgorithm: ConflictAlgorithm.replace); + return true; + }); + } + + Future replaceOrderBySku({required OrderEntity order}) { + return runInTransaction((txn) async { + final replaceMap = order.toMap(); + if (!order.isConsumable) { + await txn.rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbSku} = '${order.sku}'"); + } + await txn.insert(OrderEntity.tbName, replaceMap, + conflictAlgorithm: ConflictAlgorithm.replace); + return true; + }); + } + + Future completeOrder({required OrderEntity order}) async { + final db = getDb(); + if (order.isConsumable) { + await db.rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbOrderId} = '${order.orderId}'"); + } else { + await db.insert(OrderEntity.tbName, order.toMap(), + conflictAlgorithm: ConflictAlgorithm.replace); + } + return true; + } + + Future upsertOrders(List orders) { + final possessiveOrders = orders.where((order) => !order.isConsumable).toList(); + final skus = possessiveOrders.map((order) => "'${order.sku}'").toList(); + + return runInTransaction((txn) async { + await txn.rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbSku} IN (${skus.join(",")})"); + for (var upsertOrder in possessiveOrders) { + final upsertOrderJson = upsertOrder.toMap(); + await txn.insert(OrderEntity.tbName, upsertOrderJson, + conflictAlgorithm: ConflictAlgorithm.replace); + } + return true; + }); + } + + Future deleteOrder({required OrderEntity order}) async { + final result = await getDb().rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbOrderId} = '${order.orderId}'"); + return result > 0; + } + + Future deleteOrdersBySkus(Set skus) async { + final result = await getDb().rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbSku} IN (${skus.map((sku) => "'$sku'").join(",")})"); + return result > 0; + } + + Future deletePendingOrderBySku({required String sku}) async { + return runInTransaction((txn) async { + String where = + "${OrderEntity.dbSku} = '$sku' AND ${OrderEntity.dbState} = ${TransactionState.pending}"; + final result = await txn.rawQuery( + "SELECT * FROM ${OrderEntity.tbName} WHERE $where ORDER BY ${OrderEntity.dbTimestamp} DESC"); + if (result.isNotEmpty) { + final order = OrderEntity.fromMap(result[0]); + await txn.rawDelete( + "DELETE FROM ${OrderEntity.tbName} WHERE ${OrderEntity.dbOrderId} = '${order.orderId}'"); + return true; + } + return false; + }); + } + + Future clearTransaction() async { + final db = getDb(); + db.delete(OrderEntity.tbName); + } + + Future clearOrders({String? category, TransactionMethod? method}) async { + final db = getDb(); + final whereList = []; + if (category != null) { + whereList.add("${OrderEntity.dbCategory} = '$category'"); + } + if (method != null) { + whereList.add("${OrderEntity.dbMethod} = ${method.index}"); + } + final whereCondition = whereList.join(" AND "); + Log.d("clearOrders: $whereCondition"); + db.rawDelete("DELETE FROM ${OrderEntity.tbName} WHERE $whereCondition"); + return true; + } +} diff --git a/guru_app/lib/financial/data/db/order_database.g.dart b/guru_app/lib/financial/data/db/order_database.g.dart new file mode 100644 index 0000000..e11e9be --- /dev/null +++ b/guru_app/lib/financial/data/db/order_database.g.dart @@ -0,0 +1,55 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'order_database.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +AssetEntity _$AssetEntityFromJson(Map json) => AssetEntity(); + +Map _$AssetEntityToJson(AssetEntity instance) => + {}; + +OrderEntity _$OrderEntityFromJson(Map json) => OrderEntity( + orderId: json['oid'] as String, + sku: json['sku'] as String, + state: json['state'] as int, + attr: json['attr'] as int, + method: json['method'] as int, + currency: json['currency'] as String? ?? '', + cost: (json['cost'] as num?)?.toDouble() ?? 0.0, + timestamp: json['ts'] as int? ?? 0, + category: json['category'] as String? ?? '', + manifest: _$JsonConverterFromJson( + json['manifest'], manifestStringConvert.fromJson), + errorInfo: json['err_info'] as String? ?? '', + ); + +Map _$OrderEntityToJson(OrderEntity instance) => + { + 'oid': instance.orderId, + 'sku': instance.sku, + 'state': instance.state, + 'attr': instance.attr, + 'method': instance.method, + 'err_info': instance.errorInfo, + 'currency': instance.currency, + 'cost': instance.cost, + 'ts': instance.timestamp, + 'category': instance.category, + 'manifest': _$JsonConverterToJson( + instance.manifest, manifestStringConvert.toJson), + }; + +Value? _$JsonConverterFromJson( + Object? json, + Value? Function(Json json) fromJson, +) => + json == null ? null : fromJson(json as Json); + +Json? _$JsonConverterToJson( + Value? value, + Json? Function(Value value) toJson, +) => + value == null ? null : toJson(value); diff --git a/guru_app/lib/financial/data/models/orders/orders_model.dart b/guru_app/lib/financial/data/models/orders/orders_model.dart new file mode 100644 index 0000000..e01aa35 --- /dev/null +++ b/guru_app/lib/financial/data/models/orders/orders_model.dart @@ -0,0 +1,94 @@ +import 'dart:io'; + +import 'package:json_annotation/json_annotation.dart'; + +part 'orders_model.g.dart'; + +/// Created by Haoyi on 2022/7/27 + +@JsonSerializable() +class OrdersReport { + // android + @JsonKey(name: 'orderType', defaultValue: 0) + int? orderType; + @JsonKey(name: 'packageName') + String? packageName; + @JsonKey(name: 'productId') + String? productId; + @JsonKey(name: 'subscriptionId') + String? subscriptionId; + @JsonKey(name: 'token') + String? token; + + // ios + @JsonKey(name: 'bundleId') + String? bundleId; + @JsonKey(name: 'receipt') + String? receipt; + @JsonKey(name: 'sku') + String? sku; + @JsonKey(name: 'country') + String? countryCode; + + // general + @JsonKey(name: 'price') + String? price; + @JsonKey(name: 'currency') + String? currency; + + OrdersReport( + {this.orderType, + this.token, + this.packageName, + this.productId, + this.subscriptionId, + this.bundleId, + this.receipt, + this.price, + this.currency, + this.sku, + this.countryCode}); + + @override + String toString() { + final StringBuffer sb = StringBuffer(); + sb.writeln("[OrdersReport]"); + sb.writeln(" productId: $productId"); + sb.writeln(" price: $price"); + sb.writeln(" currency: $currency"); + if (Platform.isAndroid) { + sb.writeln(" orderType: $orderType"); + sb.writeln(" packageName: $packageName"); + sb.writeln(" subscriptionId: $subscriptionId"); + sb.writeln(" token: $token"); + } else if (Platform.isIOS) { + sb.writeln(" bundleId: $bundleId"); + sb.writeln(" receipt: $receipt"); + sb.writeln(" sku: $sku"); + sb.writeln(" countryCode: $countryCode"); + } + return sb + .toString(); //'OrdersReport{orderType: $orderType, packageName: $packageName, productId: $productId, subscriptionId: $subscriptionId, token: $token, bundleId: $bundleId, receipt: $receipt, price: $price, currency: $currency, introductoryPrice: $introductoryPrice}'; + } + + factory OrdersReport.fromJson(Map json) => _$OrdersReportFromJson(json); + + Map toJson() => _$OrdersReportToJson(this); +} + +@JsonSerializable() +class OrdersResponse { + @JsonKey(name: 'usdPrice', defaultValue: 0.0) + double usdPrice; + + OrdersResponse(this.usdPrice); + + factory OrdersResponse.fromJson(Map json) => _$OrdersResponseFromJson(json); + + Map toJson() => _$OrdersResponseToJson(this); + + @override + String toString() { + return 'OrdersResponse{usdPrice:$usdPrice}'; + } +} diff --git a/guru_app/lib/financial/data/models/orders/orders_model.g.dart b/guru_app/lib/financial/data/models/orders/orders_model.g.dart new file mode 100644 index 0000000..dd28d2f --- /dev/null +++ b/guru_app/lib/financial/data/models/orders/orders_model.g.dart @@ -0,0 +1,46 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'orders_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +OrdersReport _$OrdersReportFromJson(Map json) => OrdersReport( + orderType: json['orderType'] as int? ?? 0, + token: json['token'] as String?, + packageName: json['packageName'] as String?, + productId: json['productId'] as String?, + subscriptionId: json['subscriptionId'] as String?, + bundleId: json['bundleId'] as String?, + receipt: json['receipt'] as String?, + price: json['price'] as String?, + currency: json['currency'] as String?, + sku: json['sku'] as String?, + countryCode: json['country'] as String?, + ); + +Map _$OrdersReportToJson(OrdersReport instance) => + { + 'orderType': instance.orderType, + 'packageName': instance.packageName, + 'productId': instance.productId, + 'subscriptionId': instance.subscriptionId, + 'token': instance.token, + 'bundleId': instance.bundleId, + 'receipt': instance.receipt, + 'sku': instance.sku, + 'country': instance.countryCode, + 'price': instance.price, + 'currency': instance.currency, + }; + +OrdersResponse _$OrdersResponseFromJson(Map json) => + OrdersResponse( + (json['usdPrice'] as num?)?.toDouble() ?? 0.0, + ); + +Map _$OrdersResponseToJson(OrdersResponse instance) => + { + 'usdPrice': instance.usdPrice, + }; diff --git a/guru_app/lib/financial/financial_manager.dart b/guru_app/lib/financial/financial_manager.dart new file mode 100644 index 0000000..9c40cf0 --- /dev/null +++ b/guru_app/lib/financial/financial_manager.dart @@ -0,0 +1,59 @@ +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/iap/iap_manager.dart'; +import 'package:guru_app/financial/iap/iap_model.dart'; +import 'package:guru_app/financial/igc/igc_manager.dart'; +import 'package:guru_app/financial/reward/reward_manager.dart'; +import 'package:guru_utils/extensions/extensions.dart'; + +/// Created by Haoyi on 2021/7/2 + +class FinancialManager { + static final FinancialManager instance = FinancialManager._(); + + FinancialManager._(); + +// final RewardAssetService rewardService; + + Stream> get observableAssets => Rx.combineLatest3, + AssetsStore, AssetsStore, AssetsStore>( + IapManager.instance.observableAssetStore, + IgcManager.instance.observableAssetStore, + RewardManager.instance.observableAssetStore, (iapPurchased, gemAssets, rewarded) { + return _merge(iapPurchased: iapPurchased, gemAssets: gemAssets, rewarded: rewarded); + }); + + AssetsStore get currentAssets => _merge( + iapPurchased: IapManager.instance.purchasedStore, + gemAssets: IgcManager.instance.purchasedStore, + rewarded: RewardManager.instance.rewardedStore); + + static AssetsStore _merge( + {required AssetsStore iapPurchased, + required AssetsStore gemAssets, + required AssetsStore rewarded}) { + final result = AssetsStore(); + if (iapPurchased.isActive) { + iapPurchased.forEach((productId, possessions) { + result.addAsset(possessions); + }); + } + if (gemAssets.isActive) { + gemAssets.forEach((productId, possessions) { + result.addAsset(possessions); + }); + } + if (rewarded.isActive) { + rewarded.forEach((productId, possessions) { + result.addAsset(possessions); + }); + } + return result; + } + + void init() { + IapManager.instance.init(); + IgcManager.instance.init(); + RewardManager.instance.init(); + } +} diff --git a/guru_app/lib/financial/iap/iap_manager.dart b/guru_app/lib/financial/iap/iap_manager.dart new file mode 100644 index 0000000..475327d --- /dev/null +++ b/guru_app/lib/financial/iap/iap_manager.dart @@ -0,0 +1,1466 @@ +import 'dart:async'; +import 'dart:collection'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; + +import 'package:flutter/rendering.dart'; +import 'package:guru_analytics_flutter/events_constants.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/api/data/orders/orders_model.dart'; +import 'package:guru_app/api/guru_api.dart'; +import 'package:guru_app/database/guru_db.dart'; +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/iap/iap_model.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/manifest/manifest_manager.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_app/financial/product/product_store.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_app/property/settings/guru_settings.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/math/math_utils.dart'; +import 'package:guru_utils/tuple/tuple.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:in_app_purchase_android/billing_client_wrappers.dart'; +import 'package:in_app_purchase_android/in_app_purchase_android.dart'; +import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; +import 'package:in_app_purchase_storekit/store_kit_wrappers.dart'; + +/// Created by Haoyi on 2022/6/10 +/// + +enum IapCause { success, error, canceled } + +class IapManager { + static final IapManager _instance = IapManager._(); + + static IapManager get instance => _instance; + + static final ProductDetailsResponse _emptyResponse = + ProductDetailsResponse(productDetails: [], notFoundIDs: [], error: null); + + final BehaviorSubject> _productDetailsSubject = + BehaviorSubject.seeded({}); + final BehaviorSubject> _iapStoreSubject = + BehaviorSubject.seeded(AssetsStore.inactive()); + + final Map iapRequestMap = + HashMap(); + + Stream> get observableProductDetails => + _productDetailsSubject.stream; + + Stream> get observableAssetStore => + _iapStoreSubject.stream; + + Map get loadedProductDetails => + _productDetailsSubject.value; + + AssetsStore get purchasedStore => _iapStoreSubject.value; + + final BehaviorSubject availableSubject = BehaviorSubject.seeded(false); + + Stream get observableAvailable => availableSubject.stream; + + bool get iapAvailable => availableSubject.value; + + final InAppPurchase _inAppPurchase; + + StreamSubscription? subscription; + + Timer? restorePointsTimer; + + IapManager._() : _inAppPurchase = InAppPurchase.instance; + + IapCause latestIapCause = IapCause.success; + + bool _restorePurchase = false; + + final iapRevenueAppEventOptions = AppEventOptions( + capabilities: const AppEventCapabilities( + AppEventCapabilities.firebase | AppEventCapabilities.guru), + firebaseParamsConvertor: _iapRevenueToValue, + guruParamsConvertor: _iapRevenueToValue); + + static Map _iapRevenueToValue(Map params) { + final result = Map.of(params); + final revenue = result.remove("revenue"); + if (revenue != null) { + result["value"] = revenue; + } + return result; + } + + void init() async { + final iapCount = await AppProperty.getInstance().getIapCount(); + if (iapCount > 0) { + GuruAnalytics.instance + .setUserProperty("purchase_count", iapCount.toString()); + GuruAnalytics.instance.setUserProperty("is_iap_user", "true"); + } else { + GuruAnalytics.instance.setUserProperty("is_iap_user", "false"); + } + try { + await reloadOrders(); + } catch (error, stacktrace) { + Log.w("reloadOrders error! $error", + stackTrace: stacktrace, syncCrashlytics: true, syncFirebase: true); + } + if (subscription == null) { + final Stream> purchaseUpdated = + _inAppPurchase.purchaseStream; + subscription = purchaseUpdated.listen( + (List purchaseDetailsList) { + _listenToPurchaseUpdated(purchaseDetailsList); + }, + onDone: () {}, + onError: (Object error) { + // handle error here. + Log.e("iap error:$error"); + }); + Log.i("iap service initialize completed"); + } + Log.i("iap service initialized"); + + _checkAndLoad(); + + try { + await AccountDataStore.instance.observableSaasUser + .firstWhere((saasUser) => saasUser?.isValid == true); + Future.delayed(const Duration(seconds: 5), () { + reportFailedOrders(); + }); + } catch (error, stacktrace) { + Log.w("wait account error! $error", stackTrace: stacktrace); + } finally {} + } + + Future reloadOrders() async { + final transactions = await GuruDB.instance.selectOrders( + method: TransactionMethod.iap, + attrs: [ + TransactionAttributes.asset, + TransactionAttributes.subscriptions + ]); + final newAssetStore = AssetsStore(); + Log.d("reloadOrders ${transactions.length}"); + for (var transaction in transactions) { + final productId = transaction.productId; + Log.d(" ==> reloadOrder:${transaction.sku} $productId"); + newAssetStore.addAsset(Asset(productId, transaction)); + } + _iapStoreSubject.addEx(newAssetStore); + } + + void _checkAndLoad() async { + var available = false; + var retry = 0; + Log.i("_checkAndLoad"); + do { + final seconds = min(MathUtils.fibonacci(retry, offset: 2), 900); + await Future.delayed(Duration(seconds: seconds)); + available = + await _inAppPurchase.isAvailable().catchError((error, stacktrace) { + Log.w("isAvailable error:$error", stackTrace: stacktrace); + return false; + }); + Log.d("_checkAndLoad:$retry available:$available"); + retry++; + } while (!available); + availableSubject.addEx(true); + try { + await refreshProducts(); + if (GuruApp.instance.appSpec.deployment.autoRestoreIap || + GuruApp.instance.appSpec.productProfile.hasSubs()) { + await restorePurchases(); + } + } catch (error, stacktrace) { + Log.w("restorePurchases error:$error", + stackTrace: stacktrace, syncCrashlytics: true, syncFirebase: true); + } + } + + Future isAvailable() async { + return await _inAppPurchase.isAvailable(); + } + + void _processIapError() async { + latestIapCause = IapCause.error; + for (var iapRequest in iapRequestMap.values) { + iapRequest.response(false); + final iapErrorMsg = "_processIapError:${iapRequest.productId}"; + Log.w(iapErrorMsg, + error: PurchaseError(iapErrorMsg), + syncFirebase: true, + syncCrashlytics: true); + try { + await GuruDB.instance + .upsertOrder(order: iapRequest.order.error(iapErrorMsg)); + } catch (error, stacktrace) { + Log.w("_processIapError upsert error! $error", syncFirebase: true); + } + } + iapRequestMap.clear(); + } + + void _processIapCancel() async { + latestIapCause = IapCause.canceled; + Log.d("_processIapCancel"); + for (var iapRequest in iapRequestMap.values) { + final order = iapRequest.order; + iapRequest.response(false); + try { + await GuruDB.instance.deleteOrder(order: order); + } catch (error, stacktrace) { + Log.w("_processIapCancel deleteOrder error! $error", + syncFirebase: true); + } + } + iapRequestMap.clear(); + // final iapErrorMsg = "_processIapCancel:$productId"; + // Log.w(iapErrorMsg, + // error: PurchaseError(iapErrorMsg), syncFirebase: true, syncCrashlytics: true); + } + + // void _listenToPurchased() async { + // InAppPurchase.instance.purchaseStream.listen((purchaseDetailsList) { + // if (purchaseDetailsList.isEmpty) { + // return; + // } + // final subscriptionDetails = {}; + // for (var details in purchaseDetailsList) { + // Log.d(" details:${details.productID} ${details.status}"); + // final productId = + // GuruApp.instance.findProductId(sku: details.productID) ?? ProductId.invalid; + // if (productId.isSubscription) { + // subscriptionDetails[productId] = details; + // } + // } + // if (Platform.isIOS) { + // checkSubscriptionForIos(subscriptionDetails); + // } + // }); + // } + + String dumpProductAndPurchased( + ProductDetails details, PurchaseDetails purchaseDetails) { + final StringBuffer sb = StringBuffer(); + + if (Platform.isAndroid) { + try { + GooglePlayPurchaseDetails googlePlayDetails = + purchaseDetails as GooglePlayPurchaseDetails; + GooglePlayProductDetails googlePlayProduct = + details as GooglePlayProductDetails; + Log.d( + "Android Product/Purchase ${buildGooglePlayDetailsString(googlePlayProduct, googlePlayDetails)}"); + } catch (error, stacktrace) {} + } else if (Platform.isIOS) { + AppStorePurchaseDetails appleDetails = + purchaseDetails as AppStorePurchaseDetails; + AppStoreProductDetails appleProduct = details as AppStoreProductDetails; + sb.writeln("#### purchase ####"); + sb.writeln("productID: ${appleDetails.productID}"); + sb.writeln("purchaseID: ${appleDetails.purchaseID}"); + sb.writeln("transactionDate: ${appleDetails.transactionDate}"); + sb.writeln("verificationData: ${appleDetails.verificationData}"); + sb.writeln("status: ${appleDetails.status}"); + sb.writeln("skPaymentTransaction:"); + sb.writeln( + " =>originalTransaction:${appleDetails.skPaymentTransaction.originalTransaction}"); + sb.writeln( + " =>${appleDetails.skPaymentTransaction.originalTransaction?.payment}"); + sb.writeln(" =>${appleDetails.skPaymentTransaction.transactionState}:"); + sb.writeln( + " =>${appleDetails.skPaymentTransaction.transactionIdentifier}:"); + sb.writeln("\n#### product ####"); + sb.writeln("currencyCode: ${appleProduct.currencyCode}"); + sb.writeln("rawPrice: ${appleProduct.rawPrice}"); + sb.writeln("currencyCode: ${appleProduct.currencyCode}"); + sb.writeln("currencyCode skProduct"); + sb.writeln( + " =>localizedTitle: ${appleProduct.skProduct.localizedTitle}"); + sb.writeln( + " =>localizedDescription: ${appleProduct.skProduct.localizedDescription}"); + sb.writeln(" =>priceLocale: ${appleProduct.skProduct.priceLocale}"); + sb.writeln( + " =>productIdentifier: ${appleProduct.skProduct.productIdentifier}"); + sb.writeln( + " =>subscriptionGroupIdentifier: ${appleProduct.skProduct.subscriptionGroupIdentifier}"); + sb.writeln(" =>appleProduct.skProduct.priceLocale"); + sb.writeln(" ->{appleProduct.skProduct.priceLocale}"); + + Log.d("IOS Product/Purchase ${sb.toString()}"); + } + return sb.toString(); + } + + static final monthRenewalDurations = [ + 3 * DateTimeUtils.minuteInMillis, + 5 * DateTimeUtils.minuteInMillis, + 15 * DateTimeUtils.minuteInMillis, + 30 * DateTimeUtils.minuteInMillis, + DateTimeUtils.hourInMillis + ]; + + static final weekRenewalDurations = [ + 3 * DateTimeUtils.minuteInMillis, + 3 * DateTimeUtils.minuteInMillis, + 5 * DateTimeUtils.minuteInMillis, + 10 * DateTimeUtils.minuteInMillis, + 15 * DateTimeUtils.minuteInMillis + ]; + + int getIOSPeriodInterval(int numberOfUnits, SKSubscriptionPeriodUnit unit) { + if (GuruSettings.instance.debugMode.get()) { + final renewalSpeed = GuruApp + .instance.appSpec.deployment.iosSandboxSubsRenewalSpeed + .clamp(1, 5); + switch (unit) { + case SKSubscriptionPeriodUnit.day: + return numberOfUnits * weekRenewalDurations[renewalSpeed - 1] ~/ 7; + case SKSubscriptionPeriodUnit.week: + return numberOfUnits * weekRenewalDurations[renewalSpeed - 1]; + case SKSubscriptionPeriodUnit.month: + return numberOfUnits * monthRenewalDurations[renewalSpeed - 1]; + case SKSubscriptionPeriodUnit.year: + return numberOfUnits * monthRenewalDurations[renewalSpeed - 1] * 12; + } + } else { + switch (unit) { + case SKSubscriptionPeriodUnit.day: + return numberOfUnits * DateTimeUtils.dayInMillis; + case SKSubscriptionPeriodUnit.week: + return numberOfUnits * DateTimeUtils.weekInMillis; + case SKSubscriptionPeriodUnit.month: + return numberOfUnits * DateTimeUtils.dayInMillis * 31; + case SKSubscriptionPeriodUnit.year: + return numberOfUnits * DateTimeUtils.dayInMillis * 366; + } + } + } + + Future processRestoredSubscription( + List subscriptionPurchased) async { + List purchasedDetails = subscriptionPurchased; + if (Platform.isIOS) { + purchasedDetails = buildLatestPurchasedPlanForIos(subscriptionPurchased); + } + final newPurchasedStore = purchasedStore.clone(); + final expiredSkus = {}; + // 由于Android的订阅项目在失效后,这里将不会返回,因此需要判断这里的newPurchasedStore是否存在对应的purchased + // 如果存在将会在后面进行处理,如果不存在。这里将会从purchasedStore中删除 + if (Platform.isAndroid) { + final purchasedSkus = purchasedDetails.map((e) => e.productID).toSet(); + newPurchasedStore.removeWhere((productId, asset) { + final expired = + productId.isSubscription && !purchasedSkus.contains(productId.sku); + Log.i("remove expired subscription[$productId] expired:$expired"); + if (expired) { + expiredSkus.add(asset.productId.sku); + } + return expired; + }); + } + + for (var purchased in purchasedDetails) { + final productId = + GuruApp.instance.findProductId(sku: purchased.productID); + if (productId == null) { + Log.w("productId is null! ${purchased.productID}"); + continue; + } + final productDetails = loadedProductDetails[productId]; + if (productDetails == null) { + Log.w("product is null! ${purchased.productID}"); + continue; + } + purchased.transactionDate; + bool validPurchase = false; + if (Platform.isAndroid) { + validPurchase = true; + } else if (Platform.isIOS) { + final appleProduct = productDetails as AppStoreProductDetails; + final period = appleProduct.skProduct.subscriptionPeriod; + if (period != null) { + final numberOfUnits = period.numberOfUnits; + final unit = period.unit; + final int validInterval = getIOSPeriodInterval(numberOfUnits, unit); + final transactionTs = + int.tryParse(purchased.transactionDate ?? "") ?? 0; + final now = DateTimeUtils.currentTimeInMillis(); + validPurchase = transactionTs + validInterval < now; + Log.d( + "productID: ${purchased.productID}) purchaseID: ${purchased.purchaseID}[$numberOfUnits][$unit] $transactionTs + $validInterval < $now ($validPurchase)", + tag: PropertyTags.iap); + } + } + if (validPurchase) { + Log.d( + "[Restored Subscription] productID: ${purchased.productID}) purchaseID: ${purchased.purchaseID}", + tag: PropertyTags.iap); + final asset = newPurchasedStore.getAsset(productId); + late OrderEntity newOrder; + if (asset == null) { + final product = await _createProduct( + productId.createIntent(scene: "restore"), productDetails); + newOrder = product.createOrder().success(); + } else { + newOrder = asset.order.success(); + } + try { + await GuruDB.instance.replaceOrderBySku(order: newOrder); + } catch (error, stacktrace) { + Log.w("Failed to upsert order: $error $stacktrace", + tag: PropertyTags.iap); + } + final newAsset = Asset(productId, newOrder); + newPurchasedStore.addAsset(newAsset); + } else { + expiredSkus.add(productId.sku); + Log.d( + "Subscription is expired ${purchased.productID}) ${purchased.purchaseID} ${purchased.transactionDate}"); + // 这里暂不清newPurchasedStore,下次重进后该订阅信息会失效 + } + } + + if (expiredSkus.isNotEmpty) { + Log.i("expired orders:${expiredSkus.length}}"); + try { + await GuruDB.instance.deleteOrdersBySkus(expiredSkus); + } catch (error, stacktrace) { + Log.w("Failed to upsert order: $error $stacktrace", + tag: PropertyTags.iap); + } + } + _iapStoreSubject.addEx(newPurchasedStore); + Log.d( + "[RestoredSubscription] update purchasedStore ${newPurchasedStore.data.length}"); + } + + List buildLatestPurchasedPlanForIos( + List purchaseDetails) { + if (purchaseDetails.isEmpty) { + return []; + } + final rawTransactionIds = purchaseDetails + .map((details) => (details as AppStorePurchaseDetails) + .skPaymentTransaction + .originalTransaction + ?.transactionIdentifier) + .where((element) => element != null) + .cast() + .toSet(); + Log.d("rawTransactionIds:$rawTransactionIds"); + final sortedPurchaseDetails = purchaseDetails.toList(); + sortedPurchaseDetails.sort((a, b) => + (int.tryParse(b.transactionDate ?? '') ?? 0) + .compareTo(int.tryParse(a.transactionDate ?? '') ?? 0)); + sortedPurchaseDetails.retainWhere((details) { + var detail = details as AppStorePurchaseDetails; + Log.d( + "checkSubscriptionForIos ${detail.skPaymentTransaction.originalTransaction?.transactionIdentifier} ${detail.transactionDate} ${detail.skPaymentTransaction.transactionTimeStamp}"); + return rawTransactionIds.remove(detail + .skPaymentTransaction.originalTransaction?.transactionIdentifier); + }); + + return sortedPurchaseDetails; + } + + void checkSubscriptionForIos(List purchaseDetails) { + if (purchaseDetails.isEmpty) { + return; + } + final rawTransactionIds = purchaseDetails + .map((details) => (details as AppStorePurchaseDetails) + .skPaymentTransaction + .originalTransaction + ?.transactionIdentifier) + .where((element) => element != null) + .cast() + .toSet(); + Log.d("rawTransactionIds:$rawTransactionIds"); + final sortedPurchaseDetails = purchaseDetails.toList(); + sortedPurchaseDetails.sort((a, b) => + (int.tryParse(b.transactionDate ?? '') ?? 0) + .compareTo(int.tryParse(a.transactionDate ?? '') ?? 0)); + sortedPurchaseDetails.retainWhere((details) { + var detail = details as AppStorePurchaseDetails; + Log.d( + "checkSubscriptionForIos ${detail.skPaymentTransaction.originalTransaction?.transactionIdentifier} ${detail.transactionDate} ${detail.skPaymentTransaction.transactionTimeStamp}"); + return rawTransactionIds.remove(detail + .skPaymentTransaction.originalTransaction?.transactionIdentifier); + }); + + for (var details in sortedPurchaseDetails) { + Log.d( + "checkSubscriptionForIos ${details.productID} ${details.status} ${details.transactionDate}"); + final productId = GuruApp.instance.findProductId(sku: details.productID); + final productDetails = loadedProductDetails[productId]; + if (productDetails != null) { + dumpProductAndPurchased(productDetails, details); + } + } + } + + void _listenToPurchaseUpdated( + List purchaseDetailsList) async { + final List> restoredIapPurchases = []; + final List> pendingCompletePurchase = []; + final List subscriptionPurchases = []; + bool existsRestored = false; + bool needRestore = false; + Log.d("_listenToPurchaseUpdated ${purchaseDetailsList.length}"); + if (purchaseDetailsList.isEmpty) { + if (_restorePurchase) { + try { + await processRestoredSubscription(subscriptionPurchases); + } catch (error, stacktrace) { + Log.w( + "purchaseDetailsList is EMPTY! processRestoredSubscription error! $error $stacktrace", + syncFirebase: true, + syncCrashlytics: true); + } + _restorePurchase = false; + } + return; + } + for (var details in purchaseDetailsList) { + final productId = + GuruApp.instance.findProductId(sku: details.productID) ?? + ProductId.invalid; + Log.d( + "[details]: $productId [${details.productID}] ${details.purchaseID} ${details.status} ${details.pendingCompletePurchase}"); + GuruAnalytics.instance.logGuruEvent('dev_iap_update', { + "sku": details.productID, + "orderId": details.purchaseID, + "status": "${details.status.index}" + }); + switch (details.status) { + case PurchaseStatus.purchased: + if (details.productID == "") { + if (GuruApp.instance.productProfile.pointsIapIds.isNotEmpty) { + Log.w( + "details.productID is empty And Exists PointsIap! ${details.purchaseID}! need restore"); + needRestore = true; + } else { + Log.w("details.productID is empty ${details.purchaseID}! ignore!!"); + } + continue; + } + + final productDetails = loadedProductDetails[productId]; + if (productDetails != null) { + await _completePurchase(productId, productDetails, details); + } + + Log.d("completePurchase ${details.productID} ${details.purchaseID}"); + break; + case PurchaseStatus.restored: + _restorePurchase = false; + existsRestored = true; + if (productId.isAsset) { + restoredIapPurchases.add(Tuple2(productId, details)); + Log.d("restore possessive iap:$productId"); + } else if (productId.isSubscription) { + Log.w("restore subscription product!", syncFirebase: true); + subscriptionPurchases.add(details); + } + // 如果是未完成的商品或是恢复出了消耗品,都需要手动完成 + if (Platform.isAndroid) { + final originPurchaseState = (details as GooglePlayPurchaseDetails) + .billingClientPurchase + .purchaseState; + Log.d( + "restore android ${details.pendingCompletePurchase} $productId $originPurchaseState"); + if (originPurchaseState == PurchaseStateWrapper.purchased) { + if (productId.isConsumable || + (details.pendingCompletePurchase && productId.isAsset)) { + Log.w("restore consumable product!", syncFirebase: true); + pendingCompletePurchase.add(Tuple2(productId, details)); + } + } + } else { + if (details.pendingCompletePurchase) { + Log.d("restore ios pendingCompletePurchase: $productId"); + await _inAppPurchase.completePurchase(details); + } + } + break; + case PurchaseStatus.error: + _processIapError(); + if (details.pendingCompletePurchase) { + await _inAppPurchase.completePurchase(details); + } + break; + case PurchaseStatus.canceled: + _processIapCancel(); + if (details.pendingCompletePurchase) { + await _inAppPurchase.completePurchase(details); + } + break; + default: + break; + } + Log.d( + "_listenToPurchaseUpdated2:$productId [${details.productID}] ${details.purchaseID} ${details.status} ${details.pendingCompletePurchase}"); + } + if (existsRestored) { + if (pendingCompletePurchase.isNotEmpty) { + await completeAllPurchases(pendingCompletePurchase); + Log.d("manual complete/consume all purchases!", + syncFirebase: true, syncCrashlytics: true); + } + + if (restoredIapPurchases.isNotEmpty) { + try { + await processRestoredPurchases(restoredIapPurchases); + } catch (error, stacktrace) { + Log.w("processRestoredPurchases error! $error $stacktrace", + syncFirebase: true, syncCrashlytics: true); + } + } + try { + await processRestoredSubscription(subscriptionPurchases); + } catch (error, stacktrace) { + Log.w("processRestoredSubscription error! $error $stacktrace", + syncFirebase: true, syncCrashlytics: true); + } + } + if (needRestore) { + restorePointsTimer?.cancel(); + restorePointsTimer = Timer(const Duration(seconds: 1), () { + restorePurchases(); + }); + } + } + + Future processRestoredPurchases( + List> restoredIapPurchases) async { + final newPurchased = purchasedStore.clone(); + final currentLoadedProductDetails = loadedProductDetails; + final upsertOrders = []; + for (var iapPurchased in restoredIapPurchases) { + final productId = iapPurchased.item1; + final asset = newPurchased.getAsset(iapPurchased.item1); + final productDetails = currentLoadedProductDetails[productId]; + final order = asset?.order; + // 证明是已经购买过的 + if (order != null) { + // 如果没有购买成功,那么就重新创建一个 + if (!order.isSuccess) { + final newOrder = order.success(); + upsertOrders.add(newOrder); + } + } else if (productDetails != null) { + final product = await _createProduct( + productId.createIntent(scene: "restore"), productDetails); + final newOrder = product.createOrder().success(); + upsertOrders.add(newOrder); + } + } + if (upsertOrders.isNotEmpty) { + final List updatedOrder = []; + try { + await GuruDB.instance.upsertOrders(upsertOrders); + updatedOrder.addAll(upsertOrders); + } catch (error, stacktrace) { + Log.w("upsertOrders error:$error $stacktrace", + syncCrashlytics: true, syncFirebase: true); + for (var order in upsertOrders) { + try { + await GuruDB.instance.upsertOrder(order: order); + updatedOrder.add(order); + } catch (error1, stacktrace1) { + Log.w("upsertOrder(${order.sku}) error:$error1 $stacktrace1", + syncFirebase: true); + } + } + } + final assets = + updatedOrder.map((order) => Asset(order.productId, order)).toList(); + newPurchased.addAllAssets(assets); + } + _iapStoreSubject.addEx(newPurchased); + Log.d("[RestoredPurchases] update purchasedStore ${upsertOrders.length}"); + } + + Future reportFailedOrders() async { + final failedIapOrders = + await AppProperty.getInstance().loadAllFailedIapOrders(); + failedIapOrders.forEach((key, value) async { + try { + final order = OrdersReport.fromJson(json.decode(value)); + final result = await GuruApi.instance.reportOrders(order); + if (result.usdPrice > 0) { + logRevenue( + result.usdPrice, order.productId ?? order.subscriptionId); + } + AppProperty.getInstance().removeReportSuccessOrder(key); + } catch (error, stacktrace) {} + }); + Log.i("reportFailedOrders success!"); + } + + String buildGooglePlayDetailsString( + GooglePlayProductDetails googlePlayProduct, + GooglePlayPurchaseDetails googlePlayDetails) { + final StringBuffer sb = StringBuffer(); + sb.writeln("#### purchase ####"); + + sb.writeln("productID: ${googlePlayDetails.productID}"); + sb.writeln("purchaseID: ${googlePlayDetails.purchaseID}"); + sb.writeln("transactionDate: ${googlePlayDetails.transactionDate}"); + + sb.writeln("status: ${googlePlayDetails.status}"); + sb.writeln("verificationData:"); + sb.writeln( + " => localVerificationData: ${googlePlayDetails.verificationData.localVerificationData}"); + sb.writeln( + " => serverVerificationData: ${googlePlayDetails.verificationData.localVerificationData}"); + sb.writeln(" => source: ${googlePlayDetails.verificationData.source}"); + sb.writeln("\n#### product ####"); + sb.writeln("price: ${googlePlayProduct.price}"); + sb.writeln("rawPrice: ${googlePlayProduct.rawPrice}"); + sb.writeln("currencyCode: ${googlePlayProduct.currencyCode}"); + sb.writeln("currencySymbol: ${googlePlayProduct.currencySymbol}"); + sb.writeln("productDetails:"); + + final productDetails = googlePlayProduct.productDetails; + sb.writeln(" => description: ${productDetails.name}"); + sb.writeln(" => freeTrialPeriod: ${productDetails.title}"); + sb.writeln(" => description: ${productDetails.description}"); + sb.writeln(" => freeTrialPeriod: ${productDetails.productType}"); + + final oneTimeDetails = productDetails.oneTimePurchaseOfferDetails; + if (oneTimeDetails != null) { + sb.writeln(" => oneTimeDetails:"); + sb.writeln(" - formattedPrice: ${oneTimeDetails.formattedPrice}"); + sb.writeln( + " - priceAmountMicros: ${oneTimeDetails.priceAmountMicros}"); + sb.writeln( + " - priceCurrencyCode: ${oneTimeDetails.priceCurrencyCode}"); + } + + final subscriptionOfferDetails = productDetails.subscriptionOfferDetails; + if (subscriptionOfferDetails != null && + subscriptionOfferDetails.isNotEmpty) { + for (var offer in subscriptionOfferDetails) { + sb.writeln(" => sub offer: ${offer.offerId}"); + sb.writeln(" - basePlanId: ${offer.basePlanId}"); + sb.writeln(" - offerTag: ${offer.offerTags}"); + sb.writeln(" - offerIdToken: ${offer.offerIdToken}"); + final pricingPhases = offer.pricingPhases; + for (var idx = 0; idx < pricingPhases.length; ++idx) { + final phase = pricingPhases[idx]; + sb.writeln(" - pricingPhase[$idx]:"); + sb.writeln(" * billingCycleCount: ${phase.billingCycleCount}"); + sb.writeln(" * billingPeriod: ${phase.billingPeriod}"); + sb.writeln(" * formattedPrice: ${phase.formattedPrice}"); + sb.writeln(" * priceAmountMicros: ${phase.priceAmountMicros}"); + sb.writeln(" * priceCurrencyCode: ${phase.priceCurrencyCode}"); + sb.writeln(" * recurrenceMode: ${phase.recurrenceMode}"); + } + } + } + + return sb.toString(); + } + + Future reportOrders(ProductId productId, ProductDetails details, + PurchaseDetails purchaseDetails, OrderEntity? order) async { + final OrdersReport ordersReport = OrdersReport(); + + if (Platform.isAndroid) { + ordersReport.token = + purchaseDetails.verificationData.serverVerificationData; + ordersReport.packageName = GuruApp.instance.details.packageName; + final manifest = order?.manifest; + final basePlanId = manifest?.basePlanId; + final offerId = manifest?.offerId; + if (productId.isSubscription && basePlanId != null && offerId != null) { + ordersReport.basePlanId = basePlanId; + ordersReport.offerId = offerId; + } + try { + GooglePlayPurchaseDetails googlePlayDetails = + purchaseDetails as GooglePlayPurchaseDetails; + GooglePlayProductDetails googlePlayProduct = + details as GooglePlayProductDetails; + Log.d( + "Android Product/Purchase ${buildGooglePlayDetailsString(googlePlayProduct, googlePlayDetails)}"); + } catch (error, stacktrace) {} + } else if (Platform.isIOS) { + AppStorePurchaseDetails appleDetails = + purchaseDetails as AppStorePurchaseDetails; + AppStoreProductDetails appleProduct = details as AppStoreProductDetails; + final StringBuffer sb = StringBuffer(); + sb.writeln("#### purchase ####"); + sb.writeln("productID: ${appleDetails.productID}"); + sb.writeln("purchaseID: ${appleDetails.purchaseID}"); + sb.writeln("transactionDate: ${appleDetails.transactionDate}"); + sb.writeln("verificationData: ${appleDetails.verificationData}"); + sb.writeln("status: ${appleDetails.status}"); + sb.writeln("skPaymentTransaction:"); + sb.writeln( + " =>originalTransaction:${appleDetails.skPaymentTransaction.originalTransaction}"); + sb.writeln( + " =>${appleDetails.skPaymentTransaction.originalTransaction?.payment}"); + sb.writeln(" =>${appleDetails.skPaymentTransaction.transactionState}:"); + sb.writeln( + " =>${appleDetails.skPaymentTransaction.transactionIdentifier}:"); + sb.writeln("\n#### product ####"); + sb.writeln("currencyCode: ${appleProduct.currencyCode}"); + sb.writeln("rawPrice: ${appleProduct.rawPrice}"); + sb.writeln("currencyCode: ${appleProduct.currencyCode}"); + sb.writeln("currencyCode skProduct"); + sb.writeln( + " =>localizedTitle: ${appleProduct.skProduct.localizedTitle}"); + sb.writeln( + " =>localizedDescription: ${appleProduct.skProduct.localizedDescription}"); + sb.writeln(" =>priceLocale: ${appleProduct.skProduct.priceLocale}"); + sb.writeln( + " =>productIdentifier: ${appleProduct.skProduct.productIdentifier}"); + sb.writeln( + " =>subscriptionGroupIdentifier: ${appleProduct.skProduct.subscriptionGroupIdentifier}"); + sb.writeln(" =>appleProduct.skProduct.priceLocale"); + sb.writeln(" ->{appleProduct.skProduct.priceLocale}"); + + ordersReport.bundleId = GuruApp.instance.appSpec.details.bundleId; + ordersReport.receipt = + purchaseDetails.verificationData.serverVerificationData; + ordersReport.sku = appleDetails.productID; + ordersReport.countryCode = appleProduct.skProduct.priceLocale.countryCode; + Log.d("IOS Product/Purchase ${sb.toString()}"); + } + + if (productId.isSubscription) { + ordersReport.orderType = OrderType.subs; + ordersReport.subscriptionId = details.id; + } else { + ordersReport.orderType = OrderType.inapp; + ordersReport.productId = details.id; + } + ordersReport.price = details.rawPrice.toString(); + ordersReport.currency = details.currencyCode; + + ordersReport.orderUserInfo = + OrderUserInfo(GuruSettings.instance.bestLevel.get().toString()); + ordersReport.userIdentification = GuruAnalytics.instance.userIdentification; + + Log.d("orderReport:$ordersReport", tag: "Iap"); + try { + final result = await GuruApi.instance.reportOrders(ordersReport); + if ((result.usdPrice > 0) || + (result.usdPrice == 0 && result.isTestOrder)) { + logRevenue(result.usdPrice, purchaseDetails.productID); + Log.i("reportOrders success! $result"); + return; + } + Log.i("ignoreInvalidResult $result", tag: "Iap"); + } catch (error, stacktrace) { + Log.i("reportOrders error!", error: error, stackTrace: stacktrace); + } + AppProperty.getInstance().saveFailedIapOrders(ordersReport); + } + + Future logRevenue(double usdPrice, String? sku) async { + if (sku == null || sku.isEmpty) { + return; + } + final platform = Platform.isIOS ? "appstore" : "google_play"; + GuruAnalytics.instance.logAdRevenue(usdPrice, platform, "USD"); + final productId = + GuruApp.instance.findProductId(sku: sku) ?? ProductId.invalid; + GuruAnalytics.instance.logPurchase(usdPrice, + currency: 'USD', contentId: sku, adPlatform: platform); + if (productId.isSubscription) { + GuruAnalytics.instance.logEvent( + "sub_purchase", + { + "platform": platform, + "currency": "USD", + "revenue": usdPrice, + "product_id": sku, + }, + options: iapRevenueAppEventOptions); + } else { + GuruAnalytics.instance.logEvent( + "iap_purchase", + { + "platform": platform, + "currency": "USD", + "revenue": usdPrice, + "product_id": sku, + }, + options: iapRevenueAppEventOptions); + } + GuruAnalytics.instance.logGuruEvent("dev_iap_action", + {"item_category": "reported", "item_name": sku, "result": "true"}); + } + + Future _deliverManifest(ProductId productId, Manifest manifest) async { + bool result = false; + String cause = ''; + try { + result = await ManifestManager.instance + .deliver(manifest, TransactionMethod.iap) + .catchError((error) { + Log.w("applyManifest error:$error", + syncCrashlytics: true, syncFirebase: true); + }); + } catch (error, stacktrace) { + cause = error.toString(); + } + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "delivered", + "item_name": productId.sku, + "mc": manifest.category, + "result": result ? "true" : "false", + 'cause': cause, + }); + } + + Future _completeOrder(OrderEntity order) async { + bool result = false; + try { + final completedOrder = order.success(); + result = await GuruDB.instance.completeOrder(order: completedOrder); + } catch (error, stacktrace) { + Log.w("_completePurchase error.$error", + stackTrace: stacktrace, syncFirebase: true, syncCrashlytics: true); + } + + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "complete", + "item_name": order.productId.sku, + "mc": order.manifest?.category ?? "unknown", + "result": result ? "true" : "false" + }); + final manifest = order.manifest; + if (manifest != null) { + await _deliverManifest(order.productId, manifest); + } + if (order.isAsset || order.isSubscription) { + final changedPurchasedStore = purchasedStore.clone(); + changedPurchasedStore.addAsset(Asset(order.productId, order)); + _iapStoreSubject.addEx(changedPurchasedStore); + } + return true; + } + + Future completePoints( + ProductId productId, ProductDetails productDetails, PurchaseDetails details) async { + final count = await AppProperty.getInstance().increaseAndGetIapCount(); + GuruAnalytics.instance.setUserProperty("purchase_count", count.toString()); + try { + final cost = productDetails.rawPrice; + if (cost > 0) { + final double price = cost; + if (count == 1) { + GuruAnalytics.instance.logEventEx("first_iap", + itemName: productId.sku, + value: price, + parameters: {"currency": productDetails.currencyCode}); + GuruAnalytics.instance.setUserProperty("is_iap_user", "true"); + } + GuruAnalytics.instance.logEventEx(productId.iapEventName, + itemName: productId.sku, + value: price, + parameters: {"currency": productDetails.currencyCode}); + } + } catch (error, stacktrace) { + GuruAnalytics.instance.logException(error, stacktrace: stacktrace); + } + final intent = productId.createIntent(scene: "outside_points"); + final manifest = await ManifestManager.instance.createManifest(intent); + await _deliverManifest(productId, manifest); + // 这里不需要传 order,因为 points 商品是非订阅商品 + await reportOrders(productId, productDetails, details, null); + } + + Future _completePurchase(ProductId definedProductId, + ProductDetails originProductDetails, PurchaseDetails details) async { + ProductId productId = definedProductId; + await _inAppPurchase.completePurchase(details); + final count = await AppProperty.getInstance().increaseAndGetIapCount(); + GuruAnalytics.instance.setUserProperty("purchase_count", count.toString()); + Log.d("_completePurchase $productId ${details.pendingCompletePurchase}", + tag: "Iap"); + OrderEntity? resultOrder; + + IapRequest? iapRequest = iapRequestMap.remove(productId); + if (iapRequest == null) { + final offerProductIds = GuruApp.instance.offerProductIds(productId); + for (var offerProductId in offerProductIds) { + iapRequest = iapRequestMap.remove(offerProductId); + if (iapRequest != null) { + productId = offerProductId; + break; + } + } + } + if (iapRequest != null) { + resultOrder = iapRequest.order; + final result = await _completeOrder(iapRequest.order); + iapRequest.response(result); + } else { + Log.d("Not found iapRequest for $productId"); + final orders = await GuruDB.instance.getPendingOrders(productId); + if (orders.isNotEmpty) { + orders.sort((a, b) => b.timestamp.compareTo(a.timestamp)); + await _completeOrder(orders.first); + resultOrder = orders.first; + } + } + + final productDetails = iapRequest?.product.offerDetails ?? + iapRequest?.product.details ?? + loadedProductDetails[productId] ?? + originProductDetails; + + Log.d( + "productId:$productId productDetails:${productDetails.rawPrice} originProductDetails:${originProductDetails.rawPrice}"); + + try { + // final item = pendingTransaction.product.item; + final cost = productDetails.rawPrice; + if (cost > 0) { + final double price = cost; + if (count == 1) { + GuruAnalytics.instance.logEventEx("first_iap", + itemName: productId.sku, + value: price, + parameters: {"currency": productDetails.currencyCode}); + GuruAnalytics.instance.setUserProperty("is_iap_user", "true"); + } + GuruAnalytics.instance.logEventEx(productId.iapEventName, + itemName: productId.sku, + value: price, + parameters: {"currency": productDetails.currencyCode}); + } + } catch (error, stacktrace) { + GuruAnalytics.instance.logException(error, stacktrace: stacktrace); + } + if (productId.isSubscription) { + if (resultOrder != null) { + recordSubscription(resultOrder); + } + } + if (resultOrder != null) { + reportOrders(productId, productDetails, details, resultOrder); + } + + return resultOrder; + } + + Future recordSubscription(OrderEntity order) async { + final sku = order.sku; + final manifest = order.manifest; + final productId = ProductId.fromSku( + sku: sku, + attr: TransactionAttributes.subscriptions, + basePlan: manifest?.basePlanId, + offerId: manifest?.offerId); + + final group = GuruApp.instance.appSpec.productProfile.group(productId); + + final appProperty = AppProperty.getInstance(); + + await appProperty.getAndIncrease(PropertyKeys.subscriptionCount); + if (group != null) { + await appProperty + .getAndIncrease(PropertyKeys.buildGroupSubscriptionCount(group)); + } + await appProperty + .getAndIncrease(PropertyKeys.buildSubscriptionCount(productId)); + } + + Future createPurchaseManifest(TransactionIntent intent) { + return ManifestManager.instance.createManifest(intent); + } + + Future checkAndDistributeOfferDetails(ProductId productId, + ProductDetails? details, EligibilityCriteria eligibilityCriteria) async { + Log.d("checkAndDistributeOfferDetails $productId $eligibilityCriteria"); + switch (eligibilityCriteria) { + case EligibilityCriteria.newCustomerNeverHadSubscribedThisGroup: + final group = GuruApp.instance.appSpec.productProfile.group(productId); + if (group != null) { + final key = PropertyKeys.buildGroupSubscriptionCount(group); + final count = + await AppProperty.getInstance().getInt(key, defValue: 0); + Log.d(" ==> $key $count"); + return count > 0 ? null : details; + } + Log.d(" ==> not found group($group)! return null"); + break; + case EligibilityCriteria.newCustomerNeverHadThisSubscription: + final key = PropertyKeys.buildSubscriptionCount(productId); + final count = await AppProperty.getInstance().getInt(key, defValue: 0); + Log.d(" ==> $key $count"); + return count > 0 ? null : details; + case EligibilityCriteria.newCustomerNeverHadAnySubscription: + final count = await AppProperty.getInstance() + .getInt(PropertyKeys.subscriptionCount, defValue: 0); + Log.d(" ==> subscriptionCount $count"); + return count > 0 ? null : details; + default: + return details; + } + return null; + } + + Future _createProduct( + TransactionIntent intent, ProductDetails details) async { + final productId = intent.productId; + Manifest manifest = await ManifestManager.instance.createManifest(intent); + Log.d("createProduct ${productId.sku} ${productId.hasBasePlan}"); + ProductDetails baseDetails = details; + ProductDetails? offerDetails; + if (Platform.isAndroid && + productId.isSubscription && + productId.hasBasePlan) { + final googlePlayProductDetails = details as GooglePlayProductDetails; + final productDetails = googlePlayProductDetails.productDetails; + final subscriptionOfferDetails = productDetails.subscriptionOfferDetails; + final offerProductDetails = + GooglePlayProductDetails.fromProductDetails(productDetails); + final expectBasePlan = productId.basePlan; + final expectOfferId = productId.offerId; + Log.d( + "expectOfferId:$expectOfferId expectBasePlan:$expectBasePlan offers:${offerProductDetails.length}"); + + if (expectBasePlan != null && + subscriptionOfferDetails != null && + subscriptionOfferDetails.length >= offerProductDetails.length) { + for (int i = 0; i < subscriptionOfferDetails.length; i++) { + final offer = subscriptionOfferDetails[i]; + Log.d( + "$i expectOfferId:$expectOfferId offerId:${offer.offerId} expectBasePlan:$expectBasePlan basePlanId:${offer.basePlanId}"); + if (expectBasePlan != offer.basePlanId) { + continue; + } + if (offer.offerId == null) { + baseDetails = offerProductDetails[i]; + } else if (expectOfferId != null && expectOfferId == offer.offerId) { + offerDetails = offerProductDetails[i]; + } + } + try { + offerDetails = await checkAndDistributeOfferDetails( + productId, offerDetails, intent.eligibilityCriteria); + } catch (error, stacktrace) { + Log.w("checkAndDistributeOfferDetails error! $error $stacktrace"); + } + } + } + return Product.iap(productId, baseDetails, manifest, + offerDetails: offerDetails) as IapProduct; + } + + Future> buildProducts( + Set intents) async { + ProductStore iapStore = ProductStore(); + final _productDetails = loadedProductDetails; + for (var intent in intents) { + // 这里需要使用原始 ID 进行查找 + final productId = intent.productId.originId; + final details = _productDetails[productId]; + Log.d("buildProducts $productId $details"); + if (details == null) { + continue; + } + final product = await _createProduct(intent, details); + iapStore.putProduct(product); + if (intent.productId.hasOffer && !iapStore.existsProduct(productId)) { + final originProduct = await _createProduct( + productId.createIntent(scene: intent.scene), details); + iapStore.putProduct(originProduct); + } + } + + return iapStore; + } + + Future buy(IapProduct product) async { + final productId = product.productId.originId; + final asset = purchasedStore.getAsset(productId); + if (asset != null) { + Log.v("IAP buy ${asset.productId} direct success!"); + return true; + } + final pendingProduct = iapRequestMap[productId]; + if (pendingProduct != null) { + Log.v("_requestPurchases has pending product"); + return pendingProduct.completer.future; + } + final param = PurchaseParam( + productDetails: product.offerDetails ?? product.details, + applicationUserName: AccountDataStore.instance.user?.uid); + + late OrderEntity order; + try { + order = product.createOrder(); + await GuruDB.instance.upsertOrder(order: order); + } catch (error, stacktrace) { + Log.w("addOrder error! $error", + stackTrace: stacktrace, syncCrashlytics: true, syncFirebase: true); + return false; + } + + bool result = false; + if (product.isConsumable()) { + result = await _inAppPurchase.buyConsumable(purchaseParam: param); + } else { + result = await _inAppPurchase.buyNonConsumable(purchaseParam: param); + } + if (!result) { + Log.d( + "_requestPurchases error! ${product.productId} ${product.details.price}", + syncFirebase: true); + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "request", + "item_name": order.productId.sku, + "mc": order.manifest?.category ?? "unknown", + "result": "false", + "cause": "buy error" + }); + await GuruDB.instance.deleteOrder(order: order); + return false; + } else { + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "request", + "item_name": order.productId.sku, + "mc": order.manifest?.category ?? "unknown", + "result": "true" + }); + } + final completer = Completer(); + final iapRequest = IapRequest(product, order, completer); + iapRequestMap[productId] = iapRequest; + return await completer.future; + } + + Future clearAssetRecord() async { + if (!Platform.isAndroid) { + return; + } + final InAppPurchaseAndroidPlatformAddition androidAddition = _inAppPurchase + .getPlatformAddition(); + final response = await androidAddition.queryPastPurchases(); + for (var purchase in response.pastPurchases) { + androidAddition.consumePurchase(purchase); + Log.w( + "[clearAssetRecord] purchase clear:${purchase.productID} ${purchase.verificationData}"); + _inAppPurchase.completePurchase(purchase); + } + + await GuruDB.instance.clearOrders(method: TransactionMethod.iap); + final newPurchased = AssetsStore(); + _iapStoreSubject.addEx(newPurchased); + } + + Future manualConsumePurchase(PurchaseDetails purchase) async { + if (Platform.isAndroid) { + final InAppPurchaseAndroidPlatformAddition androidAddition = + _inAppPurchase + .getPlatformAddition(); + await androidAddition.consumePurchase(purchase); + _inAppPurchase.completePurchase(purchase); + await GuruDB.instance.deletePendingOrderBySku(sku: purchase.productID); + } + } + + Future manualConsumeAllPurchases( + List> tuples) async { + for (var tuple in tuples) { + try { + final productId = tuple.item1; + final purchase = tuple.item2; + await manualConsumePurchase(purchase); + } catch (error, stacktrace) { + Log.w("consumePurchase error! $error", + stackTrace: stacktrace, syncFirebase: true); + } + } + } + + Future completeAllPurchases( + List> tuples) async { + for (var tuple in tuples) { + try { + final productId = tuple.item1; + final details = tuple.item2; + final productDetails = loadedProductDetails[productId]; + if (productDetails != null) { + if (details.pendingCompletePurchase) { + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "pending_complete", + "item_name": productId.sku, + "result": "true", + }); + final order = + await _completePurchase(productId, productDetails, details); + } else { + GuruAnalytics.instance.logGuruEvent("dev_iap_action", { + "item_category": "pending_consume", + "item_name": productId.sku, + "result": "true", + }); + await manualConsumePurchase(details); + if (productId.isPoints) { + try { + await completePoints(productId, productDetails, details); + } catch (error, stacktrace) { + Log.w("completePoints error! $error", stackTrace: stacktrace, syncFirebase: true); + } + } + } + } + } catch (error, stacktrace) { + Log.w("consumePurchase error! $error", + stackTrace: stacktrace, syncFirebase: true); + } + } + } + +// +// Future> refreshAllProducts() async { +// final allProductIds = ProductIds.allIapProductIds; +// +// return await refreshProducts(allProductIds); +// } + + Map _filterProductSkus( + {required Set ids, + required Set attrs, + Set? validIds}) { + final List> entries = ids + .where((productId) => + (validIds?.contains(productId) != false) && + attrs.contains(productId.attr)) + .map((productId) => MapEntry(productId.sku, productId)) + .toList(); + return Map.fromEntries(entries); + } + + Future _queryProducts(Set skus) async { + try { + return await _inAppPurchase.queryProductDetails(skus); + } catch (error, stacktrace) { + Log.i("_getProducts error:$error $stacktrace"); + } + return _emptyResponse; + } + + Future restorePurchases() async { + Log.d("restorePurchases!"); + if (!iapAvailable) { + Log.w("ignore restorePurchases! iap service not available!", tag: "IAP"); + return; + } + if (!_restorePurchase) { + _restorePurchase = Platform.isAndroid; // 只有Android需要进行处理 + return await _inAppPurchase.restorePurchases(); + } + } + + Future refreshProducts() async { + if (!iapAvailable) { + Log.w("ignore refreshProducts! iap service not available!", tag: "IAP"); + return; + } + final validIds = GuruApp.instance.productProfile.oneOffChargeIapIds.toSet() + ..removeAll(loadedProductDetails.keys.toSet()); + final queryOneOffChargeSkuMap = _filterProductSkus( + ids: GuruApp.instance.productProfile.oneOffChargeIapIds, + attrs: TransactionAttributes.oneOffChargeAttributes, + validIds: validIds); + + Log.i("refreshProduct $queryOneOffChargeSkuMap", tag: "IAP"); + final Map detailsMap = {}; + + if (queryOneOffChargeSkuMap.isEmpty) { + Log.i("refreshProducts ignore! already loaded!", tag: "IAP"); + return; + } + + final queryProductIds = queryOneOffChargeSkuMap.keys.toSet(); + queryProductIds.addAll( + GuruApp.instance.productProfile.subscriptionsIapIds.map((e) => e.sku)); + Log.d("refresh product:", tag: "IAP"); + for (var productId in queryProductIds) { + Log.d(" => $productId", tag: "IAP"); + } + final response = + await _queryProducts(queryProductIds).catchError((error, stacktrace) { + Log.e("getProducts($queryOneOffChargeSkuMap}) error: $error $stacktrace", + tag: "IAP"); + return _emptyResponse; + }); + Log.i("refreshProduct COMPLETED:", tag: "IAP"); + for (var details in response.productDetails) { + Log.i(" => ${details.id}", tag: "IAP"); + } + + Log.i("refreshProduct notFoundId:", tag: "IAP"); + for (var id in response.notFoundIDs) { + Log.i(" => $id", tag: "IAP"); + } + + for (var details in response.productDetails) { + detailsMap.addAll(extractProducts(details)); + } + + GuruAnalytics.instance.logGuruEvent( + "dev_iap_action", {"item_category": "load", "result": "true"}); + final newProductDetails = Map.of(loadedProductDetails); + newProductDetails.addAll(detailsMap); + _productDetailsSubject.addEx(newProductDetails); + } + + Map extractProducts(ProductDetails details) { + final productId = GuruApp.instance.findProductId(sku: details.id); + final Map detailsMap = {}; + if (productId == null) { + return detailsMap; + } + + detailsMap[productId] = details; + + final ids = GuruApp.instance.offerProductIds(productId); + if (ids.isNotEmpty) { + final googlePlayProductDetails = details as GooglePlayProductDetails; + final productDetails = googlePlayProductDetails.productDetails; + final subscriptionOfferDetails = productDetails.subscriptionOfferDetails; + final offerProductDetails = + GooglePlayProductDetails.fromProductDetails(productDetails); + for (var id in ids) { + final expectBasePlan = id.basePlan; + final expectOfferId = id.offerId; + if (expectBasePlan != null && + subscriptionOfferDetails != null && + subscriptionOfferDetails.length == offerProductDetails.length) { + for (int i = 0; i < subscriptionOfferDetails.length; i++) { + final offer = subscriptionOfferDetails[i]; + Log.d( + "$i expectOfferId:$expectOfferId offerId:${offer.offerId} expectBasePlan:$expectBasePlan basePlanId:${offer.basePlanId}"); + if (expectBasePlan != offer.basePlanId || + expectOfferId != offer.offerId) { + continue; + } + detailsMap[id] = offerProductDetails[i]; + } + } + } + } + return detailsMap; + } +} diff --git a/guru_app/lib/financial/iap/iap_model.dart b/guru_app/lib/financial/iap/iap_model.dart new file mode 100644 index 0000000..351a78e --- /dev/null +++ b/guru_app/lib/financial/iap/iap_model.dart @@ -0,0 +1,105 @@ +import 'dart:async'; + +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:guru_utils/id/id_utils.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; + +/// Created by Haoyi on 6/2/21 + +class IapRequest { + final IapProduct product; + final OrderEntity order; + final Completer completer; + + ProductId get productId => product.productId; + + IapRequest(this.product, this.order, this.completer); + + void response(bool result) { + if (!completer.isCompleted) { + completer.complete(result); + } + } +} + +class PurchaseError implements Exception { + final String msg; + + PurchaseError(this.msg); +} + +class IapProduct implements Product { + @override + final ProductId productId; + + final ProductDetails details; + + final ProductDetails? offerDetails; + + @override + final Manifest manifest; + + String get sku => productId.sku; + + IapProduct(this.productId, this.details, this.manifest, {this.offerDetails}); + + bool isConsumable() { + return productId.isConsumable; + } + + @override + String toString() { + return 'IapProduct{productId: $productId}'; + } + + @override + OrderEntity createOrder() { + return OrderEntity( + orderId: IdUtils.uuidV4(), + sku: productId.sku, + state: TransactionState.pending, + attr: productId.attr, + method: TransactionMethod.iap.index, + currency: details.currencyCode ?? "USD", + cost: details.rawPrice, + category: manifest.category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest); + } + +// @override +// TransactionEntity buildTransaction({String? tid}) { +// return TransactionEntity( +// tid: tid, +// sku: productId.sku, +// state: TransactionStates.pending, +// attr: productId.attr, +// method: TransactionMethods.iap, +// currency: details.currencySymbol, +// cost: details.rawPrice, +// timestamp: DateTimeUtils.currentTimeInMillis(), +// manifest: manifest); +// } +} + +class IapAsset extends Asset { + final PurchaseDetails details; + + IapAsset(ProductId productId, OrderEntity entity, this.details) : super(productId, entity); + + IapAsset copyWith({OrderEntity? order, PurchaseDetails? details}) { + return IapAsset(productId, order ?? this.order, details ?? this.details); + } + + @override + String toString() { + return 'IapPurchased{productId: $productId, item: $details}'; + } + +// @override +// Manifest? get manifest => ; +} diff --git a/guru_app/lib/financial/iap/ios/in_app_receipt_ios.dart b/guru_app/lib/financial/iap/ios/in_app_receipt_ios.dart new file mode 100644 index 0000000..c62caab --- /dev/null +++ b/guru_app/lib/financial/iap/ios/in_app_receipt_ios.dart @@ -0,0 +1,319 @@ +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_utils/converts/converts.dart'; +import 'package:guru_utils/log/log.dart'; + +/// Created by Haoyi on 3/4/21 +import 'package:json_annotation/json_annotation.dart'; + + +part 'in_app_receipt_ios.g.dart'; + +enum SubscriptionType { autoRenewable, nonRenewing } + +class SubscriptionPeriod { + final Duration? period; + final Duration? trial; + + @override + String toString() { + return 'SubscriptionPeriod{period: $period, trial: $trial}'; + } + + SubscriptionPeriod(this.period, this.trial); +} + +class IosReceiptStatus { + /// Not decodable status + static const unknown = -2; + + /// No status returned + static const none = -1; + + /// valid statua + static const valid = 0; + + /// The App Store could not read the JSON object you provided. + static const jsonNotReadable = 21000; + + /// The data in the receipt-data property was malformed or missing. + static const malformedOrMissingData = 21002; + + /// The receipt could not be authenticated. + static const receiptCouldNotBeAuthenticated = 21003; + + /// The shared secret you provided does not match the shared secret on file for your account. + static const secretNotMatching = 21004; + + /// The receipt server is not currently available. + static const receiptServerUnavailable = 21005; + + /// This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response. + static const subscriptionExpired = 21006; + + /// This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead. + static const testReceipt = 21007; + + /// This receipt is from the production environment, but it was sent to the test environment for verification. Send it to the production environment instead. + static const productionEnvironment = 21008; + + bool isValid(int status) { + return status == IosReceiptStatus.valid; + } +} + +class ReceiptResult { + final int status; + final int expiredDateInMillis; + // final List items; + + ReceiptResult(this.status, {this.expiredDateInMillis = 0}); + + @override + String toString() { + return 'SubscriptionResult{state: $status, expiredDateInMillis: $expiredDateInMillis}'; + } +} + +@JsonSerializable() +class ReceiptData { + @JsonKey(name: "environment") + final String? environment; + + @JsonKey(name: "receipt") + final Receipt? receipt; + + @JsonKey(name: "latest_receipt_info", defaultValue: []) + final List? latestReceiptItems; + + @JsonKey(name: "pending_renewal_info", defaultValue: []) + final List? pendingRenewalInfoItems; + + @JsonKey(name: "latest_receipt", defaultValue: "") + final String? latestReceipt; + + @JsonKey(name: "status") + final int status; + + int get requestDateInMillis => receipt?.requestDateInMillis ?? 0; + + ReceiptData({this.environment, this.receipt, this.latestReceiptItems, this.pendingRenewalInfoItems, this.latestReceipt, required this.status}); + + factory ReceiptData.fromJson(Map json) => _$ReceiptDataFromJson(json); + + Map toJson() => _$ReceiptDataToJson(this); + + dumpLog() { + Log.d("========= RECEIPT DATE ========"); + Log.d(" [status] => $status"); + Log.d(" [receipt begin] ========>"); + receipt?.dumpLog(); + Log.d(" <======== [receipt end] "); + Log.d(" [latestReceiptItems] => ${latestReceiptItems?.length}"); + Log.d(" [pendingRenewalInfoItems] => ${pendingRenewalInfoItems?.length}"); + Log.d(" [latestReceipt] => $latestReceipt"); + Log.d("========= RECEIPT DATE ========"); + } + + List getCheckReceipts({SubscriptionType type = SubscriptionType.autoRenewable, List checkIds = const []}) { + final List receipts = []; + final Set platformCheckIds = checkIds.map((id) => id.sku).toSet(); + switch (type) { + case SubscriptionType.nonRenewing: + if (receipt?.inAppReceiptItems != null && receipt!.inAppReceiptItems.isNotEmpty) { + receipts.addAll(receipt!.inAppReceiptItems); + } + break; + default: + if (latestReceiptItems != null && latestReceiptItems!.isNotEmpty) { + receipts.addAll(latestReceiptItems!); + } + break; + } + dumpLog(); + Log.d("[validate]==> receipts.length:${receipts.length}"); + if (checkIds.isNotEmpty == true) { + return receipts.where((receipt) { + Log.d("[validate]==> productId:${receipt.productId} ${platformCheckIds.contains(receipt.productId)}"); + return platformCheckIds.contains(receipt.productId); + }).toList(); + } + return []; + } +} + +@JsonSerializable() +class Receipt { + @JsonKey(name: "receipt_type") + final String receiptType; + + @JsonKey(name: "adam_id") + final int adamId; + + @JsonKey(name: "app_item_id") + final int appItemId; + + @JsonKey(name: "bundle_id") + final String bundleId; + + @JsonKey(name: "application_version") + final String applicationVersion; + + @JsonKey(name: "download_id") + final int downloadId; + + @JsonKey(name: "version_external_identifier") + final int versionExternalIdentifier; + + @JsonKey(name: "receipt_creation_date_ms") + @intStringConvert + final int receiptCreationDateInMillis; + + @JsonKey(name: "request_date_ms") + @intStringConvert + final int requestDateInMillis; + + @JsonKey(name: "original_purchase_date_ms") + @intStringConvert + final int originalPurchaseDateInMillis; + + @JsonKey(name: "original_application_version") + final String originalApplicationVersion; + + @JsonKey(name: "in_app", defaultValue: []) + final List inAppReceiptItems; + + Receipt( + {required this.receiptType, + required this.adamId, + required this.appItemId, + required this.bundleId, + required this.applicationVersion, + required this.downloadId, + required this.versionExternalIdentifier, + required this.receiptCreationDateInMillis, + required this.requestDateInMillis, + required this.originalPurchaseDateInMillis, + required this.originalApplicationVersion, + required this.inAppReceiptItems}); + + factory Receipt.fromJson(Map json) => _$ReceiptFromJson(json); + + Map toJson() => _$ReceiptToJson(this); + + void dumpLog() { + Log.d(" [receiptType] => $receiptType"); + Log.d(" [adamId] => $adamId"); + Log.d(" [appItemId] => $appItemId"); + Log.d(" [bundleId] => $bundleId"); + Log.d(" [applicationVersion] => $applicationVersion"); + Log.d(" [downloadId] => $downloadId"); + Log.d(" [versionExternalIdentifier] => $versionExternalIdentifier"); + Log.d(" [receiptCreationDateInMillis] => $receiptCreationDateInMillis"); + Log.d(" [requestDateInMillis] => $requestDateInMillis"); + Log.d(" [originalPurchaseDateInMillis] => $originalPurchaseDateInMillis"); + Log.d(" [originalApplicationVersion] => $originalApplicationVersion"); + Log.d(" [inAppReceiptItems] => ${inAppReceiptItems.length}"); + } +} + +@JsonSerializable() +class ReceiptItem { + @JsonKey(name: "product_id") + final String productId; + + @JsonKey(name: "quantity") + @intStringConvert + final int quantity; + + @JsonKey(name: "transaction_id") + final String transactionId; + + @JsonKey(name: "original_transaction_id") + final String originalTransactionId; + + @JsonKey(name: "purchase_date_ms") + @intStringConvert + final int purchaseDateInMillis; + + @JsonKey(name: "expires_date_ms") + @intStringConvert + final int? expiresDateInMillis; + + @JsonKey(name: "expires_date") + final String? expiresDateInString; + + @JsonKey(name: "original_purchase_date_ms") + @intStringConvert + final int originalPurchaseDateInMillis; + + @JsonKey(name: "web_order_line_item_id") + final String? webOrderLineItemId; + + @JsonKey(name: "is_trial_period") + @boolStringConvert + final bool isTrialPeriod; + + @JsonKey(name: "is_in_intro_offer_period") + @boolStringConvert + final bool? isInIntroOfferPeriod; + + @JsonKey(name: "subscription_group_identifier") + final String? subscriptionGroupIdentifier; + + @JsonKey(name: "cancellation_date") + final String? cancellationDate; + + ReceiptItem( + {required this.productId, + required this.quantity, + required this.transactionId, + required this.originalTransactionId, + required this.purchaseDateInMillis, + required this.expiresDateInMillis, + required this.originalPurchaseDateInMillis, + required this.webOrderLineItemId, + required this.isTrialPeriod, + required this.isInIntroOfferPeriod, + required this.subscriptionGroupIdentifier, + required this.cancellationDate, + this.expiresDateInString}); + + factory ReceiptItem.fromJson(Map json) => _$ReceiptItemFromJson(json); + + Map toJson() => _$ReceiptItemToJson(this); +} + +@JsonSerializable() +class PendingRenewalInfo { + // @JsonKey(name: "expiration_intent") + // @INT_STRING_CONVERT + // final int expirationIntent; + + @JsonKey(name: "auto_renew_product_id") + final String autoRenewProductId; + + @JsonKey(name: "original_transaction_id") + final String originalTransactionId; + + // @JsonKey(name: "is_in_billing_retry_period") + // @INT_STRING_CONVERT + // final int isInBillingRetryPeriod; + + @JsonKey(name: "product_id") + final String productId; + + @JsonKey(name: "auto_renew_status") + @intStringConvert + final int autoRenewStatus; + + PendingRenewalInfo( + { + required this.autoRenewProductId, + required this.originalTransactionId, + required this.productId, + required this.autoRenewStatus}); + + factory PendingRenewalInfo.fromJson(Map json) => _$PendingRenewalInfoFromJson(json); + + Map toJson() => _$PendingRenewalInfoToJson(this); +} diff --git a/guru_app/lib/financial/iap/ios/in_app_receipt_ios.g.dart b/guru_app/lib/financial/iap/ios/in_app_receipt_ios.g.dart new file mode 100644 index 0000000..d100d43 --- /dev/null +++ b/guru_app/lib/financial/iap/ios/in_app_receipt_ios.g.dart @@ -0,0 +1,146 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'in_app_receipt_ios.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ReceiptData _$ReceiptDataFromJson(Map json) => ReceiptData( + environment: json['environment'] as String?, + receipt: json['receipt'] == null + ? null + : Receipt.fromJson(json['receipt'] as Map), + latestReceiptItems: (json['latest_receipt_info'] as List?) + ?.map((e) => ReceiptItem.fromJson(e as Map)) + .toList() ?? + [], + pendingRenewalInfoItems: (json['pending_renewal_info'] as List?) + ?.map( + (e) => PendingRenewalInfo.fromJson(e as Map)) + .toList() ?? + [], + latestReceipt: json['latest_receipt'] as String? ?? '', + status: json['status'] as int, + ); + +Map _$ReceiptDataToJson(ReceiptData instance) => + { + 'environment': instance.environment, + 'receipt': instance.receipt, + 'latest_receipt_info': instance.latestReceiptItems, + 'pending_renewal_info': instance.pendingRenewalInfoItems, + 'latest_receipt': instance.latestReceipt, + 'status': instance.status, + }; + +Receipt _$ReceiptFromJson(Map json) => Receipt( + receiptType: json['receipt_type'] as String, + adamId: json['adam_id'] as int, + appItemId: json['app_item_id'] as int, + bundleId: json['bundle_id'] as String, + applicationVersion: json['application_version'] as String, + downloadId: json['download_id'] as int, + versionExternalIdentifier: json['version_external_identifier'] as int, + receiptCreationDateInMillis: + intStringConvert.fromJson(json['receipt_creation_date_ms'] as String), + requestDateInMillis: + intStringConvert.fromJson(json['request_date_ms'] as String), + originalPurchaseDateInMillis: intStringConvert + .fromJson(json['original_purchase_date_ms'] as String), + originalApplicationVersion: + json['original_application_version'] as String, + inAppReceiptItems: (json['in_app'] as List?) + ?.map((e) => ReceiptItem.fromJson(e as Map)) + .toList() ?? + [], + ); + +Map _$ReceiptToJson(Receipt instance) => { + 'receipt_type': instance.receiptType, + 'adam_id': instance.adamId, + 'app_item_id': instance.appItemId, + 'bundle_id': instance.bundleId, + 'application_version': instance.applicationVersion, + 'download_id': instance.downloadId, + 'version_external_identifier': instance.versionExternalIdentifier, + 'receipt_creation_date_ms': + intStringConvert.toJson(instance.receiptCreationDateInMillis), + 'request_date_ms': intStringConvert.toJson(instance.requestDateInMillis), + 'original_purchase_date_ms': + intStringConvert.toJson(instance.originalPurchaseDateInMillis), + 'original_application_version': instance.originalApplicationVersion, + 'in_app': instance.inAppReceiptItems, + }; + +ReceiptItem _$ReceiptItemFromJson(Map json) => ReceiptItem( + productId: json['product_id'] as String, + quantity: intStringConvert.fromJson(json['quantity'] as String), + transactionId: json['transaction_id'] as String, + originalTransactionId: json['original_transaction_id'] as String, + purchaseDateInMillis: + intStringConvert.fromJson(json['purchase_date_ms'] as String), + expiresDateInMillis: _$JsonConverterFromJson( + json['expires_date_ms'], intStringConvert.fromJson), + originalPurchaseDateInMillis: intStringConvert + .fromJson(json['original_purchase_date_ms'] as String), + webOrderLineItemId: json['web_order_line_item_id'] as String?, + isTrialPeriod: + boolStringConvert.fromJson(json['is_trial_period'] as String), + isInIntroOfferPeriod: _$JsonConverterFromJson( + json['is_in_intro_offer_period'], boolStringConvert.fromJson), + subscriptionGroupIdentifier: + json['subscription_group_identifier'] as String?, + cancellationDate: json['cancellation_date'] as String?, + expiresDateInString: json['expires_date'] as String?, + ); + +Map _$ReceiptItemToJson(ReceiptItem instance) => + { + 'product_id': instance.productId, + 'quantity': intStringConvert.toJson(instance.quantity), + 'transaction_id': instance.transactionId, + 'original_transaction_id': instance.originalTransactionId, + 'purchase_date_ms': + intStringConvert.toJson(instance.purchaseDateInMillis), + 'expires_date_ms': _$JsonConverterToJson( + instance.expiresDateInMillis, intStringConvert.toJson), + 'expires_date': instance.expiresDateInString, + 'original_purchase_date_ms': + intStringConvert.toJson(instance.originalPurchaseDateInMillis), + 'web_order_line_item_id': instance.webOrderLineItemId, + 'is_trial_period': boolStringConvert.toJson(instance.isTrialPeriod), + 'is_in_intro_offer_period': _$JsonConverterToJson( + instance.isInIntroOfferPeriod, boolStringConvert.toJson), + 'subscription_group_identifier': instance.subscriptionGroupIdentifier, + 'cancellation_date': instance.cancellationDate, + }; + +Value? _$JsonConverterFromJson( + Object? json, + Value? Function(Json json) fromJson, +) => + json == null ? null : fromJson(json as Json); + +Json? _$JsonConverterToJson( + Value? value, + Json? Function(Value value) toJson, +) => + value == null ? null : toJson(value); + +PendingRenewalInfo _$PendingRenewalInfoFromJson(Map json) => + PendingRenewalInfo( + autoRenewProductId: json['auto_renew_product_id'] as String, + originalTransactionId: json['original_transaction_id'] as String, + productId: json['product_id'] as String, + autoRenewStatus: + intStringConvert.fromJson(json['auto_renew_status'] as String), + ); + +Map _$PendingRenewalInfoToJson(PendingRenewalInfo instance) => + { + 'auto_renew_product_id': instance.autoRenewProductId, + 'original_transaction_id': instance.originalTransactionId, + 'product_id': instance.productId, + 'auto_renew_status': intStringConvert.toJson(instance.autoRenewStatus), + }; diff --git a/guru_app/lib/financial/iap/ios/receipt_validator_ios.dart b/guru_app/lib/financial/iap/ios/receipt_validator_ios.dart new file mode 100644 index 0000000..77a70b9 --- /dev/null +++ b/guru_app/lib/financial/iap/ios/receipt_validator_ios.dart @@ -0,0 +1,110 @@ +import 'dart:convert'; + +import 'package:guru_app/guru_app.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; + +import 'in_app_receipt_ios.dart'; + +import 'package:http/http.dart' as http; + +import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; + +/// Created by Haoyi on 3/5/21 +/// + +class IosReceiptValidator { + final AppStorePurchaseDetails purchasedDetails; + + ReceiptData? _receiptData; + + IosReceiptValidator(this.purchasedDetails); + + Future _validateReceipt(bool isSandbox) async { + Log.d("[validate] isSandbox:$isSandbox"); + + final iosValidateReceiptPassword = + GuruApp.instance.appSpec.deployment.iosValidateReceiptPassword; + if (iosValidateReceiptPassword == null) { + return null; + } + + final Map headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }; + final Map receiptBody = { + "receipt-data": purchasedDetails.verificationData.serverVerificationData, + "password": iosValidateReceiptPassword + }; + + final String url = isSandbox + ? 'https://sandbox.itunes.apple.com/verifyReceipt' + : 'https://buy.itunes.apple.com/verifyReceipt'; + + final body = jsonEncode(receiptBody); + + try { + final response = await http.post(Uri.parse(url), headers: headers, body: body); + final json = jsonDecode(response.body); + return ReceiptData.fromJson(json); + } catch (error, stacktrace) { + return null; + } + } + + Future validate() async { + final receiptData = await _validateReceipt(false); + if (receiptData?.environment == "Sandbox" || receiptData?.status == 21007) { + return _validateReceipt(true); + } + return receiptData; + } + + Duration? _getReceiptDuration(SubscriptionType type, + {Duration duration = const Duration(seconds: 0)}) { + switch (type) { + case SubscriptionType.nonRenewing: + return duration; + default: + return null; + } + } + +// List _sortedReceipts(List items, {Duration? duration}) { +// final result = List.of(items); +// if (duration == null) { +// result.sort((a, b) => b.expiresDateInMillis.compareTo(a.expiresDateInMillis)); +// return result; +// } +// return result; +// } + +// Future verifySubscriptions(SubscriptionType type) async { +// final receiptData = await validate(); +// final duration = _getReceiptDuration(type); +// final checkReceipts = +// receiptData.getCheckReceipts(type: type, checkIds: ProductIds.iapPremiumIds); +// final nonCancelledReceipts = checkReceipts.where((receipt) => receipt.cancellationDate == null); +// if (nonCancelledReceipts.length > checkReceipts.length) { +// print( +// "[validate]==> receipt has ${nonCancelledReceipts.length} items, but only ${checkReceipts.length} were parsed"); +// } +// final sortedReceipts = _sortedReceipts(checkReceipts, duration: duration); +// +// if (sortedReceipts.isEmpty) { +// print("[validate]==> sortedReceipts is Empty"); +// return ReceiptResult(PurchaseStatus.notPurchased); +// } +// +// final firstReceiptItem = sortedReceipts[0]; +// print( +// "[validate]==> firstReceiptItem:${firstReceiptItem.expiresDateInMillis} request:${receiptData.requestDateInMillis}"); +// if (firstReceiptItem.expiresDateInMillis > receiptData.requestDateInMillis) { +// return ReceiptResult(PurchaseStatus.purchased, items: sortedReceipts); +// } else { +// return ReceiptResult(PurchaseStatus.expired, +// expiredDateInMillis: firstReceiptItem.expiresDateInMillis, items: sortedReceipts); +// } +// } +// } +} \ No newline at end of file diff --git a/guru_app/lib/financial/igc/igc_manager.dart b/guru_app/lib/financial/igc/igc_manager.dart new file mode 100644 index 0000000..13dbcab --- /dev/null +++ b/guru_app/lib/financial/igc/igc_manager.dart @@ -0,0 +1,166 @@ +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/database/guru_db.dart'; +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/igc/igc_model.dart'; +import 'package:guru_app/financial/manifest/manifest_manager.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/property/app_property.dart'; + +/// Created by Haoyi on 2023/2/18 + +class IgcManager { + static final IgcManager _instance = IgcManager._(); + + static IgcManager get instance => _instance; + + final BehaviorSubject _balanceSubject = BehaviorSubject.seeded(0); + + final BehaviorSubject> _assetStoreSubject = + BehaviorSubject.seeded(AssetsStore.inactive()); + + Stream> get observableAssetStore => _assetStoreSubject.stream; + + AssetsStore get purchasedStore => _assetStoreSubject.value; + + int get currentBalance => _balanceSubject.value; + + Stream get observableCurrentBalance => _balanceSubject.stream; + + final CompositeSubscription subscriptions = CompositeSubscription(); + + IgcManager._(); + + Future init() async { + final attachedGems = (await AppProperty.getInstance().isFirstUseGemsFeature()) + ? GuruApp.instance.appSpec.deployment.initIgc + : 0; + final _balance = await AppProperty.getInstance().accumulateIgc(attachedGems); + _balanceSubject.addEx(_balance); + GuruAnalytics.instance.setUserProperty("coin", _balance.toString()); + + final iapIgc = await AppProperty.getInstance().getIapIgc(); + GuruAnalytics.instance.setUserProperty("iap_coin", iapIgc.toString()); + + final noIapIgcGems = await AppProperty.getInstance().getNoIapIgc(); + GuruAnalytics.instance.setUserProperty("noniap_coin", noIapIgcGems.toString()); + await reloadAssets(); + } + + Future reloadAssets() async { + final orders = await GuruDB.instance + .selectOrders(method: TransactionMethod.igc, attrs: [TransactionAttributes.asset]); + final newAssetStore = AssetsStore(); + for (var order in orders) { + final productId = order.productId; + Log.v("init order:${order.sku} $productId"); + newAssetStore.addAsset(Asset(productId, order)); + } + _assetStoreSubject.addEx(newAssetStore); + } + + Future clearAssets({String? category, TransactionMethod? method}) async { + await GuruDB.instance.clearOrders(category: category, method: method); + final newAssetStore = purchasedStore.clone()..clearAsset(category: category, method: method); + _assetStoreSubject.addEx(newAssetStore); + } + + Future accumulate(int igc, TransactionMethod method, {String? scene}) async { + try { + int newBalance = await AppProperty.getInstance().accumulateIgc(igc); + try { + if (method == TransactionMethod.iap) { + final iapIgc = await AppProperty.getInstance().accumulateIapIgc(igc); + await GuruAnalytics.instance.setUserProperty("iap_coin", iapIgc.toString()); + } else { + final noniapIgc = await AppProperty.getInstance().accumulateNoIapIgc(igc); + await GuruAnalytics.instance.setUserProperty("noniap_coin", noniapIgc.toString()); + } + await GuruAnalytics.instance.setUserProperty("coin", newBalance.toString()); + } catch (throwable, stacktrace) { + Log.w("accumulate error $throwable", syncFirebase: true, syncCrashlytics: true); + } + _balanceSubject.add(newBalance); + + GuruAnalytics.instance.logEarnVirtualCurrency( + virtualCurrencyName: "coin", + method: scene ?? convertTransactionMethodName(method), + balance: newBalance, + value: igc); + return true; + } catch (error, stacktrace) { + Log.v("accumulate error:$error $stacktrace"); + } + return false; + } + + Future clear() async { + final result = await AppProperty.getInstance().clearAllIgc(); + if (result) { + _balanceSubject.add(0); + } + } + + Future buildIgcProduct(TransactionIntent intent) async { + final manifest = await ManifestManager.instance.createManifest(intent); + return IgcProduct(intent.productId, manifest, intent.igcCost); + } + + Future purchase(IgcProduct product) async { + Log.v("Igc buy"); + + final purchasedItem = purchasedStore.getAsset(product.productId); + if (purchasedItem != null) { + Log.v("Coin buy ${purchasedItem.productId} direct success!"); + return true; + } + return _requestPurchase(product); + } + + Future _requestPurchase(IgcProduct product) async { + if (currentBalance < product.cost || product.cost < 0) { + Log.v("_requestPurchase error! $currentBalance price:${product.cost}"); + return false; + } + try { + final int newBalance = await AppProperty.getInstance().consumeIgc(product.cost); + await GuruAnalytics.instance.setUserProperty("coin", newBalance.toString()); + + if (currentBalance != newBalance) { + _balanceSubject.add(newBalance); + } + + if (product.cost != 0) { + GuruAnalytics.instance.logSpendCredits( + product.productId.sku, product.manifest.category, product.cost, + virtualCurrencyName: "coin", balance: newBalance, scene: product.manifest.scene); + } + + if (!product.productId.isConsumable) { + final order = product.createOrder(); + await GuruDB.instance.upsertOrder(order: order).catchError((error) { + Log.v("upsertOrder error!$error"); + return false; + }); + final newPurchasedStore = purchasedStore.clone(); + newPurchasedStore.addAsset(Asset(product.productId, order)); + _assetStoreSubject.addEx(newPurchasedStore); + } + return true; + } catch (error, stacktrace) { + Log.v("error $error, $stacktrace"); + return false; + } + } + + void dispose() { + // _productStoreSubject.close(); + _assetStoreSubject.close(); + _balanceSubject.close(); + } +} diff --git a/guru_app/lib/financial/igc/igc_model.dart b/guru_app/lib/financial/igc/igc_model.dart new file mode 100644 index 0000000..d3fae18 --- /dev/null +++ b/guru_app/lib/financial/igc/igc_model.dart @@ -0,0 +1,47 @@ +/// Created by Haoyi on 2023/2/18 + +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/id/id_utils.dart'; + +/// Created by Haoyi on 2023/2/13 + +class IgcProduct implements Product { + @override + final ProductId productId; + + @override + final Manifest manifest; + + final int cost; + + String get sku => productId.sku; + + IgcProduct(this.productId, this.manifest, this.cost); + + bool isConsumable() { + return productId.isConsumable; + } + + @override + String toString() { + return 'IgcProduct{productId: $productId}'; + } + + @override + OrderEntity createOrder() { + return OrderEntity( + orderId: IdUtils.uuidV4(), + sku: productId.sku, + state: TransactionState.success, + attr: productId.attr, + method: TransactionMethod.igc.index, + currency: TransactionCurrency.igc, + cost: cost.toDouble(), + category: manifest.category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest); + } +} diff --git a/guru_app/lib/financial/manifest/manifest.dart b/guru_app/lib/financial/manifest/manifest.dart new file mode 100644 index 0000000..7c6d681 --- /dev/null +++ b/guru_app/lib/financial/manifest/manifest.dart @@ -0,0 +1,17 @@ + + +/// Created by Haoyi on 2023/1/24 +export 'package:guru_utils/manifest/manifest.dart'; +export 'manifest_manager.dart'; +// +// class ReservedManifestFactory { +// static Future buildNoBannerAndInterstitialAds(TransactionIntent intent) async { +// if (GuruApp.instance.productProfile.noAdsCapIds.contains(intent.productId)) { +// final details = Details.define(DetailsReservedType.noAds, 1); +// return Manifest("no_ads", details: [details]); +// } +// return null; +// } +// +// static List builders = [buildNoBannerAndInterstitialAds]; +// } diff --git a/guru_app/lib/financial/manifest/manifest_manager.dart b/guru_app/lib/financial/manifest/manifest_manager.dart new file mode 100644 index 0000000..935344d --- /dev/null +++ b/guru_app/lib/financial/manifest/manifest_manager.dart @@ -0,0 +1,77 @@ +import 'dart:async'; + +import 'package:guru_app/financial/igc/igc_manager.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'manifest.dart'; + +/// Created by Haoyi on 2022/8/21 + +typedef DetailsDistributor = Future Function(Details, TransactionMethod, String scene); + +typedef ManifestBuilder = Future Function(TransactionIntent); + +class ManifestManager { + ManifestManager._() { + observableDeliveredManifest = deliveredManifestStream.stream.asBroadcastStream(); + } + + final StreamController deliveredManifestStream = StreamController(); + + static final ManifestManager instance = ManifestManager._(); + + late Stream observableDeliveredManifest; + + final Map distributors = { + DetailsReservedType.igc: _deliverIgcDetails + }; + + final List builders = []; + + static Future _deliverIgcDetails( + Details details, TransactionMethod method, String scene) async { + if (details.amount > 0) { + IgcManager.instance.accumulate(details.amount, method, scene: scene); + return true; + } + return false; + } + + void addDistributor(String type, DetailsDistributor distributor) { + distributors[type] = distributor; + } + + void addBuilder(ManifestBuilder builder) { + builders.add(builder); + } + + void addBuilders(List builders) { + this.builders.addAll(builders); + } + + Future deliver(Manifest manifest, TransactionMethod method) async { + bool result = false; + for (var details in manifest.details) { + result |= await distributors[details.type]?.call(details, method, manifest.scene) ?? false; + } + deliveredManifestStream.add(manifest); + return result; + } + + Future createManifest(TransactionIntent intent) async { + for (var builder in builders) { + final manifest = await builder(intent); + if (manifest != null) { + return manifest; + } + } + return Manifest.empty; + } + + Manifest createIgcManifest(int igc, {String? category, String scene = ""}) { + final details =
[]; + details.add(Details.define(DetailsReservedType.igc, igc)); + + final extras = {ExtraReservedField.scene: scene}; + return Manifest(category ?? DetailsReservedType.igc, extras: extras, details: details); + } +} diff --git a/guru_app/lib/financial/product/ids/product_ids.dart b/guru_app/lib/financial/product/ids/product_ids.dart new file mode 100644 index 0000000..f8d2459 --- /dev/null +++ b/guru_app/lib/financial/product/ids/product_ids.dart @@ -0,0 +1,145 @@ +// /// Created by Haoyi on 2021/7/1 +// +// part of "../product_model.dart"; +// +// class ProductProfile { +// final List oneOffChargeIapIds = []; +// final List subscriptionsIapIds = []; +// final List noAdsCapIds; +// +// final List igcIds = []; +// final List rewardIds = []; +// +// final List> _idsMap = +// List.generate(TransactionAttributes.count, (index) => {}); +// +// ProductProfile( +// {required List oneOffChargeIapIds, +// required List subscriptionsIapIds, +// List igcIds = const [], +// List rewardIds = const [], +// this.noAdsCapIds = const []}) { +// for (var productId in oneOffChargeIapIds) { +// _define(productId, TransactionMethod.iap); +// } +// for (var productId in subscriptionsIapIds) { +// _define(productId, TransactionMethod.iap); +// } +// for (var productId in igcIds) { +// _define(productId, TransactionMethod.igc); +// } +// for (var productId in rewardIds) { +// _define(productId, TransactionMethod.reward); +// } +// } +// +// bool hasIap() => oneOffChargeIapIds.isEmpty && subscriptionsIapIds.isEmpty; +// +// ProductId _define(ProductId productId, TransactionMethod method) { +// switch (method) { +// case TransactionMethod.iap: +// if (productId.isOneOffCharge) { +// oneOffChargeIapIds.add(productId); +// } else if (productId.isSubscription) { +// subscriptionsIapIds.add(productId); +// } +// break; +// case TransactionMethod.igc: +// igcIds.add(productId); +// break; +// case TransactionMethod.reward: +// rewardIds.add(productId); +// break; +// case TransactionMethod.none: +// break; +// } +// _idsMap[productId.attr][productId.sku] = productId; +// return productId; +// } +// +// ProductId findOrCreate(String sku, int attr, TransactionMethod method) { +// return _find(sku, attr) ?? _define(ProductId(android: sku, ios: sku, attr: attr), method); +// } +// +// ProductId? _find(String sku, int attr) { +// return _idsMap[attr][sku]; +// } +// +// ProductId? find({String? sku, int? attr}) { +// if (sku == null) { +// return null; +// } +// +// if (attr != null) { +// return _find(sku, attr); +// } else { +// return _find(sku, TransactionAttributes.possessive) ?? +// _find(sku, TransactionAttributes.subscriptions) ?? +// _find(sku, TransactionAttributes.consumable); +// } +// } +// } +// +// class IapProfile { +// final List oneOffChargeIapIds = []; +// final List subscriptionsIapIds = []; +// final List noAdsCapIds; +// final List> _idsMap = +// List.generate(TransactionAttributes.count, (index) => {}); +// +// IapProfile( +// {required List oneOffChargeIapIds, +// required List subscriptionsIapIds, +// this.noAdsCapIds = const []}) { +// for (var productId in oneOffChargeIapIds) { +// _define(productId); +// } +// for (var productId in subscriptionsIapIds) { +// _define(productId); +// } +// } +// +// bool hasIap() => oneOffChargeIapIds.isEmpty && subscriptionsIapIds.isEmpty; +// +// static final IapProfile invalid = +// IapProfile(oneOffChargeIapIds: [], subscriptionsIapIds: [], noAdsCapIds: []); +// +// ProductId _define(ProductId productId) { +// if (productId.isOneOffCharge) { +// oneOffChargeIapIds.add(productId); +// } else if (productId.isSubscription) { +// subscriptionsIapIds.add(productId); +// } else { +// return productId; +// } +// _idsMap[productId.attr][productId.sku] = productId; +// return productId; +// } +// +// ProductId findOrCreate(String sku, int attr) { +// return _find(sku, attr) ?? _define(ProductId(android: sku, ios: sku, attr: attr)); +// } +// +// ProductId? _find(String sku, int attr) { +// return _idsMap[attr][sku]; +// } +// +// ProductId? find({String? sku, int? attr}) { +// if (sku == null) { +// return null; +// } +// +// if (attr != null) { +// return _find(sku, attr); +// } else { +// return _find(sku, TransactionAttributes.possessive) ?? +// _find(sku, TransactionAttributes.subscriptions) ?? +// _find(sku, TransactionAttributes.consumable); +// } +// } +// } +// +// class ProductIds { +// static const ProductId invalid = +// ProductId(android: "", attr: TransactionAttributes.unknown, ios: ""); +// } diff --git a/guru_app/lib/financial/product/product_model.dart b/guru_app/lib/financial/product/product_model.dart new file mode 100644 index 0000000..560aebf --- /dev/null +++ b/guru_app/lib/financial/product/product_model.dart @@ -0,0 +1,259 @@ +import 'dart:io'; + +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/manifest/manifest_manager.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_utils/hash/hash.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; +import 'package:guru_app/financial/iap/iap_model.dart'; +import 'package:guru_app/financial/igc/igc_model.dart'; +import 'package:guru_app/financial/reward/reward_model.dart'; + +part 'product_profile.dart'; + +/// Created by Haoyi on 6/1/21 + +class OrderMethods { + static const free = 0; + static const gem = 1; // 宝石购买 + static const iap = 2; // IAP购买 + static const reward = 3; // 奖励收获 + static const limit = 4; + + static String toAbbrevText(int method) { + switch (method) { + case free: + return "free"; + case gem: + return "gem"; + case iap: + return "iap"; + case reward: + return "reward"; + case limit: + return "limit"; + default: + return ""; + } + } +} + +class OrderStates { + static const init = 0; + static const success = 1; + static const pending = -1; + static const error = -2; +} + +class TransactionAttributes { + static const unknown = 0; + + // Offer products for sale in your app for a one-off charge + @deprecated + static const possessive = 1; + static const asset = 1; + static const consumable = 2; + + static const Set oneOffChargeAttributes = {asset, consumable}; + + // Subscriptions are in-app content or services that are billed to users on a recurring basis + static const subscriptions = 10; + + static const count = 11; +} + +class TransactionCurrency { + static const free = "_FVC"; // Free Virtual Currency + static const igc = "_IGC"; // In-Game Virtual Currency + static const reward = "_RVC"; // Reward Virtual Currency +} + +// 这里的配置有别于 GP 上的配置,由于 GP 上对应的配置无法满足我们的需求,所以我们需要自己定义一套配置 +enum EligibilityCriteria { + // 这里对应的是 GP 上的 NEW CUSTOMER,但是新用户的判断是以APP的生命周期为标准, + // 没有购买过此商品组的新用户(默认选项) + newCustomerNeverHadSubscribedThisGroup, + + // 这里对应的是 GP 上的 NEW CUSTOMER,但是新用户的判断是以APP的生命周期为标准, + // 没有购买过此商品的新用户 + newCustomerNeverHadThisSubscription, + + // 这里对应的是 GP 上的 NEW CUSTOMER,但是新用户的判断是以APP的生命周期为标准, + // 没有购买过任何订阅商品的新用户 + newCustomerNeverHadAnySubscription, + + // 依赖 ProductId 进行筛选 + dependencyProductId +} + +class ProductId { + final String android; + final String ios; + final int attr; + + // android only + final String? basePlan; + final String? offerId; + final bool points; + + final ProductId? _originId; + + bool get isConsumable => attr == TransactionAttributes.consumable; + + bool get hasOffer => + Platform.isAndroid && basePlan?.isNotEmpty == true && offerId?.isNotEmpty == true; + + bool get hasBasePlan => Platform.isAndroid && basePlan?.isNotEmpty == true; + + static final _iapEventRegExp = RegExp(r'^.*\.[ia]\.'); + + ProductId get originId => _originId ?? this; + + @override + String toString() { + if (hasOffer) { + return 'ProductId{sku: $sku, basePlan: $basePlan, offerId: $offerId}'; + } + return 'ProductId{android: $android, ios: $ios, attr: $attr, points:$points}'; + } + + @deprecated + bool get isPossessive => attr == TransactionAttributes.asset; + + bool get isAsset => attr == TransactionAttributes.asset; + + bool get isPoints => points; + + bool get isOneOffCharge => + (attr == TransactionAttributes.consumable) || (attr == TransactionAttributes.asset); + + bool get isSubscription => attr == TransactionAttributes.subscriptions; + + String get iapEventName => sku.replaceFirst(_iapEventRegExp, "iap.").replaceAll(".", "_"); + + String get sku => Platform.isIOS ? ios : android; + + static const ProductId invalid = + ProductId.fromSku(sku: "", attr: TransactionAttributes.consumable); + + const ProductId( + {required this.android, + required this.ios, + required this.attr, + this.basePlan, + this.offerId, + this.points = false, + ProductId? originId}) + : _originId = originId; + + const ProductId.fromSku( + {required String sku, required this.attr, this.basePlan, this.offerId, this.points = false}) + : android = sku, + ios = sku, + _originId = null; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ProductId && + runtimeType == other.runtimeType && + sku == other.sku && + attr == other.attr && + basePlan == other.basePlan && + offerId == other.offerId && + points == points; + + @override + int get hashCode => hashObjects([sku, attr, basePlan ?? '', offerId ?? '', points]); + + bool isValid() { + return sku.isNotEmpty; + } + + TransactionIntent createIntent( + {required String scene, + int igcCost = 0, + bool sales = false, + double rate = 1.0, + EligibilityCriteria eligibilityCriteria = + EligibilityCriteria.newCustomerNeverHadSubscribedThisGroup}) { + return TransactionIntent(this, scene, + igcCost: igcCost, sales: sales, rate: rate, eligibilityCriteria: eligibilityCriteria); + } + + Future createRewardProduct(String scene) async { + final intent = createIntent(scene: scene); + final manifest = await ManifestManager.instance.createManifest(intent); + return RewardProduct(this, manifest); + } + + Future createIgcProduct(int igcCost, String scene) async { + final intent = createIntent(scene: scene, igcCost: igcCost); + final manifest = await ManifestManager.instance.createManifest(intent); + return IgcProduct(this, manifest, igcCost); + } +} + +abstract class Product { + ProductId get productId; + + Manifest get manifest; + + factory Product.iap(ProductId productId, ProductDetails details, Manifest manifest, + {ProductDetails? offerDetails}) = IapProduct; + + factory Product.igc(ProductId productId, Manifest manifest, int cost) = IgcProduct; + + factory Product.reward(ProductId productId, Manifest manifest) = RewardProduct; + +// +// factory Product.gems(ProductId productId, int price, Manifest manifest) = GemProduct; +// +// factory Product.reward(Reward reward) = RewardProduct; +// + OrderEntity createOrder(); +} + +class TransactionState { + static const init = 0; + static const success = 1; + static const pending = -1; + static const error = -2; + static const expired = -3; +} + +enum TransactionMethod { + iap, // IAP购买 + igc, // In-game currency 购买 + reward, // 奖励获得 + none +} + +String convertTransactionMethodName(TransactionMethod method) { + switch (method) { + case TransactionMethod.iap: + return "iap_buy"; + case TransactionMethod.igc: + return "igc"; + case TransactionMethod.reward: + return "reward"; + default: + return "none"; + } +} + +class TransactionIntent { + final ProductId productId; + final int igcCost; + final String scene; // 购买场景(最终会用到logEarnVirtualCurrency的item_category上) + final bool sales; // 是否为促销商品 + final double rate; // 默认1.0 指收益率,如:打折促销时设成1.2,最终的收益将是1.2倍 + final EligibilityCriteria eligibilityCriteria; + + TransactionIntent(this.productId, this.scene, + {this.igcCost = 0, + this.sales = false, + this.rate = 1.0, + this.eligibilityCriteria = EligibilityCriteria.newCustomerNeverHadSubscribedThisGroup}); +} diff --git a/guru_app/lib/financial/product/product_profile.dart b/guru_app/lib/financial/product/product_profile.dart new file mode 100644 index 0000000..24cb77e --- /dev/null +++ b/guru_app/lib/financial/product/product_profile.dart @@ -0,0 +1,168 @@ +/// Created by Haoyi on 2021/7/1 + +part of "product_model.dart"; + +class ProductProfile { + final Set oneOffChargeIapIds = {}; + final Set subscriptionsIapIds = {}; + final Set pointsIapIds = {}; + final Set noAdsCapIds; + + final Set iapIds = {}; + final Set igcIds = {}; + final Set rewardIds = {}; + + final Map groupMap; + + final List manifestBuilders = []; + + final Map> _offerIds = {}; + + final List> _idsMap = + List.generate(TransactionAttributes.count, (index) => {}); + + ProductProfile({required Set oneOffChargeIapIds, + required Set subscriptionsIapIds, + Set pointsIapIds = const {}, + Set igcIds = const {}, + Set rewardIds = const {}, + this.groupMap = const {}, + List manifestBuilders = const [], + this.noAdsCapIds = const {}}) { + for (var productId in oneOffChargeIapIds) { + _define(productId, TransactionMethod.iap); + } + for (var productId in subscriptionsIapIds) { + _define(productId, TransactionMethod.iap); + } + for (var productId in igcIds) { + _define(productId, TransactionMethod.igc); + } + for (var productId in rewardIds) { + _define(productId, TransactionMethod.reward); + } + this.pointsIapIds.addAll(pointsIapIds); + this.manifestBuilders.addAll(manifestBuilders); + } + + bool hasIap() => oneOffChargeIapIds.isNotEmpty; + + bool hasSubs() => subscriptionsIapIds.isNotEmpty; + + ProductId _define(ProductId productId, TransactionMethod method) { + ProductId definedProductId = productId; + switch (method) { + case TransactionMethod.iap: + if (productId.isOneOffCharge) { + oneOffChargeIapIds.add(productId); + } else if (productId.isSubscription) { + definedProductId = productId.originId; + subscriptionsIapIds.add(definedProductId); + if (productId.hasBasePlan) { + (_offerIds[productId.sku] ??= {}).add(productId); + } + } + iapIds.add(definedProductId); + break; + case TransactionMethod.igc: + igcIds.add(definedProductId); + break; + case TransactionMethod.reward: + rewardIds.add(definedProductId); + break; + case TransactionMethod.none: + break; + } + _idsMap[productId.attr][productId.sku] = definedProductId; + return productId; + } + + ProductId define(String sku, int attr, TransactionMethod method) { + final productId = _find(sku, attr) ?? ProductId.fromSku(sku: sku, attr: attr); + return _define(productId, method); + } + + ProductId? _find(String sku, int attr) { + return _idsMap[attr][sku]; + } + + ProductId? find({String? sku, int? attr}) { + if (sku == null || sku == "") { + return null; + } + + if (attr != null) { + return _find(sku, attr); + } else { + return _find(sku, TransactionAttributes.asset) ?? + _find(sku, TransactionAttributes.subscriptions) ?? + _find(sku, TransactionAttributes.consumable); + } + } + + Set offerProductIds(ProductId productId) { + return _offerIds[productId.sku] ?? {}; + } + + String? group(ProductId productId) { + return groupMap[productId.sku]; + } +} + +class IapProfile { + final List oneOffChargeIapIds = []; + final List subscriptionsIapIds = []; + final List noAdsCapIds; + final List> _idsMap = + List.generate(TransactionAttributes.count, (index) => {}); + + IapProfile({required List oneOffChargeIapIds, + required List subscriptionsIapIds, + this.noAdsCapIds = const []}) { + for (var productId in oneOffChargeIapIds) { + _define(productId); + } + for (var productId in subscriptionsIapIds) { + _define(productId.originId); + } + } + + bool hasIap() => oneOffChargeIapIds.isEmpty && subscriptionsIapIds.isEmpty; + + static final IapProfile invalid = + IapProfile(oneOffChargeIapIds: [], subscriptionsIapIds: [], noAdsCapIds: []); + + ProductId _define(ProductId productId) { + if (productId.isOneOffCharge) { + oneOffChargeIapIds.add(productId); + } else if (productId.isSubscription) { + subscriptionsIapIds.add(productId); + } else { + return productId; + } + _idsMap[productId.attr][productId.sku] = productId; + return productId; + } + + ProductId findOrCreate(String sku, int attr) { + return _find(sku, attr) ?? _define(ProductId(android: sku, ios: sku, attr: attr)); + } + + ProductId? _find(String sku, int attr) { + return _idsMap[attr][sku]; + } + + ProductId? find({String? sku, int? attr}) { + if (sku == null) { + return null; + } + + if (attr != null) { + return _find(sku, attr); + } else { + return _find(sku, TransactionAttributes.possessive) ?? + _find(sku, TransactionAttributes.subscriptions) ?? + _find(sku, TransactionAttributes.consumable); + } + } +} diff --git a/guru_app/lib/financial/product/product_store.dart b/guru_app/lib/financial/product/product_store.dart new file mode 100644 index 0000000..e54cac9 --- /dev/null +++ b/guru_app/lib/financial/product/product_store.dart @@ -0,0 +1,82 @@ +import 'package:guru_app/financial/product/product_model.dart'; + +/// Created by Haoyi on 6/1/21 + +class ProductStore { + final Map data = {}; + + ProductStore(); + + void putProduct(T item) { + data[item.productId] = item; + } + + void putAllProducts(List items) { + for (var item in items) { + putProduct(item); + } + } + + List getProducts(List ids) { + final result = []; + for (var id in ids) { + final item = getProduct(id); + if (item != null) { + result.add(item); + } + } + return result; + } + + T? getProduct(ProductId productId) { + return productId.isValid() ? data[productId] : null; + } + + bool existsProduct(ProductId productId) { + return productId.isValid() == true && data.containsKey(productId); + } + + bool existsProducts(List productIds) { + for (var productId in productIds) { + if (existsProduct(productId)) { + return true; + } + } + return false; + } + + T? getFirstProduct(List productIds) { + for (var productId in productIds) { + final product = getProduct(productId); + if (product != null) { + return product; + } + } + return null; + } + + // Map> filterUncertaintyProductIds(List productIds) { + // final uncertaintyIds = >{}; + // + // for (ProductId productId in productIds) { + // final id = productId.platformProductId; + // if (!data.containsKey(id)) { + // IapType iapType = IapType.Product; + // if (PurchaseUtils.isSubscriptionProductId(id)) { + // iapType = IapType.Subscription; + // } + // List ids = uncertaintyIds[iapType]; + // if (ids == null) { + // ids = []; + // uncertaintyIds[iapType] = ids; + // } + // ids.add(id); + // } + // } + // return uncertaintyIds; + // } + + ProductStore clone() { + return ProductStore()..data.addAll(data); + } +} diff --git a/guru_app/lib/financial/reward/reward_manager.dart b/guru_app/lib/financial/reward/reward_manager.dart new file mode 100644 index 0000000..85a5347 --- /dev/null +++ b/guru_app/lib/financial/reward/reward_manager.dart @@ -0,0 +1,69 @@ +import 'package:guru_app/database/guru_db.dart'; +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/asset/assets_store.dart'; +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest_manager.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_app/financial/reward/reward_model.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_utils/extensions/extensions.dart'; + +/// Created by Haoyi on 2023/2/13 + +class RewardManager { + static final RewardManager _instance = RewardManager._(); + + static RewardManager get instance => _instance; + + RewardManager._(); + + final BehaviorSubject> _assetsStoreSubject = + BehaviorSubject.seeded(AssetsStore.inactive()); + + AssetsStore get rewardedStore => _assetsStoreSubject.value; + + Stream> get observableAssetStore => _assetsStoreSubject.stream; + + Future init() async { + await reloadAssets(); + } + + Future reloadAssets() async { + final transactions = await GuruDB.instance.selectOrders( + method: TransactionMethod.reward, attrs: [TransactionAttributes.asset]); + final newAssetsStore = AssetsStore(); + for (var transaction in transactions) { + final productId = transaction.productId; + Log.v("init [Rewards] transaction:${transaction.sku} $productId"); + newAssetsStore.addAsset(Asset(productId, transaction)); + } + _assetsStoreSubject.addEx(newAssetsStore); + } + + Future buildRewardProduct(TransactionIntent intent) async { + final manifest = await ManifestManager.instance.createManifest(intent); + return RewardProduct(intent.productId, manifest); + } + + Future claim(RewardProduct product, {String from = ""}) async { + Log.v("rewarded"); + // 如果得到的奖励是可消耗的物品(金币,Joker等),这里将直接领取成功 + if (product.productId.isConsumable) { + ManifestManager.instance.deliver(product.manifest, TransactionMethod.reward); + return true; + } + + final order = product.createOrder(); + final result = await GuruDB.instance.upsertOrder(order: order).catchError((error, stacktrace) { + Log.v("refreshTransaction error!$error $stacktrace"); + return false; + }); + if (result) { + final newAssetsStore = rewardedStore.clone(); + newAssetsStore.addAsset(Asset(product.productId, order)); + _assetsStoreSubject.addEx(newAssetsStore); + } + ManifestManager.instance.deliver(product.manifest, TransactionMethod.reward); + return result; + } +} diff --git a/guru_app/lib/financial/reward/reward_model.dart b/guru_app/lib/financial/reward/reward_model.dart new file mode 100644 index 0000000..9c330c7 --- /dev/null +++ b/guru_app/lib/financial/reward/reward_model.dart @@ -0,0 +1,44 @@ +import 'package:guru_app/financial/asset/assets_model.dart'; +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/id/id_utils.dart'; + +/// Created by Haoyi on 2023/2/13 + +class RewardProduct implements Product { + @override + final ProductId productId; + + @override + final Manifest manifest; + + String get sku => productId.sku; + + RewardProduct(this.productId, this.manifest); + + bool isConsumable() { + return productId.isConsumable; + } + + @override + String toString() { + return 'IapProduct{productId: $productId}'; + } + + @override + OrderEntity createOrder() { + return OrderEntity( + orderId: IdUtils.uuidV4(), + sku: productId.sku, + state: TransactionState.success, + attr: productId.attr, + method: TransactionMethod.reward.index, + currency: TransactionCurrency.reward, + cost: 0, + category: manifest.category, + timestamp: DateTimeUtils.currentTimeInMillis(), + manifest: manifest); + } +} diff --git a/guru_app/lib/firebase/dxlinks/dxlink_manager.dart b/guru_app/lib/firebase/dxlinks/dxlink_manager.dart new file mode 100644 index 0000000..1965cfe --- /dev/null +++ b/guru_app/lib/firebase/dxlinks/dxlink_manager.dart @@ -0,0 +1,65 @@ +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:flutter/services.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_navigator/guru_navigator.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/router/router.dart'; +import 'package:guru_utils/uri/uri_utils.dart'; + +/// Created by Haoyi on 5/20/21 + +class DxLinkManager { + static final DxLinkManager instance = DxLinkManager._(); + + DxLinkManager._(); + + void initDynamicLinks() async { + FirebaseDynamicLinks.instance.onLink.listen((PendingDynamicLinkData? dynamicLink) async { + final Uri? deepLink = dynamicLink?.link; + Log.d("### onDynamicLink $deepLink"); + if (deepLink != null) { + _openLink(deepLink); + } + }, onError: (e) async { + Log.w('onLinkError ${e.message} ${e.stacktrace}', error: e); + }); + + final PendingDynamicLinkData? data = + await FirebaseDynamicLinks.instance.getInitialLink().catchError((error, stacktrace) { + Log.d("getInitialLink error:$error $stacktrace"); + }); + final Uri? deepLink = data?.link; + Log.d("initDynamicLinks: $deepLink"); + if (deepLink != null) { + Future.delayed(const Duration(seconds: 2), () => _openLink(deepLink)); + } + } + + Future _handleDeeplink(MethodCall call) async { + Log.d("call.method: ${call.method} arguments:${call.arguments}"); + switch (call.method) { + case "navigate": + final uri = Uri.parse(call.arguments["uri"]); + if ((uri.authority.isNotEmpty != true) || + uri.toString().contains(GuruApp.instance.appSpec.details.authority)) { + _openLink(uri); + } else { + UriUtils.launchURL(uri); + } + } + return true; + } + + void initDeeplink() async { + GuruNavigator.init(_handleDeeplink); + } + + void init() async { + initDeeplink(); + initDynamicLinks(); + } + + void _openLink(Uri uri) { + RouteCenter.instance.dispatchUri(uri); + } +} diff --git a/guru_app/lib/firebase/firebase.dart b/guru_app/lib/firebase/firebase.dart new file mode 100644 index 0000000..4e7cd2a --- /dev/null +++ b/guru_app/lib/firebase/firebase.dart @@ -0,0 +1,7 @@ +library guru_firebase; + +/// Created by Haoyi on 2022/8/31 +export 'remoteconfig/remote_config_manager.dart'; +export 'messaging/remote_messaging_manager.dart'; +export 'package:firebase_messaging/firebase_messaging.dart'; + diff --git a/guru_app/lib/firebase/firestore/account/account_extension.dart b/guru_app/lib/firebase/firestore/account/account_extension.dart new file mode 100644 index 0000000..8ac701c --- /dev/null +++ b/guru_app/lib/firebase/firestore/account/account_extension.dart @@ -0,0 +1,31 @@ +/// Created by Haoyi on 2021/7/28 + +part of '../firestore_manager.dart'; + +extension AccountExtension on FirestoreManager { + String get userCollection { + if (kReleaseMode) { + return "users"; + } else { + return "test_users"; + } + } + + Future modifyProfile(Map modifyJson) async { + final uid = AccountDataStore.instance.uid; + if (uid == null || modifyJson.isEmpty) { + Log.i("modifyProfile error! uid is null!"); + return null; + } + modifyJson.remove(AccountProfile.dirtyField); + // if (Settings.instance.debugMode.get() != true) { + await FirebaseFirestore.instance + .collection(userCollection) + .doc(uid) + .set(modifyJson, SetOptions(merge: true /*mergeFields: modifyJson.keys.toList()*/)); + // } + modifyJson[AccountProfile.dirtyField] = false; + return AccountDataStore.instance.accountProfile?.merge(modifyJson) ?? + AccountProfile.fromJson(modifyJson); + } +} diff --git a/guru_app/lib/firebase/firestore/firestore_manager.dart b/guru_app/lib/firebase/firestore/firestore_manager.dart new file mode 100644 index 0000000..2a89af0 --- /dev/null +++ b/guru_app/lib/firebase/firestore/firestore_manager.dart @@ -0,0 +1,15 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/foundation.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/account/model/account_profile.dart'; +import 'package:guru_utils/log/log.dart'; + +/// Created by Haoyi on 2022/9/1 + +part 'account/account_extension.dart'; + +class FirestoreManager { + static final FirestoreManager instance = FirestoreManager._(); + + FirestoreManager._(); +} diff --git a/guru_app/lib/firebase/messaging/remote_messaging_manager.dart b/guru_app/lib/firebase/messaging/remote_messaging_manager.dart new file mode 100644 index 0000000..7924d21 --- /dev/null +++ b/guru_app/lib/firebase/messaging/remote_messaging_manager.dart @@ -0,0 +1,453 @@ +import 'dart:async'; +import 'dart:io'; +import 'dart:ui'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/services.dart'; +import 'package:guru_app/account/account_manager.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/lifecycle/lifecycle_model.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_utils/controller/lifecycle_controller.dart'; +import 'package:guru_utils/lifecycle/lifecycle_manager.dart'; +import 'package:guru_utils/router/router.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/math/math_utils.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:json_annotation/json_annotation.dart'; + +/// Created by Haoyi on 5/14/21 +// +Future _backgroundMessageHandler(RemoteMessage message) async { + Log.d("_backgroundMessageHandler:${message.data} ${message.data["uri"]}"); + return; +} + +enum RationaleResult { skip, allow } + +enum PromptTrigger { + @JsonValue(0) + rationale, // 依赖Android原生的shouldShowRequestRationale返回值来展示对应的Rationale页面 + @JsonValue(1) + request // 依赖请求的次数来展示对应的Rationale页面 +} + +class RemoteMessagingManager { + static RemoteMessagingManager instance = RemoteMessagingManager._(); + + late FirebaseMessaging _firebaseMessaging; + + final BehaviorSubject fcmToken = BehaviorSubject.seeded(null); + + Stream get observableFCMToken => fcmToken.stream; + + RemoteMessagingManager._(); + + int _retryFetchTokenCount = 0; + + final _statusMap = { + AuthorizationStatus.authorized: "granted", + AuthorizationStatus.denied: "denied", + AuthorizationStatus.provisional: "provisional", + AuthorizationStatus.notDetermined: "not_determined" + }; + + String? _getUriLastSegment(String? uri) { + try { + return Uri.parse(uri ?? "").pathSegments.last; + } catch (error) { + return null; + } + } + + void fetchToken({Completer? completer}) async { + Log.d("Fetch FCMToken!!"); + String? token; + try { + token = await _firebaseMessaging.getToken(); + if (token != null) { + fcmToken.addEx(token); + // RuntimeProperty.instance.setString("firebase_push_token", token); + Log.d("### FCMToken :$token"); + } + } catch (error, stacktrace) { + Log.d("fetchToken error!", error: error, stackTrace: stacktrace); + } + if (token == null || token == '') { + final intervalSeconds = + (MathUtils.fibonacci(_retryFetchTokenCount) * 8).clamp(8, 600); + Future.delayed(Duration(seconds: intervalSeconds), () { + fetchToken(); + }); + _retryFetchTokenCount++; + } else { + _retryFetchTokenCount = 0; + completer?.complete(Future.value(token)); + } + } + + Future getToken() async { + final result = fcmToken.value ?? (await _firebaseMessaging.getToken()); + if (result != null && fcmToken.value == null) { + fcmToken.addEx(result); + } + return result; + } + + void init() async { + _firebaseMessaging = FirebaseMessaging.instance; + final granted = await checkNotificationPermission(); + if (!granted) { + Future.delayed(const Duration(seconds: 8), () async { + if (GuruApp + .instance.appSpec.deployment.autoRequestNotificationPermission) { + Log.d("guru_app auto request notification permissions!"); + requestNotificationPermission(); + } else { + Log.d("guru_app check notification permissions!"); + final shouldShowRequestRationale = + await Permission.notification.shouldShowRequestRationale; + Log.d( + "guru_app post request notification permission event! shouldShowRequestRationale:$shouldShowRequestRationale"); + LifecycleManager.instance.postEvent( + RequestNotificationPermissionEvent( + rationale: shouldShowRequestRationale)); + } + }); + } + + FirebaseMessaging.instance.getInitialMessage().then((message) { + if (message != null) { + final uri = message.data["uri"]; + if (uri != null && uri is String && uri.isNotEmpty) { + Log.d("getInitialMessage:${message.data} $uri"); + RouteCenter.instance.dispatchUri(Uri.parse(uri)); + } + } + }); + FirebaseMessaging.onMessage.listen((message) { + Log.d("onMessage:${message.data}"); + final data = message.data; + + // final notification = message.notification; + // if (Platform.isAndroid && notification != null) { + // NotificationChannel.showNotification( + // NotificationChannel.pushType, {"title": notification.title, "body": notification.body, "cmd": data["cmd"], "uri": data["uri"]}); + // } + GuruAnalytics.instance.logEventEx("push_receive", + itemCategory: data["cmd"], itemName: _getUriLastSegment(data["uri"])); + }); + + FirebaseMessaging.onMessageOpenedApp.listen((message) { + final uri = message.data["uri"]; + if (uri != null && uri is String && uri.isNotEmpty) { + Log.d("onMessageOpenApp:${message.data} ${message.data["uri"]}"); + RouteCenter.instance.dispatchUri(Uri.parse(message.data["uri"])); + } + }); + _firebaseMessaging.onTokenRefresh.listen((event) { + Log.d("onTokenRefresh $event"); + AccountManager.instance.refreshFcmToken(); + // Injector.provide().refreshFcmToken(); + }); + fetchToken(); + } + + Future checkNotificationPermission() async { + final _map = { + AuthorizationStatus.authorized: "granted", + AuthorizationStatus.denied: "denied", + AuthorizationStatus.provisional: "provisional", + AuthorizationStatus.notDetermined: "not_determined" + }; + final notificationSettings = + await _firebaseMessaging.getNotificationSettings(); + final property = _map[notificationSettings.authorizationStatus]; + if (property != null) { + GuruAnalytics.instance.setUserProperty("noti_perm", property); + } else { + GuruAnalytics.instance.setUserProperty("noti_perm", "not_determined"); + } + return notificationSettings.authorizationStatus == + AuthorizationStatus.authorized; + } + + Future getNotificationAuthorizationStatus() async { + final notificationSettings = + await _firebaseMessaging.getNotificationSettings(); + return notificationSettings.authorizationStatus; + } + + Future isShouldShowRequestRationale() async { + if (GuruApp + .instance.appSpec.deployment.notificationPermissionPromptTrigger == + PromptTrigger.rationale) { + return await Permission.notification.shouldShowRequestRationale; + } + + if (await Permission.notification.isGranted) { + return false; + } + final permanentlyDenied = await Permission.notification.isPermanentlyDenied; + if (permanentlyDenied) { + return false; + } + int deniedTimes = await AppProperty.getInstance() + .getInt(PropertyKeys.deniedNotificationPermissionTimes, defValue: 0); + if (deniedTimes >= 2) { + return false; + } + + final requestTimes = await AppProperty.getInstance() + .getInt(PropertyKeys.requestNotificationPermissionTimes, defValue: 0); + return requestTimes >= 1; + } + + Future _requestNotificationPermissionForAndroid( + {String style = "default", + String scene = "", + Completer Function()? showRationale}) async { + final PromptTrigger promptTrigger = + GuruApp.instance.appSpec.deployment.notificationPermissionPromptTrigger; + + if (await Permission.notification.isGranted) { + GuruAnalytics.instance.setUserProperty("noti_perm", "granted"); + return true; + } else { + final permanentlyDenied = + await Permission.notification.isPermanentlyDenied; + if (permanentlyDenied) { + GuruAnalytics.instance.setUserProperty("noti_perm", "denied"); + return false; + } + int deniedTimes = await AppProperty.getInstance() + .getInt(PropertyKeys.deniedNotificationPermissionTimes, defValue: 0); + if (deniedTimes >= 2) { + GuruAnalytics.instance.setUserProperty("noti_perm", "denied"); + return false; + } + + final promptTriggerValue = + promptTrigger == PromptTrigger.rationale ? "a" : "b"; + + final requestTimes = await AppProperty.getInstance().increaseAndGet( + PropertyKeys.requestNotificationPermissionTimes, + defValue: 0); + + final trackingNotificationPermissionPass = GuruApp + .instance.appSpec.deployment.trackingNotificationPermissionPass && + requestTimes < + (GuruApp.instance.appSpec.deployment + .trackingNotificationPermissionPassLimitTimes); + + if (trackingNotificationPermissionPass) { + GuruAnalytics.instance.logEventEx("noti_perm_req_$requestTimes", + itemCategory: style, + itemName: scene, + parameters: { + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": promptTriggerValue + }); + } + + final shouldShowRequestRationale = + await Permission.notification.shouldShowRequestRationale || + (promptTrigger == PromptTrigger.request && requestTimes > 1); + + Log.d( + "_requestNotificationPermission requestTimes:$requestTimes deniedTimes:$deniedTimes trackingNotificationPermissionPass:$trackingNotificationPermissionPass promptTrigger:$promptTrigger shouldShowRequestRationale:$shouldShowRequestRationale "); + + if (shouldShowRequestRationale && showRationale != null) { + GuruAnalytics.instance.logEventEx("noti_perm_rationale_imp", + itemCategory: style, itemName: scene); + RationaleResult rationaleResult = RationaleResult.skip; + try { + final completer = showRationale(); + rationaleResult = await completer.future; + } catch (error, stacktrace) { + Log.d("showRationale error!", error: error, stackTrace: stacktrace); + } + GuruAnalytics.instance.logEventEx("noti_perm_rationale_result", + itemCategory: style, + itemName: scene, + parameters: { + "result": + rationaleResult == RationaleResult.allow ? "allow" : "skip", + }); + if (rationaleResult == RationaleResult.skip) { + return false; + } + } + + final showTimes = await AppProperty.getInstance().increaseAndGet( + PropertyKeys.showNotificationPermissionTimes, + defValue: 0); + + GuruAnalytics.instance.logEventEx("noti_perm_imp", + itemCategory: style, + itemName: scene, + parameters: { + "show_times": showTimes, + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": promptTriggerValue + }); + final requestSettings = await _firebaseMessaging.requestPermission(); + final result = + _statusMap[requestSettings.authorizationStatus] ?? "not_determined"; + await GuruAnalytics.instance.setUserProperty("noti_perm", result); + + if (requestSettings.authorizationStatus != + AuthorizationStatus.authorized) { + final shouldShowRequestRationale2 = + await Permission.notification.shouldShowRequestRationale; + if (deniedTimes == 0 && shouldShowRequestRationale2) { + deniedTimes = 1; + await AppProperty.getInstance() + .setInt(PropertyKeys.deniedNotificationPermissionTimes, 1); + } else if (deniedTimes == 1 && + shouldShowRequestRationale != shouldShowRequestRationale2) { + deniedTimes = 2; + await AppProperty.getInstance() + .setInt(PropertyKeys.deniedNotificationPermissionTimes, 2); + } + } else { + if (trackingNotificationPermissionPass) { + GuruAnalytics.instance.logEventEx("noti_perm_pass_$requestTimes", + itemCategory: style, + itemName: scene, + parameters: { + "show_times": showTimes, + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": promptTriggerValue + }); + } + } + + GuruAnalytics.instance.logEventEx("noti_perm_result", + itemCategory: style, + itemName: scene, + parameters: { + "result": result, + "show_times": showTimes, + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": promptTriggerValue + }); + + Log.d( + "notificationSettings.authorizationStatus:${requestSettings.authorizationStatus} showTimes:$requestTimes deniedTimes:$deniedTimes promptTrigger: $promptTrigger"); + return requestSettings.authorizationStatus == + AuthorizationStatus.authorized; + } + } + + Future _requestNotificationPermissionForIOS( + {String style = "default", String scene = ""}) async { + final status = await getNotificationAuthorizationStatus(); + switch (status) { + case AuthorizationStatus.authorized: + GuruAnalytics.instance.setUserProperty("noti_perm", "granted"); + return true; + case AuthorizationStatus.provisional: + GuruAnalytics.instance.setUserProperty("noti_perm", "provisional"); + return true; + case AuthorizationStatus.denied: + GuruAnalytics.instance.setUserProperty("noti_perm", "denied"); + return false; + default: + break; + } + + final trackingNotificationPermissionPass = + GuruApp.instance.appSpec.deployment.trackingNotificationPermissionPass; + + int deniedTimes = await AppProperty.getInstance() + .getInt(PropertyKeys.deniedNotificationPermissionTimes, defValue: 0); + + final requestTimes = await AppProperty.getInstance().increaseAndGet( + PropertyKeys.requestNotificationPermissionTimes, + defValue: 0); + final showTimes = await AppProperty.getInstance().increaseAndGet( + PropertyKeys.showNotificationPermissionTimes, + defValue: 0); + + if (trackingNotificationPermissionPass) { + GuruAnalytics.instance.logEventEx("noti_perm_req_$requestTimes", + itemCategory: style, + itemName: scene, + parameters: { + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": "a" + }); + } + + final requestSettings = await _firebaseMessaging.requestPermission(); + final result = + _statusMap[requestSettings.authorizationStatus] ?? "not_determined"; + await GuruAnalytics.instance.setUserProperty("noti_perm", result); + + if (requestSettings.authorizationStatus != AuthorizationStatus.authorized) { + deniedTimes += 1; + } else { + if (trackingNotificationPermissionPass) { + GuruAnalytics.instance.logEventEx("noti_perm_pass_$requestTimes", + itemCategory: style, + itemName: scene, + parameters: { + "show_times": showTimes, + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": "a" + }); + } + } + + GuruAnalytics.instance.logEventEx("noti_perm_result", + itemCategory: style, + itemName: scene, + parameters: { + "result": result, + "show_times": showTimes, + "request_times": requestTimes, + "denied_times": deniedTimes, + "prompt_trigger": "a" + }); + Log.d( + "notificationSettings.authorizationStatus:${requestSettings.authorizationStatus} showTimes:$requestTimes deniedTimes:$deniedTimes"); + return requestSettings.authorizationStatus == + AuthorizationStatus.authorized; + } + + Future requestNotificationPermission( + {String style = "default", + String scene = "", + Completer Function()? showRationale}) async { + if (Platform.isAndroid) { + return _requestNotificationPermissionForAndroid( + style: style, scene: scene, showRationale: showRationale); + } else if (Platform.isIOS) { + return _requestNotificationPermissionForIOS(style: style, scene: scene); + } + return false; + } + + void saveTokenToClipboard() { + final token = fcmToken.value; + if (token != null) { + Clipboard.setData(ClipboardData(text: token)); + Log.d("saveTokenToClipboard:$token"); + } + } + + void dispose() { + fcmToken.close(); + } +} diff --git a/guru_app/lib/firebase/remoteconfig/remote_config_interface.dart b/guru_app/lib/firebase/remoteconfig/remote_config_interface.dart new file mode 100644 index 0000000..1e37007 --- /dev/null +++ b/guru_app/lib/firebase/remoteconfig/remote_config_interface.dart @@ -0,0 +1,112 @@ +/// Created by Haoyi on 2022/2/26 + +part of "remote_config_manager.dart"; + +extension RemoteConfigInterface on RemoteConfigManager { + bool isIOSReview() { + if (Platform.isIOS) { + return getBool(RemoteConfigReservedConstants.iosReviewVersion, defaultValue: true) ?? true; + } else { + return false; + } + } + + CdnConfig getCdnConfig() { + final cdnConfigStr = getString(RemoteConfigReservedConstants.cdnConfig); + if (cdnConfigStr != null && cdnConfigStr.isNotEmpty) { + return CdnConfig.fromJson( + jsonDecode(cdnConfigStr), + defaultStoragePrefix: GuruApp.instance.details.storagePrefix, + defaultCdnPrefix: GuruApp.instance.details.defaultCdnPrefix, + ); + } + return CdnConfig.fromJson( + {}, + defaultStoragePrefix: GuruApp.instance.details.storagePrefix, + defaultCdnPrefix: GuruApp.instance.details.defaultCdnPrefix, + ); + } + + TaichiConfig? getTaichiConfig() { + final taichiStr = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.taichiConfig); + if (taichiStr != null && taichiStr.isNotEmpty) { + return TaichiConfig.fromJson(jsonDecode(taichiStr)); + } + return null; + } + + AdInterstitialConfig getIadsConfig() { + final iadsConfigStr = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.iadsConfig); + if (iadsConfigStr != null && iadsConfigStr.isNotEmpty) { + return AdInterstitialConfig.fromJson(jsonDecode(iadsConfigStr)); + } + return AdInterstitialConfig.fromJson({}); + } + + AdRewardedConfig getRadsConfig() { + final radsConfigStr = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.radsConfig); + if (radsConfigStr != null && radsConfigStr.isNotEmpty) { + return AdRewardedConfig.fromJson(jsonDecode(radsConfigStr)); + } + return AdRewardedConfig.fromJson({}); + } + + AdBannerConfig getBadsConfig() { + final badsConfigStr = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.badsConfig); + if (badsConfigStr != null && badsConfigStr.isNotEmpty) { + return AdBannerConfig.fromJson(jsonDecode(badsConfigStr)); + } + return AdBannerConfig.fromJson({}); + } + + StrategyAdsConfig getStrategyAdsConfig() { + final sadsConfigStr = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.sadsConfig); + if (sadsConfigStr != null && sadsConfigStr.isNotEmpty) { + return StrategyAdsConfig.fromJson(jsonDecode(sadsConfigStr)); + } + return StrategyAdsConfig.fromJson({}); + } + + IOSAttConfig getIOSAttConfig() { + final iosAttConfigString = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.iosAttConfig); + + if (iosAttConfigString != null && iosAttConfigString.isNotEmpty) { + return IOSAttConfig.fromJson(jsonDecode(iosAttConfigString)); + } + return IOSAttConfig.fromJson({}); + } + + CommonAdsConfig getCommonAdsConfig() { + final commonAdsConfigString = + RemoteConfigManager.instance.getString(RemoteConfigReservedConstants.commonAdsConfig); + + if (commonAdsConfigString != null && commonAdsConfigString.isNotEmpty) { + return CommonAdsConfig.fromJson(jsonDecode(commonAdsConfigString)); + } + return CommonAdsConfig.fromJson({}); + } + + AnalyticsConfig getAnalyticsConfig() { + final analyticsConfigStr = + RemoteConfigUtils.instance.getString(RemoteConfigReservedConstants.analyticsConfig); + if (analyticsConfigStr != null && analyticsConfigStr.isNotEmpty) { + return AnalyticsConfig.fromJson(jsonDecode(analyticsConfigStr)); + } + return AnalyticsConfig.fromJson({}); + } + + RemoteDeployment getRemoteDeployment() { + final deploymentConfigStr = + RemoteConfigUtils.instance.getString(RemoteConfigReservedConstants.deploymentConfig); + if (deploymentConfigStr != null && deploymentConfigStr.isNotEmpty) { + return RemoteDeployment.fromJson(jsonDecode(deploymentConfigStr)); + } + return RemoteDeployment.fromJson({}); + } +} diff --git a/guru_app/lib/firebase/remoteconfig/remote_config_manager.dart b/guru_app/lib/firebase/remoteconfig/remote_config_manager.dart new file mode 100644 index 0000000..f4d2db9 --- /dev/null +++ b/guru_app/lib/firebase/remoteconfig/remote_config_manager.dart @@ -0,0 +1,209 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:firebase_remote_config/firebase_remote_config.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +import 'package:guru_app/analytics/data/analytics_model.dart'; +import 'package:guru_app/firebase/remoteconfig/reserved_remote_config_models.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_utils/http/http_model.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:rxdart/rxdart.dart'; +import 'package:guru_utils/remote/remote_config.dart'; + +part "remote_config_interface.dart"; + +/// Created by Haoyi on 2020/4/22 +/// +part "remote_config_reserved_constants.dart"; + +class RemoteConfigManager extends IRemoteConfig { + final BehaviorSubject _subject = + BehaviorSubject.seeded(null); + static RemoteConfigManager? _instance; + + static RemoteConfigManager _getInstance() { + _instance ??= RemoteConfigManager._internal(); + return _instance!; + } + + factory RemoteConfigManager() => _getInstance(); + + static RemoteConfigManager get instance => _getInstance(); + + static final RegExp _invalidABKey = RegExp('[^a-zA-Z0-9_-]'); + + RemoteConfigManager._internal(); + + Future init(Map defaultConfigs) async { + final remoteConfig = FirebaseRemoteConfig.instance; + await remoteConfig.setConfigSettings(RemoteConfigSettings( + fetchTimeout: const Duration(seconds: 15), + minimumFetchInterval: const Duration(hours: 2), + )); + + _subject.add(remoteConfig); + + try { + await remoteConfig.setDefaults(defaultConfigs); + await remoteConfig.activate(); + } catch (exception) { + Log.d( + "Unable to fetch remote config. Cached or default values will be used!", + error: exception); + } finally { + _subject.add(remoteConfig); + } + } + + Future fetchAndActivate() async { + final remoteConfig = FirebaseRemoteConfig.instance; + try { + await remoteConfig.fetchAndActivate(); + } catch (exception) { + Log.d( + "Unable to fetch remote config. Cached or default values will be used!", + error: exception); + } finally { + _subject.add(remoteConfig); + } + } + + Future dumpString() async { + final config = FirebaseRemoteConfig.instance; + final data = config.getAll(); + String result = ""; + for (var entry in data.entries) { + result += "[${entry.key}] ==> (${entry.value.asString()})\n"; + } + return result; + } + + static String valueSourceToString(ValueSource source) { + switch (source) { + case ValueSource.valueRemote: + return "Remote"; + case ValueSource.valueStatic: + return "Static"; + default: + return "Default"; + } + } + + Map allData() { + final config = FirebaseRemoteConfig.instance; + final data = config.getAll(); + final result = { + for (var entry in data.entries) + "${entry.key} [${valueSourceToString(entry.value.source)}]": + entry.value.asString() + }; + result["last_fetch_remote_config_time"] = config.lastFetchTime.toString(); + result["last_fetch_remote_config_status"] = + config.lastFetchStatus.toString(); + return result; + } + + Future forceFetch({bool debug = false}) async { + final remoteConfig = FirebaseRemoteConfig.instance; + try { + await remoteConfig.setConfigSettings(RemoteConfigSettings( + fetchTimeout: const Duration(seconds: 15), + minimumFetchInterval: const Duration(seconds: 0), + )); + await remoteConfig.fetchAndActivate(); + } catch (exception) { + Log.d( + "Unable to fetch remote config. Cached or default values will be used $exception", + error: exception); + if (debug) { + rethrow; + } + } finally { + _subject.add(remoteConfig); + await remoteConfig.setConfigSettings(RemoteConfigSettings( + fetchTimeout: const Duration(seconds: 15), + minimumFetchInterval: const Duration(hours: 2), + )); + } + } + + Map getABProperties() { + final config = FirebaseRemoteConfig.instance; + final data = config.getAll(); + final result = {}; + final invalidABKeys = {}; + dynamic cause; + for (var entry in data.entries) { + final valueStr = entry.value.asString(); + if (valueStr.contains("guru_ab_")) { + try { + final jsonValue = json.decode(valueStr); + if (jsonValue is Map) { + for (var jsonEntry in jsonValue.entries) { + if (jsonEntry.key.contains("guru_ab_")) { + String abName = jsonEntry.key.replaceFirst("guru_ab_", ""); + if (abName.contains(_invalidABKey)) { + Log.w("abName($abName) length is invalid! $abName"); + invalidABKeys.add(abName); + } else { + if (abName.length > 20) { + invalidABKeys.add(abName); + abName = abName.substring(0, 20); + } + result["ab_$abName"] = jsonEntry.value.toString(); + Log.i("abName:ab_$abName value:${jsonEntry.value}"); + } + } + } + } + } catch (error, stacktrace) { + Log.w("decode json error! $error"); + cause = error; + } + } + } + if (invalidABKeys.isNotEmpty) { + GuruAnalytics.instance.logException( + InvalidABPropertyKeysException(invalidABKeys, cause: cause)); + } + return result; + } + + @override + bool? getBool(String name, {bool? defaultValue}) => + _subject.value?.getBool(name) ?? defaultValue; + + @override + String? getString(String name, {String? defaultValue}) => + _subject.value?.getString(name) ?? + defaultValue ?? + RemoteConfigReservedConstants.getDefaultConfigString(name); + + @override + double? getDouble(String name, {double? defaultValue}) => + _subject.value?.getDouble(name) ?? defaultValue; + + @override + int? getInt(String name, {int? defaultValue}) => + _subject.value?.getInt(name) ?? defaultValue; + + Stream observeConfig() => + _subject.stream.map((config) => config ?? FirebaseRemoteConfig.instance); + + @override + Stream observeBool(String name, {bool? defaultValue}) => + observeConfig().map((config) => config.getBool(name)); + + @override + Stream observeString(String name, {String? defaultValue}) => + observeConfig().map((config) => config.getString(name)); + + @override + Stream observeDouble(String name, {double? defaultValue}) => + observeConfig().map((config) => config.getDouble(name)); + + @override + Stream observeInt(String name, {int? defaultValue}) => + observeConfig().map((config) => config.getInt(name)); +} diff --git a/guru_app/lib/firebase/remoteconfig/remote_config_reserved_constants.dart b/guru_app/lib/firebase/remoteconfig/remote_config_reserved_constants.dart new file mode 100644 index 0000000..97f94f4 --- /dev/null +++ b/guru_app/lib/firebase/remoteconfig/remote_config_reserved_constants.dart @@ -0,0 +1,46 @@ +/// Created by Haoyi on 2022/2/26 + +part of "remote_config_manager.dart"; + +extension RemoteConfigReservedConstants on RemoteConfigManager { + static const fbEventMapping = "fb_event_mapping"; + static const iosReviewVersion = "ios_review_version"; + static const taichiConfig = "taichi_config"; + + // ads + static const iadsConfig = "iads_config"; // Interstitial Ads Config + static const badsConfig = "bads_config"; // Banner Ads Config + static const radsConfig = "rads_config"; // Rewarded Ads Config + static const oadsConfig = "oads_config"; // Open Ads Config + static const sadsConfig = "sads_config"; // Strategy Ads Config + static const iosAttConfig = "ios_att_config"; // iOS ATT Config + static const commonAdsConfig = "common_ads_config"; // Common Ads Config + + // rater + static const appRater = "app_rater"; + + static const cdnConfig = "cdn_config"; + + static const analyticsConfig = "analytics_config"; + + static const deploymentConfig = "deployment_config"; + + static const Set _reservedRemoteConfigNames = { + fbEventMapping, + iosReviewVersion, + taichiConfig, + iadsConfig, + badsConfig, + radsConfig, + oadsConfig, + iosAttConfig, + appRater, + cdnConfig, + analyticsConfig, + deploymentConfig + }; + + static String? getDefaultConfigString(String key) { + return GuruApp.instance.defaultRemoteConfig[key]; + } +} diff --git a/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.dart b/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.dart new file mode 100644 index 0000000..5b458a4 --- /dev/null +++ b/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.dart @@ -0,0 +1,131 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:guru_app/ads/core/ads_config.dart'; +export 'package:guru_app/ads/core/ads_config.dart'; +/// Created by Haoyi on 2022/8/25 +/// +part 'reserved_remote_config_models.g.dart'; + +// @JsonSerializable() +// class TaichiConfig { +// @JsonKey(name: "enable", defaultValue: false) +// final bool enable; +// +// @JsonKey(name: "threshold", defaultValue: "") +// final String threshold; +// +// @JsonKey(name: "abnormal_threshold", defaultValue: 0.1) +// final double abnormalThreshold; +// +// TaichiConfig( +// {this.enable = false, this.threshold = "", this.abnormalThreshold = 0.1}); +// +// factory TaichiConfig.fromJson(Map json) => +// _$TaichiConfigFromJson(json); +// +// @override +// String toString() { +// return 'TaichiConfig{enable: $enable, threshold: $threshold}'; +// } +// +// Map toJson() => _$TaichiConfigToJson(this); +// } + +@JsonSerializable() +class ImpressionData { + @JsonKey(name: "ad_platform", defaultValue: "MAX") + final String platform; + + @JsonKey(name: "id", defaultValue: "") + final String id; + + @JsonKey(name: "adunit_id", defaultValue: "") + final String unitId; + + @JsonKey(name: "adunit_name", defaultValue: "") + final String unitName; + + @JsonKey(name: "adunit_format", defaultValue: "") + final String unitFormat; + + @JsonKey(name: "adgroup_id", defaultValue: "") + final String groupId; + + @JsonKey(name: "adgroup_name", defaultValue: "") + final String groupName; + + @JsonKey(name: "adgroup_type", defaultValue: "") + final String groupType; + + @JsonKey(name: "currency", defaultValue: "") + final String currency; + + @JsonKey(name: "country", defaultValue: "") + final String country; + + @JsonKey(name: "app_version", defaultValue: "") + final String appVersion; + + @JsonKey(name: "adgroup_priority", defaultValue: 0) + final int groupPriority; + + @JsonKey(name: "publisher_revenue", defaultValue: -1) + final double publisherRevenue; + + @JsonKey(name: "network_name", defaultValue: "") + final String networkName; + + @JsonKey(name: "network_placement_id", defaultValue: "") + final String networkPlacementId; + + @JsonKey(name: "precision", defaultValue: "") + final String precision; + + @JsonKey(ignore: true) + late Map payload; + + ImpressionData derive({double? newPublisherRevenue}) { + final newPayload = Map.from(payload); + newPayload["publisher_revenue"] = newPublisherRevenue ?? publisherRevenue; + return ImpressionData.fromJson(newPayload); + } + + @override + String toString() { + return 'ImpressionData{platform: $platform, id: $id, unitId: $unitId, unitName: $unitName, unitFormat: $unitFormat, groupId: $groupId, groupName: $groupName, groupType: $groupType, currency: $currency, country: $country, appVersion: $appVersion, groupPriority: $groupPriority, publisherRevenue: $publisherRevenue, networkName: $networkName, networkPlacementId: $networkPlacementId, precision: $precision}'; + } + + ImpressionData( + {required this.platform, + required this.id, + required this.unitId, + required this.unitName, + required this.unitFormat, + required this.groupId, + required this.groupName, + required this.groupType, + required this.currency, + required this.country, + required this.appVersion, + required this.groupPriority, + required this.publisherRevenue, + required this.networkName, + required this.networkPlacementId, + required this.precision}); + + factory ImpressionData.fromJson(Map json) => + _$ImpressionDataFromJson(json)..payload = json; + + Map toJson() => _$ImpressionDataToJson(this); +} + +class InvalidABPropertyKeysException implements Exception { + final Set invalidKeys; + final dynamic cause; + + InvalidABPropertyKeysException(this.invalidKeys, {this.cause}); + + @override + String toString() { + return "InvalidABPropertyKeysException: $invalidKeys cause:$cause"; + } +} diff --git a/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.g.dart b/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.g.dart new file mode 100644 index 0000000..74ef2d4 --- /dev/null +++ b/guru_app/lib/firebase/remoteconfig/reserved_remote_config_models.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'reserved_remote_config_models.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ImpressionData _$ImpressionDataFromJson(Map json) => + ImpressionData( + platform: json['ad_platform'] as String? ?? 'MAX', + id: json['id'] as String? ?? '', + unitId: json['adunit_id'] as String? ?? '', + unitName: json['adunit_name'] as String? ?? '', + unitFormat: json['adunit_format'] as String? ?? '', + groupId: json['adgroup_id'] as String? ?? '', + groupName: json['adgroup_name'] as String? ?? '', + groupType: json['adgroup_type'] as String? ?? '', + currency: json['currency'] as String? ?? '', + country: json['country'] as String? ?? '', + appVersion: json['app_version'] as String? ?? '', + groupPriority: json['adgroup_priority'] as int? ?? 0, + publisherRevenue: (json['publisher_revenue'] as num?)?.toDouble() ?? -1, + networkName: json['network_name'] as String? ?? '', + networkPlacementId: json['network_placement_id'] as String? ?? '', + precision: json['precision'] as String? ?? '', + ); + +Map _$ImpressionDataToJson(ImpressionData instance) => + { + 'ad_platform': instance.platform, + 'id': instance.id, + 'adunit_id': instance.unitId, + 'adunit_name': instance.unitName, + 'adunit_format': instance.unitFormat, + 'adgroup_id': instance.groupId, + 'adgroup_name': instance.groupName, + 'adgroup_type': instance.groupType, + 'currency': instance.currency, + 'country': instance.country, + 'app_version': instance.appVersion, + 'adgroup_priority': instance.groupPriority, + 'publisher_revenue': instance.publisherRevenue, + 'network_name': instance.networkName, + 'network_placement_id': instance.networkPlacementId, + 'precision': instance.precision, + }; diff --git a/guru_app/lib/generated/intl/messages_all.dart b/guru_app/lib/generated/intl/messages_all.dart new file mode 100644 index 0000000..203415c --- /dev/null +++ b/guru_app/lib/generated/intl/messages_all.dart @@ -0,0 +1,63 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that looks up messages for specific locales by +// delegating to the appropriate library. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:implementation_imports, file_names, unnecessary_new +// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering +// ignore_for_file:argument_type_not_assignable, invalid_assignment +// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases +// ignore_for_file:comment_references + +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; +import 'package:intl/src/intl_helpers.dart'; + +import 'messages_en.dart' as messages_en; + +typedef Future LibraryLoader(); +Map _deferredLibraries = { + 'en': () => new SynchronousFuture(null), +}; + +MessageLookupByLibrary? _findExact(String localeName) { + switch (localeName) { + case 'en': + return messages_en.messages; + default: + return null; + } +} + +/// User programs should call this before using [localeName] for messages. +Future initializeMessages(String localeName) { + var availableLocale = Intl.verifiedLocale( + localeName, (locale) => _deferredLibraries[locale] != null, + onFailure: (_) => null); + if (availableLocale == null) { + return new SynchronousFuture(false); + } + var lib = _deferredLibraries[availableLocale]; + lib == null ? new SynchronousFuture(false) : lib(); + initializeInternalMessageLookup(() => new CompositeMessageLookup()); + messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor); + return new SynchronousFuture(true); +} + +bool _messagesExistFor(String locale) { + try { + return _findExact(locale) != null; + } catch (e) { + return false; + } +} + +MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { + var actualLocale = + Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null); + if (actualLocale == null) return null; + return _findExact(actualLocale); +} diff --git a/guru_app/lib/generated/intl/messages_en.dart b/guru_app/lib/generated/intl/messages_en.dart new file mode 100644 index 0000000..a029099 --- /dev/null +++ b/guru_app/lib/generated/intl/messages_en.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a en locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'en'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/guru_app/lib/generated/l10n.dart b/guru_app/lib/generated/l10n.dart new file mode 100644 index 0000000..7d72d31 --- /dev/null +++ b/guru_app/lib/generated/l10n.dart @@ -0,0 +1,78 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'intl/messages_all.dart'; + +// ************************************************************************** +// Generator: Flutter Intl IDE plugin +// Made by Localizely +// ************************************************************************** + +// ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars +// ignore_for_file: join_return_with_assignment, prefer_final_in_for_each +// ignore_for_file: avoid_redundant_argument_values, avoid_escaping_inner_quotes + +class S { + S(); + + static S? _current; + + static S get current { + assert(_current != null, + 'No instance of S was loaded. Try to initialize the S delegate before accessing S.current.'); + return _current!; + } + + static const AppLocalizationDelegate delegate = AppLocalizationDelegate(); + + static Future load(Locale locale) { + final name = (locale.countryCode?.isEmpty ?? false) + ? locale.languageCode + : locale.toString(); + final localeName = Intl.canonicalizedLocale(name); + return initializeMessages(localeName).then((_) { + Intl.defaultLocale = localeName; + final instance = S(); + S._current = instance; + + return instance; + }); + } + + static S of(BuildContext context) { + final instance = S.maybeOf(context); + assert(instance != null, + 'No instance of S present in the widget tree. Did you add S.delegate in localizationsDelegates?'); + return instance!; + } + + static S? maybeOf(BuildContext context) { + return Localizations.of(context, S); + } +} + +class AppLocalizationDelegate extends LocalizationsDelegate { + const AppLocalizationDelegate(); + + List get supportedLocales { + return const [ + Locale.fromSubtags(languageCode: 'en'), + ]; + } + + @override + bool isSupported(Locale locale) => _isSupported(locale); + @override + Future load(Locale locale) => S.load(locale); + @override + bool shouldReload(AppLocalizationDelegate old) => false; + + bool _isSupported(Locale locale) { + for (var supportedLocale in supportedLocales) { + if (supportedLocale.languageCode == locale.languageCode) { + return true; + } + } + return false; + } +} diff --git a/guru_app/lib/guru_app.dart b/guru_app/lib/guru_app.dart new file mode 100644 index 0000000..dd0bcf7 --- /dev/null +++ b/guru_app/lib/guru_app.dart @@ -0,0 +1,344 @@ +import 'dart:io'; +import 'dart:io'; + +import 'package:adjust_sdk/adjust_event.dart'; +import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:guru_app/account/account_data_store.dart'; +import 'package:guru_app/account/account_manager.dart'; +import 'package:guru_app/ads/ads_manager.dart'; +import 'package:guru_app/analytics/guru_analytics.dart'; +import 'package:guru_app/app/app_models.dart'; +import 'package:guru_app/database/guru_db.dart'; +import 'package:guru_app/financial/financial_manager.dart'; +import 'package:guru_app/financial/iap/iap_manager.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/financial/manifest/manifest_manager.dart'; +import 'package:guru_app/financial/product/product_model.dart'; +import 'package:guru_app/financial/reward/reward_manager.dart'; +import 'package:guru_app/firebase/dxlinks/dxlink_manager.dart'; +import 'package:guru_applovin_flutter/guru_applovin_flutter.dart'; +import 'package:guru_utils/collection/collectionutils.dart'; +import 'package:guru_utils/controller/aware/ads/overlay/ads_overlay.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/lifecycle/lifecycle_manager.dart'; +import 'package:guru_utils/network/network_utils.dart'; +import 'package:guru_utils/property/app_property.dart'; +import 'package:guru_app/property/settings/guru_settings.dart'; +import 'package:guru_app/firebase/firebase.dart'; +import 'package:guru_utils/http/http_ex.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/packages/guru_package.dart'; +import 'package:guru_utils/ads/ads.dart'; +import 'package:guru_utils/guru_utils.dart'; +import 'package:logger/logger.dart' as Logger; +import 'package:guru_utils/aigc/bi/ai_bi.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:guru_popup/guru_popup.dart'; +export 'package:firebase_core/firebase_core.dart'; +export 'package:guru_app/app/app_models.dart'; +export 'package:guru_utils/log/log.dart'; +export 'package:guru_spec/guru_spec.dart'; +export 'package:guru_app/analytics/guru_analytics.dart'; +export 'package:guru_app/financial/product/product_model.dart'; +export 'package:adjust_sdk/adjust_event.dart'; +export 'package:guru_utils/ads/ads.dart'; +export 'package:guru_utils/guru_utils.dart'; +export 'dart:io'; +export 'dart:math'; +export 'package:guru_app/financial/manifest/manifest.dart'; +export 'package:guru_app/firebase/messaging/remote_messaging_manager.dart'; + + +/// Created by Haoyi on 2022/8/25 + +abstract class AppSpec { + String get appName; + + String get flavor; + + AppDetails get details; + + AdsProfile get adsProfile; + + ProductProfile get productProfile; + + AdjustProfile get adjustProfile; + + Deployment get deployment; + + Map get defaultRemoteConfig; +} + +class NotImplementationAppSpecCreatorException implements Exception { + NotImplementationAppSpecCreatorException(); + + @override + String toString() { + return 'NotImplementationAppSpecCreatorException'; + } +} + +class AppEnv { + final AppSpec spec; + final RootPackage package; + final BackgroundMessageHandler? backgroundMessageHandler; + final ToastDelegate? toastDelegate; + + AppEnv( + {required this.spec, + required this.package, + this.backgroundMessageHandler, + this.toastDelegate}); +} + +extension _GuruPackageExtension on GuruPackage { + Iterable _mergeSupportedLocales() { + final Set locales = supportedLocales.toSet(); + for (var child in children) { + locales.addAll(child._mergeSupportedLocales()); + } + return locales; + } + + Iterable> _mergeLocalizationsDelegates() { + final Set> delegates = localizationsDelegates.toSet(); + for (var child in children) { + delegates.addAll(child._mergeLocalizationsDelegates()); + } + return delegates; + } + + Future _dispatchInitialize() async { + await initialize(); + children.sort((p1, p2) { + return p2.priority.compareTo(p1.priority); + }); + for (var child in children) { + if (flattenChildrenAsyncInit) { + child._dispatchInitialize(); + } else { + await child._dispatchInitialize(); + } + } + } + + Future _dispatchInitializeAsync() async { + initializeAsync(); + for (var child in children) { + child._dispatchInitializeAsync(); + } + } +} + +class GuruApp { + static late GuruApp _instance; + + static GuruApp get instance => _instance; + + final RootPackage rootPackage; + + final AppSpec appSpec; + + String get appName => appSpec.appName; + + String get flavor => appSpec.flavor; + + AppDetails get details => appSpec.details; + + AdsProfile get adsProfile => appSpec.adsProfile; + + AdjustProfile get adjustProfile => appSpec.adjustProfile; + + ProductProfile get productProfile => appSpec.productProfile; + + Map get defaultRemoteConfig => appSpec.defaultRemoteConfig; + + Set get conversionEvents => appSpec.deployment.conversionEvents; + + GuruApp._({required this.appSpec, required this.rootPackage, ToastDelegate? toastDelegate}) { + GuruUtils.toastDelegate = toastDelegate; + AdsOverlay.bind(showBanner: GuruPopup.instance.showAdsBanner); + } + + Iterable get supportedLocales => rootPackage._mergeSupportedLocales(); + + Iterable> get localizationsDelegates => + rootPackage._mergeLocalizationsDelegates(); + + bool? _check; + + Future _initialize() async { + try { + await GuruDB.instance.initDatabase(); + AppProperty.initialize(GuruDB.instance, cacheSize: appSpec.deployment.propertyCacheSize); + await GuruSettings.instance.refresh(); + Paint.enableDithering = appSpec.deployment.enableDithering; // 3.16 default enabled + await _dispatchInitializeSync(); + _dispatchInitializeAsync(); + } catch (error, stacktrace) { + Log.w("initialize error:$error, $stacktrace"); + } + } + + Future _checkApp() async { + try { + final pkgName = (await PackageInfo.fromPlatform()).appName; + final result = _check ??= (pkgName != GuruApp.instance.details.appId); + GuruAnalytics.instance.logGuruEvent( + "dev_audit", + CollectionUtils.filterOutNulls({ + "item_category": "pkg", + "result": result == true ? 1 : 0, + "err_info": result != true ? pkgName : null, + })); + return result == true; + } catch (error, stacktrace) { + Log.w("checkApp error:$error, $stacktrace"); + GuruAnalytics.instance.logException(error, stacktrace: stacktrace); + GuruAnalytics.instance.logGuruEvent( + "dev_audit", + CollectionUtils.filterOutNulls({ + "item_category": "pkg", + "result": 0, + "err_info": error.runtimeType.toString(), + })); + return false; + } + } + + Future _dispatchInitializeSync() async { + await RemoteConfigManager.instance.init(appSpec.defaultRemoteConfig); + await rootPackage._dispatchInitialize(); + try { + GuruUtils.isTablet = (await GuruApplovinFlutter.instance.isTablet()) ?? false; + Log.d("isTablet: ${GuruUtils.isTablet}"); + } catch (error, stacktrace) { + Log.w("invoke isTablet error:$error, $stacktrace"); + } + } + + Future _dispatchInitializeAsync() async { + _initCommon(); + _initRemoteConfig(); + _initRemoteMessaging(); + _initAnalytics(); + if (appSpec.adsProfile != AdsProfile.invalid) { + _initAds(); + } + _initFinancial(); + _initAccount(); + _initDxLink(); + rootPackage._dispatchInitializeAsync(); + Future.delayed(const Duration(seconds: 15), () async { + await _checkApp(); + }); + } + + static Future initialize({required AppEnv appEnv}) async { + final backgroundMessageHandler = appEnv.backgroundMessageHandler; + if (backgroundMessageHandler != null) { + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + } + WidgetsFlutterBinding.ensureInitialized(); + try { + await Firebase.initializeApp(); + } catch (error, stacktrace) { + Log.e("Firebase.initializeApp() error!", error: error, stackTrace: stacktrace); + } + GuruUtils.flavor = appEnv.spec.flavor; + try { + _instance = GuruApp._( + appSpec: appEnv.spec, rootPackage: appEnv.package, toastDelegate: appEnv.toastDelegate); + Log.init(_instance.appName, + persistentLogFileSize: appEnv.spec.deployment.logFileSizeLimit, + persistentLogCount: appEnv.spec.deployment.logFileCount, + persistentLevel: appEnv.spec.deployment.persistentLogLevel); + AiBi.instance.init(); + AdsManager.instance.ensureInitialize(); + await _instance._initialize(); + LifecycleManager.instance.init(); + } catch (error, stacktrace) { + Log.e("GuruApp initialize error!", error: error, stackTrace: stacktrace); + rethrow; + } + } + + void showToast(String message, {Duration duration = const Duration(seconds: 3)}) { + GuruUtils.showToast(message, duration: duration); + } +} + +extension GuruAppInitializerExt on GuruApp { + Future _initCommon() async { + await NetworkUtils.init(); + } + + Future _initRemoteConfig() async { + await RemoteConfigManager.instance.fetchAndActivate(); + final cdnConfig = RemoteConfigManager.instance.getCdnConfig(); + HttpEx.init(cdnConfig, GuruApp.instance.appSpec.details.storagePrefix); + + final remoteDeployment = RemoteConfigManager.instance.getRemoteDeployment(); + Settings.get() + .keepOnScreenDuration + .set(remoteDeployment.keepScreenOnDuration * DateTimeUtils.minuteInMillis); + } + + void _initAnalytics() { + GuruAnalytics.instance.init(); + } + + void _initRemoteMessaging() async { + RemoteMessagingManager.instance.init(); + } + + void _initDxLink() { + Future.delayed(const Duration(seconds: 2), () { + DxLinkManager.instance.init(); + }); + } + + void _initAds() async { + try { + await AccountDataStore.instance.observableSaasUser + .firstWhere((saasUser) => saasUser?.isValid == true) + .timeout(const Duration(seconds: 3)); + } catch (error, stacktrace) { + Log.w("wait account error! $error", stackTrace: stacktrace); + } finally { + await AdsManager.instance.initialize(saasUser: AccountDataStore.instance.user); + } + } + + Future _initFinancial() async { + ManifestManager.instance.addBuilders(GuruApp.instance.productProfile.manifestBuilders); + + FinancialManager.instance.init(); + } + + Future _initAccount() async { + await AccountManager.instance.init(); + } +} + +extension GuruAppFinancialExt on GuruApp { + ProductId defineProductId(String sku, int attr, TransactionMethod method) { + return productProfile.define(sku, attr, method); + } + + ProductId? findProductId({String? sku, int? attr}) { + return productProfile.find(sku: sku, attr: attr); + } + + Set offerProductIds(ProductId productId) { + return productProfile.offerProductIds(productId); + } +} + +extension GuruRemoteConfigExt on GuruApp { + String getDefaultRemoteConfig(String key, {String defaultValue = ""}) { + return defaultRemoteConfig[key] ?? defaultValue; + } +} diff --git a/guru_app/lib/hook/hook_manager.dart b/guru_app/lib/hook/hook_manager.dart new file mode 100644 index 0000000..c08ad6f --- /dev/null +++ b/guru_app/lib/hook/hook_manager.dart @@ -0,0 +1,56 @@ +import 'package:guru_utils/log/log.dart'; + +/// Created by Haoyi on 2022/8/15 + +// enum HookScene { watchRewardAds, audit } + +class HookScene { + final String name; + + const HookScene.define(this.name); + + static const watchRewardAds = HookScene.define("watchRewardAds"); +} + +typedef HookCallback = void Function(dynamic); + +class HookManager { + final Map> hooks = {}; + + HookManager._(); + + static final HookManager instance = HookManager._(); + + void addHook(HookScene scene, HookCallback callback) { + List? callbacks = hooks[scene]; + if (callbacks == null) { + callbacks = []; + hooks[scene] = callbacks; + } else { + callbacks.remove(callback); + } + callbacks.add(callback); + } + + void removeHook(HookScene scene, HookCallback callback) { + List? callbacks = hooks[scene]; + if (callbacks != null) { + callbacks.remove(callback); + } + } + + void dispatch(HookScene scene, dynamic params) { + final callbacks = hooks[scene]?.toList() ?? []; + for (var callback in callbacks) { + try { + callback(params); + } catch (error, stacktrace) { + Log.w("_dispatch hook[$scene] params:$params error! $error!", stackTrace: stacktrace); + } + } + } + + void watchRewardAds() { + dispatch(HookScene.watchRewardAds, null); + } +} diff --git a/guru_app/lib/l10n/intl_en.arb b/guru_app/lib/l10n/intl_en.arb new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/guru_app/lib/l10n/intl_en.arb @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/guru_app/lib/lifecycle/lifecycle_model.dart b/guru_app/lib/lifecycle/lifecycle_model.dart new file mode 100644 index 0000000..90b24e8 --- /dev/null +++ b/guru_app/lib/lifecycle/lifecycle_model.dart @@ -0,0 +1,12 @@ +import 'package:guru_utils/controller/controller.dart'; +import 'package:guru_utils/extensions/extensions.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_applifecycle_flutter/guru_applifecycle.dart'; + +/// Created by Haoyi on 2022/7/18 + +class RequestNotificationPermissionEvent extends LifecycleEvent { + final bool rationale; + + const RequestNotificationPermissionEvent({this.rationale = false}) : super(); +} diff --git a/guru_app/lib/property/app_property.dart b/guru_app/lib/property/app_property.dart new file mode 100644 index 0000000..e875fd6 --- /dev/null +++ b/guru_app/lib/property/app_property.dart @@ -0,0 +1,29 @@ +/// Created by Haoyi on 2022/10/5 +import 'dart:convert'; + +import 'package:guru_app/account/model/account.dart'; +import 'package:guru_app/account/model/account_profile.dart'; +import 'package:guru_app/account/model/user.dart'; +import 'package:guru_app/api/data/orders/orders_model.dart'; +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_utils/property/property_model.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/device/device_info.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/id/id_utils.dart'; +import 'package:guru_utils/core/ext.dart'; + +export 'package:guru_utils/property/app_property.dart'; + +part 'property_tags.dart'; + +part 'modules/account_property_extension.dart'; + +part 'modules/default_property_extension.dart'; + +part 'modules/iap_property_extension.dart'; + +part 'modules/analytics_property_extension.dart'; + +part 'modules/igc_property_extension.dart'; \ No newline at end of file diff --git a/guru_app/lib/property/modules/account_property_extension.dart b/guru_app/lib/property/modules/account_property_extension.dart new file mode 100644 index 0000000..9bf0e81 --- /dev/null +++ b/guru_app/lib/property/modules/account_property_extension.dart @@ -0,0 +1,81 @@ +/// Created by Haoyi on 6/3/21 +part of "../app_property.dart"; + +extension AccountPropertyExtension on AppProperty { + void setAccountSaasUser(SaasUser saasUser) { + final data = jsonEncode(saasUser); + setString(PropertyKeys.accountSaasUser, data); + } + + void setAccountDevice(DeviceInfo deviceInfo) { + final data = jsonEncode(deviceInfo); + setString(PropertyKeys.accountDevice, data); + } + + void setAccountProfile(AccountProfile accountProfile) { + final data = jsonEncode(accountProfile); + setString(PropertyKeys.accountProfile, data); + } + + // refer updateLocalProfile + void setDirtyAccountProfile(AccountProfile accountProfile) { + final data = jsonEncode(accountProfile.copyWith(dirty: true)); + setString(PropertyKeys.accountProfile, data); + } + + Future getAccountDevice() async { + final deviceString = await getString(PropertyKeys.accountDevice, defValue: ''); + if (deviceString == "") { + return null; + } + final map = jsonDecode(deviceString); + return DeviceInfo.fromJson(map); + } + + Future loadAccount() async { + final accountBundle = await loadValuesByTag(PropertyTags.account).catchError((error) { + Log.v("loadValuesByTag is empty, $error"); + return PropertyBundle.empty(); + }); + SaasUser? saasUser; + DeviceInfo? device; + AccountProfile? accountProfile; + + final saasUserString = accountBundle.getString(PropertyKeys.accountSaasUser); + if (DartExt.isNotBlank(saasUserString)) { + final map = jsonDecode(saasUserString!); + saasUser = SaasUser.fromJson(map); + } + + final accountDeviceString = accountBundle.getString(PropertyKeys.accountDevice); + if (DartExt.isNotBlank(accountDeviceString)) { + final map = jsonDecode(accountDeviceString!); + device = DeviceInfo.fromJson(map); + } + + final accountProfileString = accountBundle.getString(PropertyKeys.accountProfile); + if (DartExt.isNotBlank(accountProfileString)) { + final map = jsonDecode(accountProfileString!); + accountProfile = AccountProfile.fromJson(map); + } + + return Account.restore(saasUser: saasUser, device: device, accountProfile: accountProfile); + } + + Future getLatestReportDeviceTimestamp() async { + return await getInt(PropertyKeys.latestReportDeviceTimestamp, defValue: 0); + } + + void setLatestReportDeviceTimestamp(int timestamp) async { + setInt(PropertyKeys.latestReportDeviceTimestamp, timestamp); + } + + Future getAnonymousSecretKey() async { + String? secret = await getString(PropertyKeys.anonymousSecretKey, defValue: ""); + if (secret == '') { + secret = IdUtils.uuidV4(); + await setString(PropertyKeys.anonymousSecretKey, secret); + } + return secret; + } +} diff --git a/guru_app/lib/property/modules/analytics_property_extension.dart b/guru_app/lib/property/modules/analytics_property_extension.dart new file mode 100644 index 0000000..41b2ac1 --- /dev/null +++ b/guru_app/lib/property/modules/analytics_property_extension.dart @@ -0,0 +1,41 @@ +/// Created by Haoyi on 2022/12/22 + +part of "../app_property.dart"; + +extension AnalyticsPropertyExtension on AppProperty { + Future setAdId(String adId) async { + if (adId.isNotEmpty) { + await setString(PropertyKeys.analyticsAdId, adId); + } + } + + Future setFirebaseId(String firebaseId) async { + if (firebaseId.isNotEmpty) { + await setString(PropertyKeys.analyticsFirebaseId, firebaseId); + } + } + + Future setAdjustId(String adjustId) async { + if (adjustId.isNotEmpty) { + await setString(PropertyKeys.analyticsAdjustId, adjustId); + } + } + + Future setAnalyticsDeviceId(String deviceId) async { + if (deviceId.isNotEmpty) { + await setString(PropertyKeys.analyticsDeviceId, deviceId); + } + } + + Future setUserId(String userId) async { + if (userId.isNotEmpty) { + await setString(PropertyKeys.analyticsUserId, userId); + } + } + + Future setIdfa(String idfa) async { + if (idfa.isNotEmpty) { + await setString(PropertyKeys.analyticsIdfa, idfa); + } + } +} diff --git a/guru_app/lib/property/modules/default_property_extension.dart b/guru_app/lib/property/modules/default_property_extension.dart new file mode 100644 index 0000000..ca306f0 --- /dev/null +++ b/guru_app/lib/property/modules/default_property_extension.dart @@ -0,0 +1,40 @@ +part of "../app_property.dart"; + +/// Created by @Haoyi on 5/14/21 + +extension DefaultPropertyExtension on AppProperty { + Future getDeviceId() async { + return getOrCreateString(PropertyKeys.deviceId, IdUtils.uuidV4()); + } + + Future getFirstInstallTime() async { + return await AppProperty.getInstance() + .getOrCreateInt(PropertyKeys.firstInstallTime, DateTimeUtils.currentTimeInMillis()); + } + + Future getLatestLtDate() async { + return await AppProperty.getInstance() + .getOrCreateInt(PropertyKeys.latestLtDate, DateTimeUtils.yyyyMMddUtcNum); + } + + Future setLatestLtDate(int dateNum) async { + await AppProperty.getInstance().setInt(PropertyKeys.latestLtDate, dateNum); + } + + Future getLtDays() async { + return await AppProperty.getInstance().getInt(PropertyKeys.ltDays, defValue: 0); + } + + Future setLtDays(int days) async { + await AppProperty.getInstance().setInt(PropertyKeys.ltDays, days); + } + + Future getLatestAnalyticsStrategy() async { + return await AppProperty.getInstance() + .getString(PropertyKeys.latestAnalyticsStrategy, defValue: ""); + } + + Future setLatestAnalyticsStrategy(String strategy) async { + await AppProperty.getInstance().setString(PropertyKeys.latestAnalyticsStrategy, strategy); + } +} diff --git a/guru_app/lib/property/modules/iap_property_extension.dart b/guru_app/lib/property/modules/iap_property_extension.dart new file mode 100644 index 0000000..54c6322 --- /dev/null +++ b/guru_app/lib/property/modules/iap_property_extension.dart @@ -0,0 +1,21 @@ +/// Created by Haoyi on 2022/11/30 +part of "../app_property.dart"; + +extension IapPropertyExtension on AppProperty { + Future saveFailedIapOrders(OrdersReport order) async { + await setString(PropertyKeys.buildReportFailedIapOrdersKey(), json.encode(order)); + } + + Future loadAllFailedIapOrders() async { + try { + return await loadValuesByTag(PropertyTags.failedOrders); + } catch (e) { + Log.e("error:$e"); + } + return PropertyBundle.empty(); + } + + Future removeReportSuccessOrder(PropertyKey key) async { + remove(key); + } +} diff --git a/guru_app/lib/property/modules/igc_property_extension.dart b/guru_app/lib/property/modules/igc_property_extension.dart new file mode 100644 index 0000000..048d17c --- /dev/null +++ b/guru_app/lib/property/modules/igc_property_extension.dart @@ -0,0 +1,75 @@ +/// Created by Haoyi on 2021/7/1 + +part of "../app_property.dart"; + +extension IgcPropertyExtension on AppProperty { + Future isFirstUseGemsFeature() async { + final gems = await getInt(PropertyKeys.currentIgcBalance, defValue: -1); + return gems == -1; + } + + Future _calculateIgcBalance(int coin) async { + final bundle = await loadValuesByTag(PropertyTags.igc); + int currentCoinBalance = bundle.getInt(PropertyKeys.currentIgcBalance) ?? 0; + final cipher = bundle.getInt(PropertyKeys.currentIgcBalanceValidation) ?? + GuruApp.instance.appSpec.deployment.igcBalanceSecret; + final cipherCoinBalance = cipher ^ GuruApp.instance.appSpec.deployment.igcBalanceSecret; + + if (cipherCoinBalance != currentCoinBalance) { + currentCoinBalance = cipherCoinBalance; + } + final newBalance = max(currentCoinBalance + coin, 0); + final updateBundle = PropertyBundle(); + updateBundle.setInt(PropertyKeys.currentIgcBalance, newBalance); + updateBundle.setInt(PropertyKeys.currentIgcBalanceValidation, + newBalance ^ GuruApp.instance.appSpec.deployment.igcBalanceSecret); + setProperties(updateBundle); + return newBalance; + } + + Future consumeIgc(int igc) async { + return await _calculateIgcBalance(-igc); + } + + Future accumulateIgc(int igc) async { + return await _calculateIgcBalance(igc); + } + + Future clearAllIgc() async { + return await removeAllWithTag(PropertyTags.igc); + } + + Future increaseAndGetIapCount() async { + final count = await getInt(PropertyKeys.iapCount, defValue: 0); + await setInt(PropertyKeys.iapCount, count + 1); + return count + 1; + } + + Future getIapCount() async { + return await getInt(PropertyKeys.iapCount, defValue: 0); + } + + Future isPaidUser() async { + return (await getIapCount()) > 0; + } + + Future getIapIgc() async { + return await getInt(PropertyKeys.iapIgc, defValue: 0); + } + + Future accumulateIapIgc(int igc) async { + final accumulatedIgc = await getInt(PropertyKeys.iapIgc, defValue: 0); + await setInt(PropertyKeys.iapIgc, accumulatedIgc + igc); + return accumulatedIgc + igc; + } + + Future getNoIapIgc() async { + return await getInt(PropertyKeys.noIapIgc, defValue: 0); + } + + Future accumulateNoIapIgc(int igc) async { + final accumulatedIgc = await getInt(PropertyKeys.noIapIgc, defValue: 0); + await setInt(PropertyKeys.noIapIgc, accumulatedIgc + igc); + return accumulatedIgc + igc; + } +} diff --git a/guru_app/lib/property/property_keys.dart b/guru_app/lib/property/property_keys.dart new file mode 100644 index 0000000..79bf542 --- /dev/null +++ b/guru_app/lib/property/property_keys.dart @@ -0,0 +1,117 @@ +import 'package:guru_app/guru_app.dart'; +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_utils/id/id_utils.dart'; +import 'package:guru_utils/property/property_model.dart'; +import 'package:guru_utils/settings/settings.dart'; + +/// Created by Haoyi on 2022/8/25 + +class PropertyKeys { + static const PropertyKey version = UtilsSettingsKeys.version; + static const PropertyKey buildNumber = UtilsSettingsKeys.buildNumber; + static const PropertyKey firstInstallTime = UtilsSettingsKeys.firstInstallTime; + static const PropertyKey firstInstallVersion = UtilsSettingsKeys.firstInstallVersion; + static const PropertyKey prevInstallVersion = UtilsSettingsKeys.prevInstallVersion; + static const PropertyKey latestInstallVersion = UtilsSettingsKeys.latestInstallVersion; + static const PropertyKey previousInstalledVersion = UtilsSettingsKeys.previousInstalledVersion; + static const PropertyKey appInstanceId = UtilsSettingsKeys.appInstanceId; + static const PropertyKey soundEffect = UtilsSettingsKeys.soundEffect; + static const PropertyKey vibration = UtilsSettingsKeys.vibration; + static const PropertyKey deviceId = UtilsSettingsKeys.deviceId; + static const PropertyKey debugMode = UtilsSettingsKeys.debugMode; + static const PropertyKey latestLtDate = UtilsSettingsKeys.latestLtDate; + static const PropertyKey ltDays = UtilsSettingsKeys.ltDays; + + static const PropertyKey accountSaasUser = + PropertyKey.general("account_saas_user", tag: PropertyTags.account); + static const PropertyKey accountDevice = + PropertyKey.general("account_device", tag: PropertyTags.account); + static const PropertyKey accountProfile = + PropertyKey.general("account_profile", tag: PropertyTags.account); + static const PropertyKey latestReportDeviceTimestamp = + PropertyKey.general("latest_report_device_timestamp", tag: PropertyTags.account); + static const PropertyKey anonymousSecretKey = + PropertyKey.general("anonymous_secret_key", tag: PropertyTags.account); + + static const PropertyKey isNoAds = PropertyKey.setting("no_ads", tag: PropertyTags.ads); + + static const PropertyKey totalRevenue = + PropertyKey.general("total_revenue", tag: PropertyTags.financial); + + static const PropertyKey userRewardedCount = + PropertyKey.general("user_rewarded_count", tag: PropertyTags.ads); + + static const PropertyKey fakeInterstitialAds = UtilsPropertyKeys.fakeInterstitialAds; + + static const PropertyKey fakeRewardedAds = UtilsPropertyKeys.fakeRewardedAds; + + static const PropertyKey iapCount = PropertyKey.general("iap_count", tag: PropertyTags.iap); + static const PropertyKey iapIgc = PropertyKey.general("iap_igc", tag: PropertyTags.iap); + static const PropertyKey noIapIgc = PropertyKey.general("no_iap_igc", tag: PropertyTags.iap); + + static const PropertyKey admobConsentTestDeviceId = + PropertyKey.general("admob_consent_test_device_id", tag: PropertyTags.ads); + static const PropertyKey admobConsentDebugGeography = + PropertyKey.general("admob_consent_debug_geography", tag: PropertyTags.ads); + + static const PropertyKey latestAnalyticsStrategy = + PropertyKey.general("latest_analytics_strategy", tag: PropertyTags.analytics); + + static const PropertyKey subscriptionCount = + PropertyKey.general("subs_count", tag: PropertyTags.iap); + + static PropertyKey buildGroupSubscriptionCount(String group) { + return PropertyKey.general("subs_${group}_count", tag: PropertyTags.iap); + } + + static PropertyKey buildSubscriptionCount(ProductId productId) { + String key = "subs_${productId.iapEventName}_"; + if (productId.basePlan != null) { + key += "${productId.basePlan}_"; + } + + if (productId.offerId != null) { + key += "${productId.offerId}_"; + } + return PropertyKey.general("${key}count", tag: PropertyTags.iap); + } + + static PropertyKey buildReportFailedIapOrdersKey({String? overrideKey}) { + return PropertyKey.general(overrideKey ?? "RFIO_${IdUtils.uuidV4()}", + tag: PropertyTags.failedOrders); + } + + static const PropertyKey bestLevel = + PropertyKey.setting("best_level", tag: PropertyTags.analytics); + + static const PropertyKey analyticsAdId = + PropertyKey.general("analytics_ad_id", tag: PropertyTags.analytics); + static const PropertyKey analyticsFirebaseId = + PropertyKey.general("analytics_firebase_id", tag: PropertyTags.analytics); + static const PropertyKey analyticsAdjustId = + PropertyKey.general("analytics_adjust_id", tag: PropertyTags.analytics); + static const PropertyKey analyticsUserId = + PropertyKey.general("analytics_user_id", tag: PropertyTags.analytics); + static const PropertyKey analyticsDeviceId = + PropertyKey.general("analytics_device_id", tag: PropertyTags.analytics); + static const PropertyKey analyticsIdfa = + PropertyKey.general("analytics_idfa", tag: PropertyTags.analytics); + + static const PropertyKey currentIgcBalance = + PropertyKey.general("current_balance", tag: PropertyTags.igc); + static const PropertyKey currentIgcBalanceValidation = + PropertyKey.general("16%98d1x9sr0a@d20xrng", tag: PropertyTags.igc); + + static PropertyKey buildABTestProperty(String key) { + return PropertyKey.general("abtest_$key", tag: PropertyTags.guruAB); + } + + static PropertyKey requestNotificationPermissionTimes = + const PropertyKey.general("request_notification_permission_times"); + + static PropertyKey showNotificationPermissionTimes = + const PropertyKey.general("show_notification_permission_times"); + + static PropertyKey deniedNotificationPermissionTimes = + const PropertyKey.general("denied_notification_permission_times"); +} diff --git a/guru_app/lib/property/property_tags.dart b/guru_app/lib/property/property_tags.dart new file mode 100644 index 0000000..ca125c4 --- /dev/null +++ b/guru_app/lib/property/property_tags.dart @@ -0,0 +1,22 @@ +part of "app_property.dart"; + +class PropertyTags { + static const String promoCode = "promo_code"; + static const String account = "account"; + static const String rank = "rank"; + static const String iapSub = "iap_sub"; + static const String receipt = "receipt"; + static const String dailyRewards = "daily_rewards"; + static const String dailyQuests = "daily_quests"; + static const String failedOrders = "failed_orders"; + static const String strategyAds = "StrategyAds"; + static const String guruAB = "GuruAB"; + + static const String iap = UtilsPropertyTags.iap; + static const String ads = UtilsPropertyTags.ads; + static const String timer = UtilsPropertyTags.timer; + static const String igc = UtilsPropertyTags.igc; + static const String financial = UtilsPropertyTags.financial; + static const String settings = UtilsPropertyTags.settings; + static const String analytics = UtilsPropertyTags.analytics; +} diff --git a/guru_app/lib/property/runtime_property.dart b/guru_app/lib/property/runtime_property.dart new file mode 100644 index 0000000..bf74071 --- /dev/null +++ b/guru_app/lib/property/runtime_property.dart @@ -0,0 +1,2 @@ +/// Created by Haoyi on 2022/10/5 +export 'package:guru_utils/property/runtime_property.dart'; diff --git a/guru_app/lib/property/settings/global_settings.dart b/guru_app/lib/property/settings/global_settings.dart new file mode 100644 index 0000000..e1a5be2 --- /dev/null +++ b/guru_app/lib/property/settings/global_settings.dart @@ -0,0 +1,9 @@ +part of 'guru_settings.dart'; + +/// Created by Haoyi on 2022/8/25 + +mixin GlobalSettings { + final SettingBoolData isNoAds = SettingBoolData(PropertyKeys.isNoAds, defaultValue: false); + + final SettingIntData bestLevel = SettingIntData(PropertyKeys.bestLevel, defaultValue: 1); +} diff --git a/guru_app/lib/property/settings/guru_settings.dart b/guru_app/lib/property/settings/guru_settings.dart new file mode 100644 index 0000000..7090bd3 --- /dev/null +++ b/guru_app/lib/property/settings/guru_settings.dart @@ -0,0 +1,27 @@ +import 'package:guru_app/property/app_property.dart'; +import 'package:guru_app/property/property_keys.dart'; +import 'package:guru_utils/audio/audio_effector.dart'; +import 'package:guru_utils/datetime/datetime_utils.dart'; +import 'package:guru_utils/log/log.dart'; +import 'package:guru_utils/property/runtime_property.dart'; +import 'package:guru_utils/settings/settings.dart'; +import 'package:guru_utils/vibration/vibrate_model.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +export 'package:guru_utils/settings/settings.dart'; + +/// Created by Haoyi on 2022/9/1 +/// +part 'global_settings.dart'; + +class GuruSettings extends Settings with GlobalSettings { + static final GuruSettings instance = GuruSettings._(); + + GuruSettings._(); + + @override + Future refresh() async { + final bundle = await super.refresh(); + return bundle; + } +} diff --git a/guru_app/lib/test/test_guru_app_creator.dart b/guru_app/lib/test/test_guru_app_creator.dart new file mode 100644 index 0000000..f7f1cb5 --- /dev/null +++ b/guru_app/lib/test/test_guru_app_creator.dart @@ -0,0 +1,16 @@ +import 'dart:math'; + +import 'package:guru_app/financial/data/db/order_database.dart'; +import 'package:guru_app/financial/manifest/manifest.dart'; +import 'package:guru_app/guru_app.dart'; + +/// Created by Haoyi on 2023/1/20 + +part 'test_guru_app_creator.g.dart'; + +@guruSpecCreator +AppSpec createSampleAppSpec(String flavor) { + return _GuruSpecFactory.create(flavor); +} + + diff --git a/guru_app/lib/test/test_guru_app_creator.g.dart b/guru_app/lib/test/test_guru_app_creator.g.dart new file mode 100644 index 0000000..b114e79 --- /dev/null +++ b/guru_app/lib/test/test_guru_app_creator.g.dart @@ -0,0 +1,946 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'test_guru_app_creator.dart'; + +// ************************************************************************** +// GuruSpecGenerator +// ************************************************************************** + +class _Guru_testRemoteConfigConstants { + static const iadsConfig = 'iads_config'; + + static const radsConfig = 'rads_config'; + + static const badsConfig = 'bads_config'; + + static const analyticsConfig = 'analytics_config'; + + static const Map _defaultConfigs = { + iadsConfig: + '{"free_s":600,"win_count":4,"scene":"game_start","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}', + radsConfig: '{"win_count":3}', + badsConfig: '{"free_s":180,"win_count":1}', + analyticsConfig: '{"cap":"firebase|facebook|guru", "init_delay_s": 10}', + }; + + static String getDefaultConfigString(String key) => _defaultConfigs[key]; +} + +class _Guru_testAppSpec extends AppSpec { + _Guru_testAppSpec._(); + + static final _instance = _Guru_testAppSpec._(); + + @override + final appName = 'GuruApp'; + + @override + final flavor = 'guru_test'; + + @override + final details = AppDetails( + saasAppId: 'guruapp', + authority: 'demo.gurugame.fun', + storagePrefix: + 'https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o', + defaultCdnPrefix: 'https://cdn1.example.gurugame.fun', + androidGooglePlayUrl: + 'https://play.google.com/store/apps/details?id=app_package_id', + policyUrl: 'https://solitaire.fungame.studio/policy.html', + termsUrl: 'https://solitaire.fungame.studio/termsofservice.html', + emailUrl: 'demo@gurugame.fun', + packageName: 'guru.app.demo', + bundleId: 'guru.app.demo', + facebookAppId: '123456789', + ); + + @override + final deployment = Deployment( + propertyCacheSize: 512, + enableDithering: false, + disableRewardsAds: true, + enableAnalyticsStatistic: true, + autoRestoreIap: false, + igcBalanceSecret: 2654404609, + initIgc: 500, + autoRequestNotificationPermission: false, + logFileSizeLimit: 10485760, + logFileCount: 7, + persistentLogLevel: 1, + iosValidateReceiptPassword: 'aa998877665544332211bb00cc', + conversionEvents: { + 'first_rads_rewarded', + 'level_end_success_1', + 'level_end_success_6', + 'level_end_success_10', + 'level_end_success_12', + 'level_end_success_15', + 'level_up', + 'level_up_1', + 'level_up_3', + 'level_up_5', + 'level_up_7', + 'level_up_10', + 'level_up_12', + 'level_up_15', + 'tch_ad_rev_roas_001', + 'tutorial_complete', + }, + apiConnectTimeout: 15000, + apiReceiveTimeout: 15000, + iosSandboxSubsRenewalSpeed: 2, + adsCompliantInitialization: false, + notificationPermissionPromptTrigger: PromptTrigger.rationale, + trackingNotificationPermissionPass: false, + trackingNotificationPermissionPassLimitTimes: 10, + allowInterstitialAsAlternativeReward: false, + showInternalAdsWhenBannerUnavailable: true, + ); + + @override + final adsProfile = AdsProfile( + bannerId: + const AdUnitId(android: 'xxxxxxxxxxxxxxxx', ios: 'xxxxxxxxxxxxxxxx'), + interstitialId: + const AdUnitId(android: 'xxxxxxxxxxxxxxxx', ios: 'xxxxxxxxxxxxxxxx'), + rewardsId: + const AdUnitId(android: 'xxxxxxxxxxxxxxxx', ios: 'xxxxxxxxxxxxxxxx'), + amazonAppId: const AdAppId( + android: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + ios: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), + amazonBannerSlotId: const AdSlotId( + android: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + ios: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), + amazonInterstitialSlotId: const AdSlotId( + android: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + ios: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), + amazonRewardedSlotId: const AdSlotId( + android: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + ios: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'), + pubmaticAppStoreUrl: Platform.isAndroid + ? 'https://play.google.com/store/apps/details?id=app_package_id' + : ''); + + @override + final productProfile = ProductProfile( + oneOffChargeIapIds: _Guru_testProducts.oneOffChargeIapIds, + subscriptionsIapIds: _Guru_testProducts.subscriptionsIapIds, + pointsIapIds: _Guru_testProducts.pointsIapIds, + rewardIds: _Guru_testProducts.rewardIds, + igcIds: _Guru_testProducts.igcIds, + groupMap: _Guru_testProducts.groupMap, + manifestBuilders: _Guru_testProducts.manifestBuilders, + noAdsCapIds: _Guru_testProducts.noAdsCapIds, + ); + + @override + final adjustProfile = AdjustProfile( + appToken: Platform.isAndroid ? 'testapptoken' : 'testapptoken', + eventNameMapping: Platform.isAndroid + ? { + "level_start": (_) => AdjustEvent("hq0xzz"), + "iap_purchase": (params) => + AdjustProfile.createAdjustEvent("yzy3uh", params), + "sub_purchase": (params) => + AdjustProfile.createAdjustEvent("yzy3uh", params), + "level_end": (_) => AdjustEvent("so63k4"), + "tutorial_complete": (_) => AdjustEvent("95fu7q"), + } + : { + "level_start": (_) => AdjustEvent("b8khry"), + "iap_purchase": (params) => + AdjustProfile.createAdjustEvent("z0gje7", params), + "sub_purchase": (params) => + AdjustProfile.createAdjustEvent("z0gje7", params), + "level_end": (_) => AdjustEvent("1p8z5t"), + "tutorial_complete": (_) => AdjustEvent("1p8z5t"), + }); + + @override + final defaultRemoteConfig = _Guru_testRemoteConfigConstants._defaultConfigs; +} + +class _Guru_testProducts { + static final themeRegExp = RegExp(r"^theme_(.*)$"); + + static final propRegExp = RegExp(r"^theme_(.*)_(.*)$"); + + static final themeMulRegExp = RegExp(r"^theme_(.*)_(.*)$"); + + static const noAds = ProductId( + android: 'so.a.iap.noads.699', + ios: 'so.i.iap.noads.699', + attr: TransactionAttributes.asset, + points: false); + + static const noAdsCoinBundle = ProductId( + android: 'so.a.iap.noads.coin.799', + ios: 'so.i.iap.noads.coin.799', + attr: TransactionAttributes.asset, + points: false); + + static const noAds2 = ProductId( + android: 'so.a.iap.noads.699', + ios: 'so.i.iap.noads.699', + attr: TransactionAttributes.possessive, + points: false); + + static const coin200 = ProductId( + android: 'so.a.iapc.coin.200', + ios: 'so.i.iapc.coin.200', + attr: TransactionAttributes.consumable, + points: true); + + static const stagePack = ProductId( + android: 'so.a.iap.stage.1', + ios: 'so.i.iap.stage.1', + attr: TransactionAttributes.consumable, + points: false); + + static const premiumWeeklyFreetrial = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1w', + attr: TransactionAttributes.subscriptions, + basePlan: 'weekly', + offerId: 'freetrial', + originId: premiumWeek); + + static const premiumWeeklyDiscount = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1w', + attr: TransactionAttributes.subscriptions, + basePlan: 'weekly', + offerId: 'discount', + originId: premiumWeek); + + static final premiumWeekOfferIds = { + premiumWeeklyFreetrial, + premiumWeeklyDiscount + }; + + static const premiumWeek = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1w', + basePlan: 'weekly', + attr: TransactionAttributes.subscriptions, + points: false); + + static const premiumYearlyFreetrial = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1y', + attr: TransactionAttributes.subscriptions, + basePlan: 'yearly', + offerId: 'freetrial', + originId: premiumYear); + + static const premiumYearlyDiscount = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1y', + attr: TransactionAttributes.subscriptions, + basePlan: 'yearly', + offerId: 'discount', + originId: premiumYear); + + static final premiumYearOfferIds = { + premiumYearlyFreetrial, + premiumYearlyDiscount + }; + + static const premiumYear = ProductId( + android: 'm2.a.sub.premium', + ios: 'm2.i.sub.premium.p1y', + basePlan: 'yearly', + attr: TransactionAttributes.subscriptions, + points: false); + + static final noAdsCapIds = { + noAdsCoinBundle, + noAds2, + premiumWeek, + premiumWeeklyFreetrial, + premiumWeeklyDiscount, + premiumYear, + premiumYearlyFreetrial, + premiumYearlyDiscount + }; + + static final premiumGroup = { + premiumWeek, + premiumWeeklyFreetrial, + premiumWeeklyDiscount, + premiumYear, + premiumYearlyFreetrial, + premiumYearlyDiscount + }; + + static final groupMap = { + premiumWeek.sku: 'premium', + premiumWeeklyFreetrial.sku: 'premium', + premiumWeeklyDiscount.sku: 'premium', + premiumYear.sku: 'premium', + premiumYearlyFreetrial.sku: 'premium', + premiumYearlyDiscount.sku: 'premium' + }; + + static final oneOffChargeIapIds = { + noAds, + noAdsCoinBundle, + noAds2, + coin200, + stagePack + }; + + static final subscriptionsIapIds = { + premiumWeek, + premiumWeeklyFreetrial, + premiumWeeklyDiscount, + premiumYear, + premiumYearlyFreetrial, + premiumYearlyDiscount + }; + + static final pointsIapIds = {coin200}; + + static final rewardIds = {noAds}; + + static final igcIds = {noAds}; + + static const manifestBuilders = [ + buildNoAdsManifest, + buildNoAdsCoinBundleManifest, + buildThemeManifest, + buildPropManifest, + buildNoAds2Manifest, + buildCoin200Manifest, + buildStagePackManifest, + buildPremiumWeekManifest, + buildPremiumYearManifest, + buildThemeMulManifest + ]; + + static Future buildNoAdsManifest(TransactionIntent intent) async { + if (intent.productId != noAds) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + return Manifest('no_ads', extras: extras); + } + + static bool isOwnNoAds(OrderEntity entity) { + if (entity.state == TransactionState.success && + entity.category == 'no_ads') { + return noAds.sku == entity.sku; + } + return false; + } + + static Future buildNoAdsCoinBundleManifest( + TransactionIntent intent) async { + if (intent.productId != noAdsCoinBundle) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + final details =
[]; + details.add(Details.define( + 'igc', intent.sales ? max(500, (intent.rate * 500).toInt()) : 500)); + details.add(Details.define( + 'cup', intent.sales ? max(1, (intent.rate * 1).toInt()) : 1)); + details.add(Details.define( + 'frag', intent.sales ? max(20, (intent.rate * 20).toInt()) : 20)); + return Manifest('no_ads', extras: extras, details: details); + } + + static bool isOwnNoAdsCoinBundle(OrderEntity entity) { + if (entity.state == TransactionState.success && + entity.category == 'no_ads_coin_bundle') { + return noAdsCoinBundle.sku == entity.sku; + } + return false; + } + + static ProductId theme( + String themeId, + TransactionMethod method, + ) => + GuruApp.instance.defineProductId( + 'theme_${themeId}', TransactionAttributes.possessive, method); + + static Future buildThemeManifest(TransactionIntent intent) async { + final matches = themeRegExp.allMatches(intent.productId.sku); + if (matches.isEmpty) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + 'theme_id': matches.first.group(1)!, + }; + return Manifest('theme_${matches.first.group(1)!}', extras: extras); + } + + static bool isOwnTheme( + OrderEntity entity, + String themeId, + ) { + if (entity.state == TransactionState.success && + entity.category == 'theme') { + final match = themeRegExp.firstMatch(entity.sku); + return match?.group(1) == themeId; + } + return false; + } + + static ProductId prop( + String propId, + String pcId, + TransactionMethod method, + ) => + GuruApp.instance.defineProductId( + 'theme_${propId}_${pcId}', TransactionAttributes.possessive, method); + + static Future buildPropManifest(TransactionIntent intent) async { + final matches = propRegExp.allMatches(intent.productId.sku); + if (matches.isEmpty) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + final details =
[]; + details.add(Details.define( + 'prop', intent.sales ? max(1, (intent.rate * 1).toInt()) : 1) + ..setString('prop_id', matches.first.group(1)!)); + details.add(Details.define( + 'pc', intent.sales ? max(1, (intent.rate * 1).toInt()) : 1) + ..setString('prop_id', matches.first.group(2)!)); + return Manifest('prop', extras: extras, details: details); + } + + static bool isOwnProp( + OrderEntity entity, + String propId, + String pcId, + ) { + if (entity.state == TransactionState.success && entity.category == 'prop') { + final match = propRegExp.firstMatch(entity.sku); + return match?.group(1) == propId && match?.group(2) == pcId; + } + return false; + } + + static Future buildNoAds2Manifest(TransactionIntent intent) async { + if (intent.productId != noAds2) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + final details =
[]; + details.add(Details.define('no_ads', 1)); + return Manifest('no_ads', extras: extras, details: details); + } + + static bool isOwnNoAds2(OrderEntity entity) { + if (entity.state == TransactionState.success && + entity.category == 'no_ads2') { + return noAds2.sku == entity.sku; + } + return false; + } + + static Future buildCoin200Manifest( + TransactionIntent intent) async { + if (intent.productId != coin200) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + final details =
[]; + details.add(Details.define( + 'coin', intent.sales ? max(200, (intent.rate * 200).toInt()) : 200)); + return Manifest('coin', extras: extras, details: details); + } + + static Future buildStagePackManifest( + TransactionIntent intent) async { + if (intent.productId != stagePack) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + final details =
[]; + details.add(Details.define( + 'stage', intent.sales ? max(1, (intent.rate * 1).toInt()) : 1) + ..setInt('stage', 1)); + return Manifest('stage_1', extras: extras, details: details); + } + + static Future buildPremiumWeekManifest( + TransactionIntent intent) async { + if (!premiumWeekOfferIds.contains(intent.productId)) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + if (Platform.isAndroid && intent.productId.hasOffer) { + extras[ExtraReservedField.basePlanId] = intent.productId.basePlan; + extras[ExtraReservedField.offerId] = intent.productId.offerId; + } + final details =
[]; + details.add(Details.define( + 'igc', intent.sales ? max(8000, (intent.rate * 8000).toInt()) : 8000)); + return Manifest('sub', extras: extras, details: details); + } + + static Future buildPremiumYearManifest( + TransactionIntent intent) async { + if (!premiumYearOfferIds.contains(intent.productId)) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + }; + if (Platform.isAndroid && intent.productId.hasOffer) { + extras[ExtraReservedField.basePlanId] = intent.productId.basePlan; + extras[ExtraReservedField.offerId] = intent.productId.offerId; + } + final details =
[]; + details.add(Details.define('igc', + intent.sales ? max(16000, (intent.rate * 16000).toInt()) : 16000)); + return Manifest('sub', extras: extras, details: details); + } + + static ProductId themeMul( + String category, + String themeId, + ) => + GuruApp.instance.defineProductId('theme_${category}_${themeId}', + TransactionAttributes.possessive, TransactionMethod.igc); + + static Future buildThemeMulManifest( + TransactionIntent intent) async { + final matches = themeMulRegExp.allMatches(intent.productId.sku); + if (matches.isEmpty) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + 'theme_id': matches.first.group(2)!, + 'cate': matches.first.group(1)!, + }; + return Manifest('${matches.first.group(1)!}', extras: extras); + } + + static bool isOwnThemeMul( + OrderEntity entity, + String category, + String themeId, + ) { + if (entity.state == TransactionState.success && + entity.category == 'theme_mul') { + final match = themeMulRegExp.firstMatch(entity.sku); + return match?.group(1) == category && match?.group(2) == themeId; + } + return false; + } + + static Set get iapIds => + {...oneOffChargeIapIds, ...subscriptionsIapIds}; +} + +class _SpiderRemoteConfigConstants { + static const iadsConfig = 'iads_config'; + + static const radsConfig = 'rads_config'; + + static const badsConfig = 'bads_config'; + + static const Map _defaultConfigs = { + iadsConfig: + '{"free_s":600,"win_count":4,"scene":"game_start|new_block|p2g|p2h|reset_keep|reset_scs|ads_break|double|nap","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}', + radsConfig: '{"win_count":3}', + badsConfig: '{"free_s":180,"win_count":1}', + }; + + static String getDefaultConfigString(String key) => _defaultConfigs[key]; +} + +class _SpiderAppSpec extends AppSpec { + _SpiderAppSpec._(); + + static final _instance = _SpiderAppSpec._(); + + @override + final appName = 'Spider'; + + @override + final flavor = 'Spider'; + + @override + final details = AppDetails( + saasAppId: 'spider', + authority: 'solitaire.fungame.studio', + storagePrefix: + 'https://firebasestorage.googleapis.com/v0/b/solitaire-66fbf.appspot.com/o', + defaultCdnPrefix: 'https://cdn1.solitaire.fungame.studio', + androidGooglePlayUrl: + 'https://play.google.com/store/apps/details?id=solitaire.patience.card.games.klondike.free', + policyUrl: 'https://solitaire.fungame.studio/policy.html', + termsUrl: 'https://solitaire.fungame.studio/termsofservice.html', + emailUrl: 'card@fungame.studio', + packageName: 'guru.app.demo', + bundleId: 'guru.app.demo', + facebookAppId: '987654321', + ); + + @override + final deployment = Deployment( + propertyCacheSize: 512, + enableDithering: false, + disableRewardsAds: true, + ); + + @override + final adsProfile = AdsProfile( + bannerId: + const AdUnitId(android: 'a1dc70299fd5d487', ios: '97da0e2028ba80b7'), + interstitialId: + const AdUnitId(android: '25b7c47878fcbf6a', ios: '4e7ba2c4921ecdfb'), + rewardsId: + const AdUnitId(android: '3cd13a4e5c388e7b', ios: '2a65c75c3ed690b2'), + amazonAppId: const AdAppId( + android: '22296b56-f6b3-4bee-9fd1-0cd6d5cc69bc', + ios: '9fdfd4c0-3f34-4bd4-b9b4-1f649ff50a2a'), + amazonBannerSlotId: const AdSlotId( + android: '3c10ec33-a2bf-44be-ac9f-707853e63ff2', + ios: '7cb36f8a-2953-4f02-a1cb-ec3dfdf33878'), + amazonInterstitialSlotId: const AdSlotId( + android: 'b7fac191-5986-4144-9fdb-691556b2e092', + ios: '82d23cfa-2b5d-4501-bfc3-1cd2b688ed41'), + pubmaticAppStoreUrl: Platform.isAndroid + ? 'https://play.google.com/store/apps/details?id=solitaire.patience.card.games.klondike.free' + : ''); + + @override + final productProfile = ProductProfile( + oneOffChargeIapIds: _SpiderProducts.oneOffChargeIapIds, + subscriptionsIapIds: _SpiderProducts.subscriptionsIapIds, + pointsIapIds: _SpiderProducts.pointsIapIds, + rewardIds: _SpiderProducts.rewardIds, + igcIds: _SpiderProducts.igcIds, + groupMap: _SpiderProducts.groupMap, + manifestBuilders: _SpiderProducts.manifestBuilders, + noAdsCapIds: _SpiderProducts.noAdsCapIds, + ); + + @override + final adjustProfile = AdjustProfile( + appToken: Platform.isAndroid ? 'fwbn7l32vpc0' : 'xxakw3rgxnnk', + eventNameMapping: Platform.isAndroid + ? { + "level_start": (_) => AdjustEvent("hq0xzz"), + "in_app_purchase": (params) => + AdjustProfile.createAdjustEvent("yzy3uh", params), + "level_end": (_) => AdjustEvent("so63k4"), + "tutorial_complete": (_) => AdjustEvent("95fu7q"), + } + : { + "level_start": (_) => AdjustEvent("b8khry"), + "in_app_purchase": (params) => + AdjustProfile.createAdjustEvent("z0gje7", params), + "level_end": (_) => AdjustEvent("1p8z5t"), + "tutorial_complete": (_) => AdjustEvent("1p8z5t"), + }); + + @override + final defaultRemoteConfig = _SpiderRemoteConfigConstants._defaultConfigs; +} + +class _SpiderProducts { + static final themeRegExp = RegExp(r"^theme_(.*)$"); + + static const noAds = ProductId( + android: 'so.a.iap.noads.699', + ios: 'so.i.iap.noads.699', + attr: TransactionAttributes.possessive, + points: false); + + static const coin200 = ProductId( + android: 'so.a.iapc.coin.200', + ios: 'so.i.iapc.coin.200', + attr: TransactionAttributes.consumable, + points: false); + + static final noAdsCapIds = {noAds}; + + static final groupMap = {}; + + static final oneOffChargeIapIds = {}; + + static final subscriptionsIapIds = {}; + + static final pointsIapIds = {}; + + static final rewardIds = {}; + + static final igcIds = {}; + + static const manifestBuilders = [buildThemeManifest]; + + static ProductId theme( + String themeId, + TransactionMethod method, + ) => + GuruApp.instance.defineProductId( + 'theme_${themeId}', TransactionAttributes.possessive, method); + + static Future buildThemeManifest(TransactionIntent intent) async { + final matches = themeRegExp.allMatches(intent.productId.sku); + if (matches.isEmpty) { + return null; + } + final extras = { + ExtraReservedField.scene: intent.scene, + ExtraReservedField.rate: intent.rate, + ExtraReservedField.sales: intent.sales, + 'theme_id': matches.first.group(1)!, + }; + final details =
[]; + details.add(Details.define( + 'theme', intent.sales ? max(1, (intent.rate * 1).toInt()) : 1)); + return Manifest('${matches.first.group(1)!}', + extras: extras, details: details); + } + + static bool isOwnTheme( + OrderEntity entity, + String themeId, + ) { + if (entity.state == TransactionState.success && + entity.category == 'theme') { + final match = themeRegExp.firstMatch(entity.sku); + return match?.group(1) == themeId; + } + return false; + } + + static Set get iapIds => + {...oneOffChargeIapIds, ...subscriptionsIapIds}; +} + +class RemoteConfigConstants { + static const iadsConfig = 'iads_config'; + + static const radsConfig = 'rads_config'; + + static const badsConfig = 'bads_config'; + + static const analyticsConfig = 'analytics_config'; +} + +class ProductIds { + static ProductId get noAds { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.noAds; + } + if (GuruApp.instance.flavor == 'Spider') { + return _SpiderProducts.noAds; + } + return ProductId.invalid; + } + + static ProductId get noAdsCoinBundle { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.noAdsCoinBundle; + } + return ProductId.invalid; + } + + static ProductId get noAds2 { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.noAds2; + } + return ProductId.invalid; + } + + static ProductId get coin200 { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.coin200; + } + if (GuruApp.instance.flavor == 'Spider') { + return _SpiderProducts.coin200; + } + return ProductId.invalid; + } + + static ProductId get stagePack { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.stagePack; + } + return ProductId.invalid; + } + + static ProductId get premiumWeeklyFreetrial { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumWeeklyFreetrial; + } + return ProductId.invalid; + } + + static ProductId get premiumWeeklyDiscount { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumWeeklyDiscount; + } + return ProductId.invalid; + } + + static ProductId get premiumWeek { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumWeek; + } + return ProductId.invalid; + } + + static ProductId get premiumYearlyFreetrial { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumYearlyFreetrial; + } + return ProductId.invalid; + } + + static ProductId get premiumYearlyDiscount { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumYearlyDiscount; + } + return ProductId.invalid; + } + + static ProductId get premiumYear { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.premiumYear; + } + return ProductId.invalid; + } + + static ProductId theme( + String themeId, + TransactionMethod method, + ) { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.theme(themeId, method); + } + if (GuruApp.instance.flavor == 'Spider') { + return _SpiderProducts.theme(themeId, method); + } + return ProductId.invalid; + } + + static ProductId prop( + String propId, + String pcId, + TransactionMethod method, + ) { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.prop(propId, pcId, method); + } + return ProductId.invalid; + } + + static ProductId themeMul( + String category, + String themeId, + ) { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.themeMul(category, themeId); + } + return ProductId.invalid; + } + + static Set get noAdsCapIds { + if (GuruApp.instance.flavor == 'guru_test') { + return _Guru_testProducts.noAdsCapIds; + } + if (GuruApp.instance.flavor == 'Spider') { + return _SpiderProducts.noAdsCapIds; + } + return {}; + } + + static Set get iapIds => GuruApp.instance.productProfile.iapIds; + + static Set get oneOffChargeIapIds => + GuruApp.instance.productProfile.oneOffChargeIapIds; + + static Set get subscriptionsIapIds => + GuruApp.instance.productProfile.subscriptionsIapIds; + + static Set get pointsIapIds => + GuruApp.instance.productProfile.pointsIapIds; + + static Set get rewardIds => + GuruApp.instance.productProfile.rewardIds; +} + +class ProductCategory { + static const noAds = 'no_ads'; + + static const prop = 'prop'; + + static const coin = 'coin'; + + static const stage1 = 'stage_1'; + + static const sub = 'sub'; + + static theme(String themeId) { + "theme_${themeId}"; + } + + static themeMul(String category) { + "${category}"; + } +} + +class _GuruSpecFactory { + static AppSpec create(String flavor) { + if (flavor == 'guru_test') { + return _Guru_testAppSpec._instance; + } + if (flavor == 'Spider') { + return _SpiderAppSpec._instance; + } + throw NotImplementationAppSpecCreatorException(); + } +} + +class Flavors { + static const guruTest = 'guru_test'; + + static const spider = 'Spider'; +} diff --git a/guru_app/lib/utils/guru_file_utils_extension.dart b/guru_app/lib/utils/guru_file_utils_extension.dart new file mode 100644 index 0000000..3a039b8 --- /dev/null +++ b/guru_app/lib/utils/guru_file_utils_extension.dart @@ -0,0 +1,19 @@ +import 'dart:io'; + +import 'package:guru_utils/file/file_utils.dart'; +export 'package:guru_utils/file/file_utils.dart'; + +extension GuruFileUtilsExtension on FileUtils { + String get guruPath => "guru"; + + String get configPath => "config"; + + Future getGuruConfigDir(String name, {bool recursive = true}) async { + return await getAppDir(subDirs: [guruPath, configPath, name], recursive: recursive); + } + + Future getGuruConfigFile(String dirName, String name) async { + final dir = await getGuruConfigDir(dirName); + return File("${dir.path}/$name"); + } +} diff --git a/guru_app/packages/guru_assistant/.gitignore b/guru_app/packages/guru_assistant/.gitignore new file mode 100644 index 0000000..2ee8465 --- /dev/null +++ b/guru_app/packages/guru_assistant/.gitignore @@ -0,0 +1,120 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.vscode +.gradle +.idea +/local.properties +.DS_Store +/build +.metadata +ios/Flutter/flutter_export_environment.sh + +**/.settings +**/.project +**/.classpath + + +# build id +build_id.properties + +# IntelliJ related + +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ +flutter_* +.flutter-plugins-dependencies + +# goCli related +go-cli/.packages +go-cli/pubspec.lock + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/gradlew +**/android/gradlew.bat +**/android/fastlane/report.xml +**/android/fastlane/README.md + +# 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/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* +**/ios/build/* +**/ios/fastlane/README.md +**/ios/fastlane/report.xml + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +# Crashlytics +debugSymbols/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# i18n +**/android/res/values/strings_en.arb +lib/generated/i18n.dart + +# output +output/ios/adhok/* +output/ios/appstore/* +ios/fastlane/report.xml +android/fastlane/report.xml + +**/android/fastlane/metadata/android/**/images/** +**/ios/fastlane/screenshots/** \ No newline at end of file diff --git a/guru_app/packages/guru_assistant/CHANGELOG.md b/guru_app/packages/guru_assistant/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/guru_app/packages/guru_assistant/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/guru_app/packages/guru_assistant/LICENSE b/guru_app/packages/guru_assistant/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/guru_app/packages/guru_assistant/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/guru_app/packages/guru_assistant/README.md b/guru_app/packages/guru_assistant/README.md new file mode 100644 index 0000000..02fe8ec --- /dev/null +++ b/guru_app/packages/guru_assistant/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/guru_app/packages/guru_assistant/analysis_options.yaml b/guru_app/packages/guru_assistant/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/guru_app/packages/guru_assistant/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/guru_app/packages/guru_assistant/example/.gitignore b/guru_app/packages/guru_assistant/example/.gitignore new file mode 100644 index 0000000..2ee8465 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/.gitignore @@ -0,0 +1,120 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.vscode +.gradle +.idea +/local.properties +.DS_Store +/build +.metadata +ios/Flutter/flutter_export_environment.sh + +**/.settings +**/.project +**/.classpath + + +# build id +build_id.properties + +# IntelliJ related + +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ +flutter_* +.flutter-plugins-dependencies + +# goCli related +go-cli/.packages +go-cli/pubspec.lock + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java +**/android/gradlew +**/android/gradlew.bat +**/android/fastlane/report.xml +**/android/fastlane/README.md + +# 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/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* +**/ios/build/* +**/ios/fastlane/README.md +**/ios/fastlane/report.xml + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +# Crashlytics +debugSymbols/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# i18n +**/android/res/values/strings_en.arb +lib/generated/i18n.dart + +# output +output/ios/adhok/* +output/ios/appstore/* +ios/fastlane/report.xml +android/fastlane/report.xml + +**/android/fastlane/metadata/android/**/images/** +**/ios/fastlane/screenshots/** \ No newline at end of file diff --git a/guru_app/packages/guru_assistant/example/README.md b/guru_app/packages/guru_assistant/example/README.md new file mode 100644 index 0000000..2b3fce4 --- /dev/null +++ b/guru_app/packages/guru_assistant/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://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/guru_app/packages/guru_assistant/example/analysis_options.yaml b/guru_app/packages/guru_assistant/example/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/guru_app/packages/guru_assistant/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/guru_app/packages/guru_assistant/example/android/.gitignore b/guru_app/packages/guru_assistant/example/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/app/build.gradle b/guru_app/packages/guru_assistant/example/android/app/build.gradle new file mode 100644 index 0000000..d76b118 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/build.gradle @@ -0,0 +1,81 @@ +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 33 + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + + compileSdkVersion 33 + + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "guru.app.example.example" + // 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 23 + targetSdkVersion 33 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + multiDexEnabled true + ndk { + abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' + } + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.installreferrer:installreferrer:2.2' + implementation "androidx.annotation:annotation:1.3.0" + implementation 'androidx.multidex:multidex:2.0.1' +} diff --git a/guru_app/packages/guru_assistant/example/android/app/src/debug/AndroidManifest.xml b/guru_app/packages/guru_assistant/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..3bf6195 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/AndroidManifest.xml b/guru_app/packages/guru_assistant/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..dc16b78 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/kotlin/guru/app/example/example/MainActivity.kt b/guru_app/packages/guru_assistant/example/android/app/src/main/kotlin/guru/app/example/example/MainActivity.kt new file mode 100644 index 0000000..77f15b0 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/kotlin/guru/app/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package guru.app.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable-v21/launch_background.xml b/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable/launch_background.xml b/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/app/src/main/res/values-night/styles.xml b/guru_app/packages/guru_assistant/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/main/res/values/styles.xml b/guru_app/packages/guru_assistant/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/guru_app/packages/guru_assistant/example/android/app/src/profile/AndroidManifest.xml b/guru_app/packages/guru_assistant/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..3bf6195 --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/guru_app/packages/guru_assistant/example/android/build.gradle b/guru_app/packages/guru_assistant/example/android/build.gradle new file mode 100644 index 0000000..8e1805c --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/build.gradle @@ -0,0 +1,39 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { +// maven { url 'http://localhost:8081/repository/maven-public/' } + google() + mavenCentral() + mavenLocal() + maven { url 'https://artifacts.applovin.com/android' } + } + + dependencies { +// classpath 'com.android.tools.build:gradle:4.2.1' + classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.google.gms:google-services:4.3.15' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.5.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.applovin.quality:AppLovinQualityServiceGradlePlugin:+" + } +} + +allprojects { + repositories { + mavenLocal() + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/guru_app/packages/guru_assistant/example/android/gradle.properties b/guru_app/packages/guru_assistant/example/android/gradle.properties new file mode 100644 index 0000000..999813a --- /dev/null +++ b/guru_app/packages/guru_assistant/example/android/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx4G -XX:MaxPermSize=512m +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true +android.enableDexingArtifactTransform=false diff --git a/guru_app/packages/guru_assistant/example/android/gradle/wrapper/gradle-wrapper.properties b/guru_app/packages/guru_assistant/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..cb24abd --- /dev/null +++ b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/android/settings.gradle b/guru_app/packages/guru_assistant/example/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/guru_app/packages/guru_assistant/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/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Black.ttf b/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f226c5d5d7e125a18bb091d836dae5a9b9b0d42b GIT binary patch literal 161408 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%0D`XP@#Ld6uvhlOzQo5UQ2r&9 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 Ag8%>k literal 0 HcmV?d00001 diff --git a/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-ExtraLight.ttf b/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-ExtraLight.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b3b44ab8210f990a2989ec981258432783e6a623 GIT binary patch literal 158900 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

_x(9SLftBSFoycIK*9n$}s7 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

Da9oYqWq~77lZ!cEe^7nrO>67 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 literal 0 HcmV?d00001 diff --git a/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-SemiBold.ttf b/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..afb3658da0754c93f450b16b5859cdea3ee9c7b1 GIT binary patch literal 163388 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 ZlI)+8^q5x*RMG;2f;vg-JBlt0{69w9ictUn literal 0 HcmV?d00001 diff --git a/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Thin.ttf b/guru_app/packages/guru_assistant/example/assets/fonts/EncodeSansExpanded-Thin.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4b0f58427860eba717e3a1d713bae6d3f1b7081b GIT binary patch literal 157556 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%0D=<%$rT`#7cPh<8 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 WqsPcVfznW*zNr*O>z4<;Q19=LsUu?m literal 0 HcmV?d00001 diff --git a/guru_app/packages/guru_assistant/example/assets/images/ic_ads.png b/guru_app/packages/guru_assistant/example/assets/images/ic_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..7adbff7c13af709091f24a240c70d7ffb51e5aaa GIT binary patch literal 2315 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 literal 0 HcmV?d00001 diff --git a/guru_app/packages/guru_assistant/example/assets/images/ic_check.png b/guru_app/packages/guru_assistant/example/assets/images/ic_check.png new file mode 100644 index 0000000000000000000000000000000000000000..6491f5599766a6779cb9676bf78505479aae6a13 GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*5QUV3PK9aSX{| zeLH=pH?yNi`~BGx2NM({GG~b-B?@#mM08IGa}HW6^5*DbVHQWn#b&o6ZY-G;(X}8m zs7oP9_&)=;Hn*bLt9KUq3Exi0-P|E=!OdyBdGqgm?~k98V~|;k=&H*@h7cdLjA|v z&#krf(o7|;N*r8$;+*SWM`h+`J+*7ar5US#n7vutmXmYT=>Vsk<(<`Q9|kLLyVhMJ zxci{?1g*nvU!9%Jwke7J(6(9WqV|BjCWWc)pu5ro^_mw_t9?TD3r z_tbxV2g>$e&n~q(@mfs8rtrqSR-vg$jm-8J53XAAXw|05$jiMu&6-=5KicM>)K_!O z<+#P;09gd*}i}G89ZFMZZE^z+KSM<9xc579oxzkZ{55ZR^(|m z(^B|vO}bC^miK-gr)GaW-l3rs*LnAz*4E3F*gF3oQURMOoQ zDaF)RDjIa!@BW6jl^cIsYb{O8Hx#zk<5Urz0Ex239qJ#L1@i=qz4?CEfRc-+tDnm{ Hr-UW|7T^EuT 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 xRsUngbm`1sm*5l$3=3ruC;(BoZ?n5S~Qx}++ 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

iu)o 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