├── .github ├── dependabot.yml └── workflows │ ├── lint_check_and_run_test.yml │ └── release_and_upload.yml ├── .gitignore ├── .metadata ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── res │ │ │ ├── drawable │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ └── values │ │ │ └── ic_launcher_background.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ │ └── io │ │ │ │ └── flutter │ │ │ │ └── app │ │ │ │ └── FlutterMultiDexApplication.java │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── andannn │ │ │ │ └── aniflow │ │ │ │ ├── AniflowApplication.kt │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ ├── background.png │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── launch_background.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── values-night-v31 │ │ │ └── styles.xml │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ ├── values-v31 │ │ │ └── styles.xml │ │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── provider_paths.xml │ │ └── profile │ │ ├── AndroidManifest.xml │ │ ├── google-services.json │ │ ├── ic_launcher-playstore.png │ │ └── res │ │ ├── drawable │ │ └── ic_launcher_foreground.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ └── values │ │ └── ic_launcher_background.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── image │ ├── ic_launcher-playstore.png │ ├── ic_youtube_xml │ └── new_badge.png ├── json │ ├── detail_media_data.json │ ├── media_list_data_1.json │ ├── media_list_data_2.json │ └── remote_config_defaults.json └── video │ ├── long_press_gesture_video.mp4 │ └── sliding_gesture_video.mp4 ├── devtools_options.yaml ├── firebase.json ├── firepit-log.txt ├── flutter_native_splash.yaml ├── integration_test └── integration_test.dart ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ └── iTunesArtwork@2x 1.png │ │ └── Contents.json │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── GoogleService-Info.plist │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── RunnerTests │ └── RunnerTests.swift ├── build │ └── .last_build_id └── firebase_app_id_file.json ├── l10n.yaml ├── lib ├── app │ ├── app.dart │ ├── app_bloc.dart │ ├── app_state.dart │ ├── app_state.freezed.dart │ ├── di │ │ ├── env.dart │ │ ├── get_it_di.config.dart │ │ ├── get_it_di.dart │ │ └── get_it_scope.dart │ ├── l10n │ │ ├── app_en.arb │ │ ├── app_ja.arb │ │ ├── app_localizations.dart │ │ ├── app_localizations_en.dart │ │ ├── app_localizations_ja.dart │ │ ├── app_localizations_zh.dart │ │ └── app_zh.arb │ └── routing │ │ ├── model │ │ ├── ani_flow_route_path.dart │ │ ├── ani_flow_route_path.freezed.dart │ │ └── ani_flow_route_path.g.dart │ │ ├── root_router_delegate.dart │ │ ├── root_router_info_parser.dart │ │ └── util │ │ └── ani_flow_page_generator.dart ├── callback_dispatcher.dart ├── core │ ├── background_task │ │ ├── di │ │ │ └── workmanager_module.dart │ │ ├── executor.dart │ │ ├── executors │ │ │ └── post_anilist_notification_task_executor.dart │ │ ├── task.dart │ │ ├── task_manager.dart │ │ └── tasks │ │ │ ├── post_anilist_notification_task.dart │ │ │ └── sync_new_released_play_source_task.dart │ ├── common │ │ ├── definitions │ │ │ ├── activity_filter_type.dart │ │ │ ├── activity_filter_type.g.dart │ │ │ ├── activity_scope_category.dart │ │ │ ├── activity_scope_category.g.dart │ │ │ ├── activity_type.dart │ │ │ ├── activity_type.g.dart │ │ │ ├── ani_list_settings.dart │ │ │ ├── ani_list_settings.freezed.dart │ │ │ ├── ani_list_settings.g.dart │ │ │ ├── anime_season.dart │ │ │ ├── anime_season.g.dart │ │ │ ├── anime_source.dart │ │ │ ├── anime_source.g.dart │ │ │ ├── character_role.dart │ │ │ ├── character_role.g.dart │ │ │ ├── extension │ │ │ │ └── activity_type_extension.dart │ │ │ ├── favorite_category.dart │ │ │ ├── home_sector_category.dart │ │ │ ├── home_sector_category.g.dart │ │ │ ├── media_category.dart │ │ │ ├── media_external_link_type.dart │ │ │ ├── media_external_link_type.g.dart │ │ │ ├── media_format.dart │ │ │ ├── media_format.g.dart │ │ │ ├── media_list_status.dart │ │ │ ├── media_list_status.g.dart │ │ │ ├── media_relation.dart │ │ │ ├── media_relation.g.dart │ │ │ ├── media_sort.dart │ │ │ ├── media_sort.g.dart │ │ │ ├── media_status.dart │ │ │ ├── media_status.g.dart │ │ │ ├── media_type.dart │ │ │ ├── media_type.g.dart │ │ │ ├── notification_type.dart │ │ │ ├── refresh_time_key.dart │ │ │ ├── refresh_time_key.freezed.dart │ │ │ ├── refresh_time_key.g.dart │ │ │ ├── staff_language.dart │ │ │ ├── staff_language.g.dart │ │ │ ├── track_list_filter.dart │ │ │ ├── track_list_filter.g.dart │ │ │ ├── user_statics_sort.dart │ │ │ ├── user_statics_sort.g.dart │ │ │ └── user_stats_type.dart │ │ ├── dialog │ │ │ ├── about_dialog.dart │ │ │ ├── dialog_handler.dart │ │ │ ├── dialog_type.dart │ │ │ ├── dialog_type.freezed.dart │ │ │ ├── dialog_type.g.dart │ │ │ ├── downloading_dialog.dart │ │ │ ├── message_dialog.dart │ │ │ └── tutorial_dialog.dart │ │ ├── message │ │ │ ├── snack_bar_message.dart │ │ │ └── snack_bar_message_mixin.dart │ │ ├── setting │ │ │ ├── about.dart │ │ │ ├── check_app_update.dart │ │ │ ├── display_adult_content.dart │ │ │ ├── github_link_setting.dart │ │ │ ├── in_app_player.dart │ │ │ ├── score_format.dart │ │ │ ├── score_format.g.dart │ │ │ ├── setting.dart │ │ │ ├── theme_setting.dart │ │ │ ├── theme_setting.g.dart │ │ │ ├── tutorial_setting.dart │ │ │ ├── user_staff_name_language.dart │ │ │ ├── user_staff_name_language.g.dart │ │ │ ├── user_title_language.dart │ │ │ └── user_title_language.g.dart │ │ ├── state_stream.dart │ │ └── util │ │ │ ├── anime_season_util.dart │ │ │ ├── app_version_util.dart │ │ │ ├── bloc_util.dart │ │ │ ├── change_notifier_util.dart │ │ │ ├── collection_util.dart │ │ │ ├── color_util.dart │ │ │ ├── connectivity_util.dart │ │ │ ├── dao_change_notifier_mixin.dart │ │ │ ├── description_item_util.dart │ │ │ ├── error_handler.dart │ │ │ ├── global_static_constants.dart │ │ │ ├── load_page_util.dart │ │ │ ├── loading_state_mixin.dart │ │ │ ├── logger.dart │ │ │ ├── network_util.dart │ │ │ ├── scheme_util.dart │ │ │ ├── screen_size_util.dart │ │ │ ├── stream_util.dart │ │ │ ├── string_resource_util.dart │ │ │ └── time_util.dart │ ├── data │ │ ├── activity_repository.dart │ │ ├── app_update_dialog_util.dart │ │ ├── auth_repository.dart │ │ ├── character_repository.dart │ │ ├── favorite_repository.dart │ │ ├── github_repository.dart │ │ ├── load_result.dart │ │ ├── mappers │ │ │ ├── activity_mapper.dart │ │ │ ├── activity_reply_mapper.dart │ │ │ ├── airing_schedule_mapper.dart │ │ │ ├── character_mapper.dart │ │ │ ├── github_mapper.dart │ │ │ ├── media_external_link_mapper.dart │ │ │ ├── media_list_mapper.dart │ │ │ ├── media_mapper.dart │ │ │ ├── media_relation_mapper.dart │ │ │ ├── staff_mapper.dart │ │ │ ├── studio_mapper.dart │ │ │ └── user_mapper.dart │ │ ├── media_information_repository.dart │ │ ├── media_list_repository.dart │ │ ├── message_repository.dart │ │ ├── mocks │ │ │ ├── mock_auth_repository.dart │ │ │ ├── mock_favorite_repository.dart │ │ │ ├── mock_media_information_repository.dart │ │ │ ├── mock_media_list_repository.dart │ │ │ ├── mock_message_repository.dart │ │ │ └── mock_user_data_repository.dart │ │ ├── model │ │ │ ├── activity_model.dart │ │ │ ├── activity_reply_model.dart │ │ │ ├── activity_reply_model.freezed.dart │ │ │ ├── airing_schedule_and_anime_model.dart │ │ │ ├── airing_schedule_model.dart │ │ │ ├── airing_schedule_model.freezed.dart │ │ │ ├── anime_list_item_model.dart │ │ │ ├── anime_list_item_model.freezed.dart │ │ │ ├── character_and_voice_actor_model.dart │ │ │ ├── character_model.dart │ │ │ ├── character_model.freezed.dart │ │ │ ├── episode_model.dart │ │ │ ├── episode_model.freezed.dart │ │ │ ├── episode_model.g.dart │ │ │ ├── extension │ │ │ │ ├── airing_schedule_and_anime_model_extension.dart │ │ │ │ └── media_list_item_model_extension.dart │ │ │ ├── favorite_item_model.dart │ │ │ ├── github_user_model.dart │ │ │ ├── github_user_model.freezed.dart │ │ │ ├── github_user_model.g.dart │ │ │ ├── home_sector_model.dart │ │ │ ├── media_cover_image_model.dart │ │ │ ├── media_cover_image_model.freezed.dart │ │ │ ├── media_external_link_model.dart │ │ │ ├── media_external_link_model.freezed.dart │ │ │ ├── media_external_link_model.g.dart │ │ │ ├── media_model.dart │ │ │ ├── media_model.freezed.dart │ │ │ ├── media_relation_model.dart │ │ │ ├── media_tag_model.dart │ │ │ ├── media_tag_model.freezed.dart │ │ │ ├── media_title_model.dart │ │ │ ├── media_title_model.freezed.dart │ │ │ ├── media_title_model.g.dart │ │ │ ├── media_with_list_model.dart │ │ │ ├── notification_model.dart │ │ │ ├── release_package_model.dart │ │ │ ├── release_package_model.freezed.dart │ │ │ ├── search_result_model.dart │ │ │ ├── search_result_model.freezed.dart │ │ │ ├── search_result_model.g.dart │ │ │ ├── shortcut │ │ │ │ ├── activity_status_record.dart │ │ │ │ └── activity_status_record.freezed.dart │ │ │ ├── sorted_group_media_list_model.dart │ │ │ ├── staff_and_role_model.dart │ │ │ ├── staff_character_and_media_connection.dart │ │ │ ├── staff_character_name_model.dart │ │ │ ├── staff_character_name_model.freezed.dart │ │ │ ├── staff_character_name_model.g.dart │ │ │ ├── staff_model.dart │ │ │ ├── staff_model.freezed.dart │ │ │ ├── studio_model.dart │ │ │ ├── studio_model.freezed.dart │ │ │ ├── subject_with_episodes_model.dart │ │ │ ├── subject_with_episodes_model.freezed.dart │ │ │ ├── subject_with_episodes_model.g.dart │ │ │ ├── trailer_model.dart │ │ │ ├── trailer_model.freezed.dart │ │ │ ├── user_data_model.dart │ │ │ ├── user_data_model.freezed.dart │ │ │ ├── user_model.dart │ │ │ ├── user_model.freezed.dart │ │ │ └── user_statistics_model.dart │ │ ├── notification_repository.dart │ │ ├── search_repository.dart │ │ ├── user_data_repository.dart │ │ ├── user_info_repository.dart │ │ └── user_statistics_repository.dart │ ├── database │ │ ├── aniflow_database.dart │ │ ├── aniflow_database.g.dart │ │ ├── dao │ │ │ ├── activity_dao.dart │ │ │ ├── activity_dao.g.dart │ │ │ ├── airing_schedules_dao.dart │ │ │ ├── airing_schedules_dao.g.dart │ │ │ ├── character_dao.dart │ │ │ ├── character_dao.g.dart │ │ │ ├── episode_dao.dart │ │ │ ├── episode_dao.g.dart │ │ │ ├── favorite_dao.dart │ │ │ ├── favorite_dao.g.dart │ │ │ ├── github_release_dao.dart │ │ │ ├── github_release_dao.g.dart │ │ │ ├── media_dao.dart │ │ │ ├── media_dao.g.dart │ │ │ ├── media_list_dao.dart │ │ │ ├── media_list_dao.g.dart │ │ │ ├── search_result_cache_dao.dart │ │ │ ├── search_result_cache_dao.g.dart │ │ │ ├── staff_dao.dart │ │ │ ├── staff_dao.g.dart │ │ │ ├── studio_dao.dart │ │ │ ├── studio_dao.g.dart │ │ │ ├── user_dao.dart │ │ │ └── user_dao.g.dart │ │ ├── di │ │ │ └── database_module.dart │ │ ├── drift_schemas │ │ │ ├── drift_schema_v1.json │ │ │ ├── drift_schema_v10.json │ │ │ ├── drift_schema_v11.json │ │ │ ├── drift_schema_v2.json │ │ │ ├── drift_schema_v3.json │ │ │ ├── drift_schema_v4.json │ │ │ ├── drift_schema_v5.json │ │ │ ├── drift_schema_v6.json │ │ │ ├── drift_schema_v7.json │ │ │ ├── drift_schema_v8.json │ │ │ ├── drift_schema_v9.json │ │ │ └── schema_versions.dart │ │ ├── intercepters │ │ │ └── log_interceptor.dart │ │ ├── mappers │ │ │ ├── activity_mapper.dart │ │ │ ├── airing_schedule_mapper.dart │ │ │ ├── character_mapper.dart │ │ │ ├── github_data_mapper.dart │ │ │ ├── media_external_link_mapper.dart │ │ │ ├── media_list_mapper.dart │ │ │ ├── media_mapper.dart │ │ │ ├── staff_mapper.dart │ │ │ ├── studio_mapper.dart │ │ │ └── user_mapper.dart │ │ ├── relations │ │ │ ├── activity_and_user_relation.dart │ │ │ ├── airing_schedule_and_media_relation.dart │ │ │ ├── character_and_related_media_relation.dart │ │ │ ├── character_and_voice_actor_relation.dart │ │ │ ├── media_and_relation_type_entity.dart │ │ │ ├── media_list_and_media_relation.dart │ │ │ ├── sorted_group_media_list_entity.dart │ │ │ └── staff_and_role_relation_entity.dart │ │ └── tables │ │ │ ├── activity_filter_type_paging_cross_reference_table.dart │ │ │ ├── activity_table.dart │ │ │ ├── airing_schedule_table.dart │ │ │ ├── category_media_paging_cross_reference_table.dart │ │ │ ├── character_media_cross_reference_table.dart │ │ │ ├── character_table.dart │ │ │ ├── character_voice_actor_cross_reference_table.dart │ │ │ ├── episode_table.dart │ │ │ ├── favorite_info_table.dart │ │ │ ├── media_airing_schedule_updated_table.dart │ │ │ ├── media_character_paging_cross_reference_table.dart │ │ │ ├── media_external_link_table.dart │ │ │ ├── media_list_table.dart │ │ │ ├── media_relation_cross_reference_table.dart │ │ │ ├── media_staff_paging_cross_reference_table.dart │ │ │ ├── media_table.dart │ │ │ ├── released_package_table.dart │ │ │ ├── search_result_table.dart │ │ │ ├── staff_table.dart │ │ │ ├── studio_media_cross_reference_table.dart │ │ │ ├── studio_table.dart │ │ │ └── user_table.dart │ ├── design_system │ │ ├── animation │ │ │ ├── page_transaction_animation.dart │ │ │ └── scale_transaction_animation.dart │ │ ├── assets │ │ │ ├── icons.dart │ │ │ └── video.dart │ │ ├── dialog │ │ │ ├── restart_app_dialog.dart │ │ │ └── scoring_dialog.dart │ │ ├── theme │ │ │ └── colors.dart │ │ └── widget │ │ │ ├── activity_item_widget.dart │ │ │ ├── af_html_widget.dart │ │ │ ├── af_network_image.dart │ │ │ ├── af_toggle_button.dart │ │ │ ├── airing_media_item.dart │ │ │ ├── avatar_icon.dart │ │ │ ├── character_and_voice_actor_widget.dart │ │ │ ├── character_with_media_item_widget.dart │ │ │ ├── comming_soon.dart │ │ │ ├── date_time_button.dart │ │ │ ├── external_link_item.dart │ │ │ ├── genre_item.dart │ │ │ ├── image_load_initial_widget.dart │ │ │ ├── info_item.dart │ │ │ ├── loading_dummy_scaffold.dart │ │ │ ├── loading_indicator.dart │ │ │ ├── max_limit_text_filed.dart │ │ │ ├── media_cover.dart │ │ │ ├── media_list_item.dart │ │ │ ├── media_preview_item.dart │ │ │ ├── media_relation_widget.dart │ │ │ ├── media_row_item.dart │ │ │ ├── notification_item_widget.dart │ │ │ ├── page_bottom_state_indicator.dart │ │ │ ├── popup_menu_anchor.dart │ │ │ ├── reactive_profile_with_description.dart │ │ │ ├── search_anime_item.dart │ │ │ ├── short_num_label_icon_button.dart │ │ │ ├── shrinkable_floating_action_button.dart │ │ │ ├── staff_item.dart │ │ │ ├── trailer_preview.dart │ │ │ ├── twitter_hashtag_widget.dart │ │ │ └── vertical_animated_scale_switcher.dart │ ├── firebase │ │ ├── analytics │ │ │ ├── data_size_property │ │ │ │ └── data_type.dart │ │ │ ├── fa_event.dart │ │ │ ├── fa_user_property.dart │ │ │ └── firebase_analytics_util.dart │ │ └── remote_config │ │ │ ├── di │ │ │ └── remote_config_module.dart │ │ │ ├── model │ │ │ ├── home_struct_remote_model.dart │ │ │ ├── home_struct_remote_model.freezed.dart │ │ │ └── home_struct_remote_model.g.dart │ │ │ └── remote_config_manager.dart │ ├── network │ │ ├── ani_list_data_source.dart │ │ ├── api │ │ │ ├── activity_detail_query_graphql.dart │ │ │ ├── activity_like_mution_graphql.dart │ │ │ ├── activity_page_query_graphql.dart │ │ │ ├── airing_schedules_query_graphql.dart.dart │ │ │ ├── ani_auth_mution_graphql.dart │ │ │ ├── ani_save_media_list_mution_graphql.dart │ │ │ ├── character_detail_query_graphql.dart │ │ │ ├── common_graphql.dart │ │ │ ├── media_content_graphql.dart │ │ │ ├── media_detail_query_graphql.dart │ │ │ ├── media_list_query_graphql.dart │ │ │ ├── media_page_query_graphql.dart │ │ │ ├── medias_query_graphql.dart │ │ │ ├── notification_query_graphql.dart │ │ │ ├── query_anime_staff_page_graphql.dart │ │ │ ├── query_media_character_page_graphql.dart │ │ │ ├── search_query_graphql.dart │ │ │ ├── staff_detail_query_graphql.dart │ │ │ ├── studio_detail_query_graphql.dart │ │ │ ├── toggle_favorite_mutation_graphql.dart │ │ │ ├── user_content_graphql.dart │ │ │ ├── user_favorite_anime_query_graphql.dart │ │ │ ├── user_favorite_character_query_graphql.dart │ │ │ ├── user_favorite_manga_query_graphql.dart │ │ │ ├── user_favorite_query_graphql.dart │ │ │ ├── user_favorite_staff_query_graphql.dart │ │ │ └── user_stats_query_graphql.dart │ │ ├── auth_data_source.dart │ │ ├── di │ │ │ └── di_network_module.dart │ │ ├── github_data_source.dart │ │ ├── model │ │ │ ├── activity_like_notification_dto.dart │ │ │ ├── activity_like_notification_dto.freezed.dart │ │ │ ├── activity_like_notification_dto.g.dart │ │ │ ├── activity_message_notification_dto.dart │ │ │ ├── activity_message_notification_dto.freezed.dart │ │ │ ├── activity_message_notification_dto.g.dart │ │ │ ├── activity_reply_dto.dart │ │ │ ├── activity_reply_dto.freezed.dart │ │ │ ├── activity_reply_dto.g.dart │ │ │ ├── activity_reply_like_notification_dto.dart │ │ │ ├── activity_reply_like_notification_dto.freezed.dart │ │ │ ├── activity_reply_like_notification_dto.g.dart │ │ │ ├── activity_reply_notification_dto.dart │ │ │ ├── activity_reply_notification_dto.freezed.dart │ │ │ ├── activity_reply_notification_dto.g.dart │ │ │ ├── activity_reply_subscription_notification_dto.dart │ │ │ ├── activity_reply_subscription_notification_dto.freezed.dart │ │ │ ├── activity_reply_subscription_notification_dto.g.dart │ │ │ ├── airing_notification_dto.dart │ │ │ ├── airing_notification_dto.freezed.dart │ │ │ ├── airing_notification_dto.g.dart │ │ │ ├── airing_schedule_dto.dart │ │ │ ├── airing_schedule_dto.freezed.dart │ │ │ ├── airing_schedule_dto.g.dart │ │ │ ├── ani_activity.dart │ │ │ ├── anime_rank.dart │ │ │ ├── anime_rank.freezed.dart │ │ │ ├── anime_rank.g.dart │ │ │ ├── bangumi_subject_dto.dart │ │ │ ├── bangumi_subject_dto.freezed.dart │ │ │ ├── bangumi_subject_dto.g.dart │ │ │ ├── character_connection.dart │ │ │ ├── character_connection.freezed.dart │ │ │ ├── character_connection.g.dart │ │ │ ├── character_dto.dart │ │ │ ├── character_dto.freezed.dart │ │ │ ├── character_dto.g.dart │ │ │ ├── character_edge.dart │ │ │ ├── character_edge.freezed.dart │ │ │ ├── character_edge.g.dart │ │ │ ├── character_image_dto.dart │ │ │ ├── character_image_dto.freezed.dart │ │ │ ├── character_image_dto.g.dart │ │ │ ├── following_notification_dto.dart │ │ │ ├── following_notification_dto.freezed.dart │ │ │ ├── following_notification_dto.g.dart │ │ │ ├── fuzzy_date_dto.dart │ │ │ ├── fuzzy_date_dto.freezed.dart │ │ │ ├── fuzzy_date_dto.g.dart │ │ │ ├── fuzzy_date_input_dto.dart │ │ │ ├── fuzzy_date_input_dto.freezed.dart │ │ │ ├── fuzzy_date_input_dto.g.dart │ │ │ ├── github_released_dto.dart │ │ │ ├── github_released_dto.freezed.dart │ │ │ ├── github_released_dto.g.dart │ │ │ ├── github_user_dto.dart │ │ │ ├── github_user_dto.freezed.dart │ │ │ ├── github_user_dto.g.dart │ │ │ ├── likeable_type.dart │ │ │ ├── likeable_type.g.dart │ │ │ ├── list_activity_dto.dart │ │ │ ├── list_activity_dto.freezed.dart │ │ │ ├── list_activity_dto.g.dart │ │ │ ├── media_connection.dart │ │ │ ├── media_connection.freezed.dart │ │ │ ├── media_connection.g.dart │ │ │ ├── media_cover_image_dto.dart │ │ │ ├── media_cover_image_dto.freezed.dart │ │ │ ├── media_cover_image_dto.g.dart │ │ │ ├── media_data_change_notification_dto.dart │ │ │ ├── media_data_change_notification_dto.freezed.dart │ │ │ ├── media_data_change_notification_dto.g.dart │ │ │ ├── media_deletion_notification_dto.dart │ │ │ ├── media_deletion_notification_dto.freezed.dart │ │ │ ├── media_deletion_notification_dto.g.dart │ │ │ ├── media_dto.dart │ │ │ ├── media_dto.freezed.dart │ │ │ ├── media_dto.g.dart │ │ │ ├── media_edge.dart │ │ │ ├── media_edge.freezed.dart │ │ │ ├── media_edge.g.dart │ │ │ ├── media_external_links_dto.dart │ │ │ ├── media_external_links_dto.freezed.dart │ │ │ ├── media_external_links_dto.g.dart │ │ │ ├── media_list_dto.dart │ │ │ ├── media_list_dto.freezed.dart │ │ │ ├── media_list_dto.g.dart │ │ │ ├── media_list_option_dto.dart │ │ │ ├── media_list_option_dto.freezed.dart │ │ │ ├── media_list_option_dto.g.dart │ │ │ ├── media_merge_notification_dto.dart │ │ │ ├── media_merge_notification_dto.freezed.dart │ │ │ ├── media_merge_notification_dto.g.dart │ │ │ ├── media_tag_dto.dart │ │ │ ├── media_tag_dto.freezed.dart │ │ │ ├── media_tag_dto.g.dart │ │ │ ├── nodes_dto.dart │ │ │ ├── nodes_dto.freezed.dart │ │ │ ├── nodes_dto.g.dart │ │ │ ├── notification.dart │ │ │ ├── page_info.dart │ │ │ ├── page_info.freezed.dart │ │ │ ├── page_info.g.dart │ │ │ ├── related_media_addition_notification_dto.dart │ │ │ ├── related_media_addition_notification_dto.freezed.dart │ │ │ ├── related_media_addition_notification_dto.g.dart │ │ │ ├── search_request.dart │ │ │ ├── search_request.freezed.dart │ │ │ ├── search_title.dart │ │ │ ├── search_title.freezed.dart │ │ │ ├── search_title.g.dart │ │ │ ├── source_dto.dart │ │ │ ├── source_dto.freezed.dart │ │ │ ├── source_dto.g.dart │ │ │ ├── staff_connection.dart │ │ │ ├── staff_connection.freezed.dart │ │ │ ├── staff_connection.g.dart │ │ │ ├── staff_dto.dart │ │ │ ├── staff_dto.freezed.dart │ │ │ ├── staff_dto.g.dart │ │ │ ├── staff_edge.dart │ │ │ ├── staff_edge.freezed.dart │ │ │ ├── staff_edge.g.dart │ │ │ ├── staff_image_dto.dart │ │ │ ├── staff_image_dto.freezed.dart │ │ │ ├── staff_image_dto.g.dart │ │ │ ├── studio_connection.dart │ │ │ ├── studio_connection.freezed.dart │ │ │ ├── studio_connection.g.dart │ │ │ ├── studio_dto.dart │ │ │ ├── studio_dto.freezed.dart │ │ │ ├── studio_dto.g.dart │ │ │ ├── text_activity_dto.dart │ │ │ ├── text_activity_dto.freezed.dart │ │ │ ├── text_activity_dto.g.dart │ │ │ ├── thread_dto.dart │ │ │ ├── thread_dto.freezed.dart │ │ │ ├── thread_dto.g.dart │ │ │ ├── track_dto.dart │ │ │ ├── track_dto.freezed.dart │ │ │ ├── track_dto.g.dart │ │ │ ├── trailer_dto.dart │ │ │ ├── trailer_dto.freezed.dart │ │ │ ├── trailer_dto.g.dart │ │ │ ├── user_country_statics_dto.dart │ │ │ ├── user_country_statics_dto.freezed.dart │ │ │ ├── user_country_statics_dto.g.dart │ │ │ ├── user_dto.dart │ │ │ ├── user_dto.freezed.dart │ │ │ ├── user_dto.g.dart │ │ │ ├── user_favourites_dto.dart │ │ │ ├── user_format_statics_dto.dart │ │ │ ├── user_format_statics_dto.freezed.dart │ │ │ ├── user_format_statics_dto.g.dart │ │ │ ├── user_genres_statics_dto.dart │ │ │ ├── user_genres_statics_dto.freezed.dart │ │ │ ├── user_genres_statics_dto.g.dart │ │ │ ├── user_length_statics_dto.dart │ │ │ ├── user_length_statics_dto.freezed.dart │ │ │ ├── user_length_statics_dto.g.dart │ │ │ ├── user_options.dart │ │ │ ├── user_options.freezed.dart │ │ │ ├── user_options.g.dart │ │ │ ├── user_release_year_statics_dto.dart │ │ │ ├── user_release_year_statics_dto.freezed.dart │ │ │ ├── user_release_year_statics_dto.g.dart │ │ │ ├── user_score_statics_dto.dart │ │ │ ├── user_score_statics_dto.freezed.dart │ │ │ ├── user_score_statics_dto.g.dart │ │ │ ├── user_staff_statics_dto.dart │ │ │ ├── user_staff_statics_dto.freezed.dart │ │ │ ├── user_staff_statics_dto.g.dart │ │ │ ├── user_statistics_dto.dart │ │ │ ├── user_statistics_dto.freezed.dart │ │ │ ├── user_statistics_dto.g.dart │ │ │ ├── user_status_statics_dto.dart │ │ │ ├── user_status_statics_dto.freezed.dart │ │ │ ├── user_status_statics_dto.g.dart │ │ │ ├── user_studio_statics_dto.dart │ │ │ ├── user_studio_statics_dto.freezed.dart │ │ │ ├── user_studio_statics_dto.g.dart │ │ │ ├── user_tag_statics_dto.dart │ │ │ ├── user_tag_statics_dto.freezed.dart │ │ │ ├── user_tag_statics_dto.g.dart │ │ │ ├── user_voice_actor_statics_dto.dart │ │ │ ├── user_voice_actor_statics_dto.freezed.dart │ │ │ └── user_voice_actor_statics_dto.g.dart │ │ ├── util │ │ │ ├── anilist_page_util.dart │ │ │ ├── date_time_util.dart │ │ │ └── http_status_util.dart │ │ └── web_source │ │ │ └── util.dart │ ├── notification │ │ ├── notification_channel.dart │ │ └── notification_util.dart │ ├── paging │ │ ├── page_loading_state.dart │ │ ├── paging_bloc.dart │ │ ├── paging_content_widget.dart │ │ └── refresh_paging_bloc.dart │ ├── platform │ │ ├── auth_event_channel.dart │ │ ├── di │ │ │ └── auth_event_channel_module.dart │ │ └── platform_channel.dart │ ├── shared_preference │ │ ├── di │ │ │ └── shared_preferences_module.dart │ │ └── user_data_preferences.dart │ └── usecase │ │ ├── get_media_list_item_use_case.dart │ │ └── media_mark_watched_use_case.dart ├── feature │ ├── activity_replies │ │ ├── activity_replies.dart │ │ └── bloc │ │ │ ├── activity_replies_bloc.dart │ │ │ ├── activity_replies_state.dart │ │ │ └── activity_replies_state.freezed.dart │ ├── airing_schedule │ │ ├── airing_schedule.dart │ │ ├── airing_schedule_of_day │ │ │ ├── airing_schedule_of_day.dart │ │ │ ├── airing_schedule_of_day_bloc.dart │ │ │ ├── schedule_page_key.dart │ │ │ └── schedule_page_state.dart │ │ ├── movie_schedule_time_line │ │ │ ├── month_schedule_category.dart │ │ │ ├── movie_schedule_time_line.dart │ │ │ └── movie_schedule_time_line_bloc.dart │ │ └── schedule_category.dart │ ├── aniflow_home │ │ ├── ani_flow_home.dart │ │ ├── ani_flow_router_delegate.dart │ │ ├── aniflow_home_bloc.dart │ │ ├── aniflow_home_state.dart │ │ ├── aniflow_home_state.freezed.dart │ │ └── top_level_navigation.dart │ ├── auth │ │ ├── auth_dialog.dart │ │ └── bloc │ │ │ ├── auth_bloc.dart │ │ │ ├── auth_ui_state.dart │ │ │ └── auth_ui_state.freezed.dart │ ├── birthday_characters_page │ │ ├── birthday_character_page_bloc.dart │ │ └── birthday_characters_page.dart │ ├── character_page │ │ ├── bloc │ │ │ ├── character_page_bloc.dart │ │ │ ├── character_page_model.dart │ │ │ ├── character_page_model.freezed.dart │ │ │ └── character_paging_bloc.dart │ │ └── character_page.dart │ ├── detail_character │ │ ├── bloc │ │ │ ├── detail_character_bloc.dart │ │ │ ├── detail_character_state.dart │ │ │ └── detail_character_state.freezed.dart │ │ └── detail_character.dart │ ├── detail_media │ │ ├── bloc │ │ │ ├── detail_media_bloc.dart │ │ │ ├── detail_media_ui_state.dart │ │ │ └── detail_media_ui_state.freezed.dart │ │ ├── build_media_basic_info.dart │ │ ├── build_related_info.dart │ │ ├── build_watch_next_episode_area.dart │ │ └── detail_media.dart │ ├── detail_staff │ │ ├── bloc │ │ │ ├── detail_staff_bloc.dart │ │ │ ├── detail_staff_state.dart │ │ │ ├── detail_staff_state.freezed.dart │ │ │ └── voice_actor_contents_paging_bloc.dart │ │ └── detail_staff.dart │ ├── detail_studio │ │ ├── bloc │ │ │ ├── detail_studio_bloc.dart │ │ │ ├── detail_studio_state.dart │ │ │ ├── detail_studio_state.freezed.dart │ │ │ └── studio_contents_paging_bloc.dart │ │ └── detail_studio.dart │ ├── discover │ │ ├── airing_schedule │ │ │ ├── dummy_schedule_category_data.dart │ │ │ ├── today_airing_schedule.dart │ │ │ ├── today_airing_schedule_bloc.dart │ │ │ ├── today_airing_schedule_state.dart │ │ │ └── today_airing_schedule_state.freezed.dart │ │ ├── birthday_characters │ │ │ ├── birthday_character.dart │ │ │ ├── birthday_characters_bloc.dart │ │ │ ├── birthday_characters_state.dart │ │ │ ├── birthday_characters_state.freezed.dart │ │ │ └── dummy_birthday_character_data.dart │ │ ├── discover.dart │ │ ├── discover_bloc.dart │ │ ├── discover_ui_state.dart │ │ ├── discover_ui_state.freezed.dart │ │ ├── media_category_preview │ │ │ ├── media_category_preview.dart │ │ │ ├── media_category_preview_bloc.dart │ │ │ ├── media_category_preview_state.dart │ │ │ └── media_category_preview_state.freezed.dart │ │ ├── next_to_watch │ │ │ ├── next_to_watch.dart │ │ │ ├── next_to_watch_bloc.dart │ │ │ ├── next_to_watch_state.dart │ │ │ └── next_to_watch_state.freezed.dart │ │ └── recent_movies │ │ │ ├── dummy_movies_data.dart │ │ │ ├── recent_movies.dart │ │ │ ├── recent_movies_bloc.dart │ │ │ ├── recent_movies_state.dart │ │ │ └── recent_movies_state.freezed.dart │ ├── edit_profile │ │ ├── bloc │ │ │ ├── edit_profile_bloc.dart │ │ │ ├── edit_profile_state.dart │ │ │ └── edit_profile_state.freezed.dart │ │ └── edit_profile.dart │ ├── image_preview │ │ ├── image_preview.dart │ │ ├── preview_source.dart │ │ ├── preview_source.freezed.dart │ │ ├── preview_source.g.dart │ │ └── util │ │ │ └── preview_source_extensions.dart │ ├── media_list_update_page │ │ ├── bloc │ │ │ ├── media_list_update_bloc.dart │ │ │ ├── media_list_update_page_state.dart │ │ │ └── media_list_update_page_state.freezed.dart │ │ ├── media_list_modify_result.dart │ │ └── media_list_update_page.dart │ ├── media_page │ │ ├── bloc │ │ │ └── media_page_bloc.dart │ │ └── media_page.dart │ ├── media_track │ │ ├── bloc │ │ │ ├── track_bloc.dart │ │ │ ├── track_ui_state.dart │ │ │ └── track_ui_state.freezed.dart │ │ └── media_track.dart │ ├── notification │ │ ├── bloc │ │ │ ├── notification_bloc.dart │ │ │ ├── notification_paging_bloc.dart │ │ │ ├── notification_state.dart │ │ │ └── notification_state.freezed.dart │ │ └── notification.dart │ ├── profile │ │ ├── profile.dart │ │ ├── profile_bloc.dart │ │ ├── profile_state.dart │ │ ├── profile_state.freezed.dart │ │ ├── profile_tab_category.dart │ │ ├── sub_activity │ │ │ ├── profile_activity_overview.dart │ │ │ └── user_activity_paging_bloc.dart │ │ ├── sub_favorite │ │ │ ├── profile_favorite.dart │ │ │ ├── profile_favorite_bloc.dart │ │ │ ├── profile_favorite_state.dart │ │ │ └── profile_favorite_state.freezed.dart │ │ ├── sub_media_list │ │ │ ├── profile_media_list.dart │ │ │ ├── profile_media_list_bloc.dart │ │ │ ├── profile_media_list_state.dart │ │ │ └── profile_media_list_state.freezed.dart │ │ ├── sub_stats │ │ │ ├── bloc │ │ │ │ ├── stats_bloc.dart │ │ │ │ ├── stats_state.dart │ │ │ │ └── stats_state.freezed.dart │ │ │ └── stats.dart │ │ └── title_with_items_builder.dart │ ├── search │ │ ├── bloc │ │ │ ├── search_bloc.dart │ │ │ ├── search_state.dart │ │ │ ├── search_state.freezed.dart │ │ │ └── search_type.dart │ │ ├── paging │ │ │ ├── character_search_result_paging_bloc.dart │ │ │ ├── character_search_result_paging_content.dart │ │ │ ├── media_search_result_paging_bloc.dart │ │ │ ├── media_search_result_paging_content.dart │ │ │ ├── staff_search_result_paging_bloc.dart │ │ │ ├── staff_search_result_paging_content.dart │ │ │ ├── studio_search_result_paging_bloc.dart │ │ │ ├── studio_search_result_paging_content.dart │ │ │ ├── user_search_result_paging_bloc.dart │ │ │ └── user_search_result_paging_content.dart │ │ └── search_page.dart │ ├── settings │ │ ├── check_for_update │ │ │ ├── check_for_update.dart │ │ │ ├── check_for_update_bloc.dart │ │ │ ├── check_for_update_state.dart │ │ │ └── check_for_update_state.freezed.dart │ │ ├── github_link │ │ │ ├── github_link.dart │ │ │ └── github_link_bloc.dart │ │ ├── list_settings_dialog.dart │ │ ├── settings.dart │ │ ├── settings_bloc.dart │ │ ├── settings_category.dart │ │ ├── settings_state.dart │ │ └── settings_state.freezed.dart │ ├── social │ │ ├── activity │ │ │ ├── activity.dart │ │ │ └── bloc │ │ │ │ ├── activity_bloc.dart │ │ │ │ ├── activity_item_bloc.dart │ │ │ │ ├── activity_paging_bloc.dart │ │ │ │ ├── activity_state.dart │ │ │ │ └── activity_state.freezed.dart │ │ └── social.dart │ ├── staff_page │ │ ├── bloc │ │ │ └── staff_page_bloc.dart │ │ └── staff_page.dart │ └── toturial │ │ └── gesture_tutorial.dart ├── firebase_options.dart └── main.dart ├── platform_downloader ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ │ └── com │ │ │ └── andannn │ │ │ └── downloader │ │ │ └── platform_downloader │ │ │ ├── Constants.kt │ │ │ ├── Downloader.kt │ │ │ └── PlatformDownloaderPlugin.kt │ │ └── test │ │ └── kotlin │ │ └── com │ │ └── andannn │ │ └── downloader │ │ └── platform_downloader │ │ └── PlatformDownloaderPluginTest.kt ├── example │ ├── .gitignore │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── app │ │ │ ├── build.gradle │ │ │ └── src │ │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── andannn │ │ │ │ │ │ └── downloader │ │ │ │ │ │ └── platform_downloader_example │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── res │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── values-night │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values │ │ │ │ │ └── styles.xml │ │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ └── settings.gradle │ ├── ios │ │ ├── .gitignore │ │ ├── Flutter │ │ │ ├── AppFrameworkInfo.plist │ │ │ ├── Debug.xcconfig │ │ │ └── Release.xcconfig │ │ ├── Podfile │ │ ├── Runner.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── xcshareddata │ │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ ├── Runner │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ │ │ └── LaunchImage.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── LaunchImage.png │ │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ │ └── README.md │ │ │ ├── Base.lproj │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ └── Runner-Bridging-Header.h │ │ └── RunnerTests │ │ │ └── RunnerTests.swift │ ├── lib │ │ └── main.dart │ ├── pubspec.lock │ └── pubspec.yaml ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ └── PlatformDownloaderPlugin.swift │ └── platform_downloader.podspec ├── lib │ ├── platform_downloader.dart │ ├── platform_downloader_method_channel.dart │ └── platform_downloader_platform_interface.dart ├── pubspec.yaml └── test │ └── platform_downloader_test.dart ├── platform_notification ├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android │ ├── .gitignore │ ├── build.gradle │ ├── settings.gradle │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ │ └── com │ │ │ └── andannn │ │ │ └── aniflow │ │ │ └── notification │ │ │ └── platform_notification │ │ │ ├── NotificationHelper.kt │ │ │ └── PlatformNotificationPlugin.kt │ │ └── test │ │ └── kotlin │ │ └── com │ │ └── andannn │ │ └── aniflow │ │ └── notification │ │ └── platform_notification │ │ └── PlatformNotificationPluginTest.kt ├── example │ ├── .gitignore │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── app │ │ │ ├── build.gradle │ │ │ └── src │ │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── andannn │ │ │ │ │ │ └── aniflow │ │ │ │ │ │ └── notification │ │ │ │ │ │ └── platform_notification_example │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── res │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── values-night │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values │ │ │ │ │ └── styles.xml │ │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ └── settings.gradle │ ├── ios │ │ ├── .gitignore │ │ ├── Flutter │ │ │ ├── AppFrameworkInfo.plist │ │ │ ├── Debug.xcconfig │ │ │ └── Release.xcconfig │ │ ├── Podfile │ │ ├── Runner.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── xcshareddata │ │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ ├── Runner.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ ├── Runner │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ │ │ └── LaunchImage.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── LaunchImage.png │ │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ │ └── README.md │ │ │ ├── Base.lproj │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ └── Runner-Bridging-Header.h │ │ └── RunnerTests │ │ │ └── RunnerTests.swift │ ├── lib │ │ └── main.dart │ ├── pubspec.lock │ └── pubspec.yaml ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ └── PlatformNotificationPlugin.swift │ └── platform_notification.podspec ├── lib │ ├── platform_notification.dart │ ├── platform_notification_channel_model.dart │ ├── platform_notification_channel_model.freezed.dart │ ├── platform_notification_channel_model.g.dart │ ├── platform_notification_method_channel.dart │ ├── platform_notification_model.dart │ ├── platform_notification_model.freezed.dart │ ├── platform_notification_model.g.dart │ └── platform_notification_platform_interface.dart └── pubspec.yaml ├── pubspec.lock ├── pubspec.yaml ├── screen_shots ├── anime.png ├── character.png ├── home_page.png ├── profile.jpeg ├── track_list.png └── voice_actor.png ├── test ├── core │ ├── common │ │ ├── common_test.dart │ │ └── util │ │ │ └── app_version_util_test.dart │ ├── data │ │ ├── auth_repository_test.dart │ │ ├── github_repository_test.dart │ │ ├── mocks │ │ │ ├── media_information_repository_mock.dart │ │ │ ├── mock_favorite_repository.dart │ │ │ ├── mock_github_data_source.dart │ │ │ ├── mock_github_release_dao.dart │ │ │ ├── mock_media_list_repository.dart │ │ │ ├── mock_remote_config_manager.dart │ │ │ └── search_repository_mock.dart │ │ └── user_data_repository_test.dart │ ├── database │ │ ├── dao │ │ │ ├── activity_dao_test.dart │ │ │ ├── airing_schedule_dao_test.dart │ │ │ ├── character_dao_test.dart │ │ │ ├── episode_dao_test.dart │ │ │ ├── favorite_dao_test.dart │ │ │ ├── github_release_dao_test.dart │ │ │ ├── media_dao_test.dart │ │ │ ├── media_list_dao_test.dart │ │ │ ├── search_result_cache_dao_test.dart │ │ │ ├── staff_dao_test.dart │ │ │ ├── studio_dao_test.dart │ │ │ └── user_dao_test.dart │ │ ├── generated_migrations │ │ │ ├── schema.dart │ │ │ ├── schema_v1.dart │ │ │ ├── schema_v10.dart │ │ │ ├── schema_v11.dart │ │ │ ├── schema_v2.dart │ │ │ ├── schema_v3.dart │ │ │ ├── schema_v4.dart │ │ │ ├── schema_v5.dart │ │ │ ├── schema_v6.dart │ │ │ ├── schema_v7.dart │ │ │ ├── schema_v8.dart │ │ │ └── schema_v9.dart │ │ └── migraion_test.dart │ ├── shared_preference │ │ └── user_data_preferences_test.dart │ └── usecase │ │ └── get_media_list_item_use_case_test.dart └── feature │ ├── airing_schedule │ └── bloc │ │ └── airing_schedule_bloc_test.dart │ ├── anime_search │ └── bloc │ │ └── search_bloc_test.dart │ ├── character_page │ └── bloc │ │ └── character_page_bloc_test.dart │ └── detail_character │ └── bloc │ └── detail_character_bloc_test.dart └── test_driver ├── integration_test.dart └── run_flutter_drive.sh /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "pub" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | app/.cxx 15 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/proguard-rules.pro -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/debug/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #150B2D 4 | -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/andannn/aniflow/AniflowApplication.kt: -------------------------------------------------------------------------------- 1 | package com.andannn.aniflow 2 | 3 | import android.app.Application 4 | import android.util.Log 5 | 6 | private const val TAG = "AniflowApplication" 7 | class AniflowApplication : Application() { 8 | override fun onCreate() { 9 | super.onCreate() 10 | Log.d(TAG, "onCreate: ${this.hashCode()}") 11 | } 12 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/drawable-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #202226 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 18 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/android/app/src/profile/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/profile/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #1F0E13 4 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4g 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8.fullMode=false 5 | 6 | android.releaseSigning=true 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip 6 | -------------------------------------------------------------------------------- /assets/image/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/assets/image/ic_launcher-playstore.png -------------------------------------------------------------------------------- /assets/image/ic_youtube_xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/image/new_badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/assets/image/new_badge.png -------------------------------------------------------------------------------- /assets/json/remote_config_defaults.json: -------------------------------------------------------------------------------- 1 | { 2 | "enable_hi_animation_feature": "true", 3 | "enable_github_link_feature": "false", 4 | "latest_app_version": "0.2.8", 5 | "enable_social_tab": "false", 6 | "home_struct_list": "{ \"anime\": [ \"upNext\", \"birthdayCharacters\", \"todaySchedule\", \"recentMovies\", \"currentSeasonAnime\", \"nextSeasonAnime\", \"trendingAnime\", \"movieAnime\", \"newAddedAnime\" ], \"manga\": [ \"trendingManga\", \"allTimePopularManga\", \"topManhwa\", \"newAddedManga\" ] }", 7 | "show_sensitive_contents": "false" 8 | } -------------------------------------------------------------------------------- /assets/video/long_press_gesture_video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/assets/video/long_press_gesture_video.mp4 -------------------------------------------------------------------------------- /assets/video/sliding_gesture_video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/assets/video/sliding_gesture_video.mp4 -------------------------------------------------------------------------------- /devtools_options.yaml: -------------------------------------------------------------------------------- 1 | extensions: 2 | - drift: true -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | {"flutter":{"platforms":{"android":{"default":{"projectId":"aniflow-fea18","appId":"1:356471534096:android:debd7ede4a151de9fe5095","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"aniflow-fea18","appId":"1:356471534096:ios:a02f2d86cf503e09fe5095","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"aniflow-dev","appId":"1:154390430681:ios:2ac5c1b83ca76135934fc8","uploadDebugSymbols":true,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"aniflow-fea18","configurations":{"android":"1:356471534096:android:debd7ede4a151de9fe5095","ios":"1:356471534096:ios:a02f2d86cf503e09fe5095"}}}}}} -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/ios/Runner/Assets.xcassets/AppIcon.appiconset/iTunesArtwork@2x 1.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /ios/build/.last_build_id: -------------------------------------------------------------------------------- 1 | a796a1d71ae9080c1eb6f9460ee53ff5 -------------------------------------------------------------------------------- /ios/firebase_app_id_file.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_generated_by": "FlutterFire CLI", 3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", 4 | "GOOGLE_APP_ID": "1:356471534096:ios:a02f2d86cf503e09fe5095", 5 | "FIREBASE_PROJECT_ID": "aniflow-fea18", 6 | "GCM_SENDER_ID": "356471534096" 7 | } -------------------------------------------------------------------------------- /l10n.yaml: -------------------------------------------------------------------------------- 1 | arb-dir: lib/app/l10n 2 | template-arb-file: app_en.arb 3 | output-localization-file: app_localizations.dart 4 | untranslated-messages-file: desiredFileName.txt 5 | synthetic-package: false -------------------------------------------------------------------------------- /lib/app/app_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/theme_setting.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'app_state.freezed.dart'; 5 | 6 | @freezed 7 | class AppState with _$AppState { 8 | const factory AppState({ 9 | @Default(ThemeSetting.system) ThemeSetting theme, 10 | }) = _AppState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/app/di/env.dart: -------------------------------------------------------------------------------- 1 | 2 | mixin AfEnvironment { 3 | static const String mock = "Mock"; 4 | static const String mobile = "Mobile"; 5 | static const String desktop = "Desktop"; 6 | } -------------------------------------------------------------------------------- /lib/app/di/get_it_di.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/app/di/env.dart'; 2 | import 'package:aniflow/app/di/get_it_di.config.dart'; 3 | import 'package:aniflow/core/database/aniflow_database.dart'; 4 | import 'package:get_it/get_it.dart'; 5 | import 'package:injectable/injectable.dart'; 6 | 7 | @injectableInit 8 | Future initDI(GetIt getIt, {String env = AfEnvironment.mobile}) => 9 | getIt.init(environment: env); 10 | 11 | extension GetItEx on GetIt { 12 | Future dispose() { 13 | return Future.wait( 14 | [ 15 | /// close database 16 | if (isRegistered()) get().close(), 17 | ], 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/background_task/di/workmanager_module.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/app/di/env.dart'; 2 | import 'package:aniflow/callback_dispatcher.dart'; 3 | import 'package:flutter/foundation.dart'; 4 | import 'package:injectable/injectable.dart'; 5 | import 'package:workmanager/workmanager.dart'; 6 | 7 | @module 8 | abstract class DIWorkmanagerModule { 9 | @lazySingleton 10 | @preResolve 11 | @Environment(AfEnvironment.mobile) 12 | Future get workManager async { 13 | final workManager = Workmanager(); 14 | await Workmanager() 15 | .initialize(callbackDispatcher, isInDebugMode: kDebugMode); 16 | return workManager; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/background_task/tasks/post_anilist_notification_task.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/background_task/task.dart'; 2 | import 'package:aniflow/core/background_task/task_manager.dart'; 3 | import 'package:workmanager/workmanager.dart'; 4 | 5 | class PostAnilistNotificationTask extends PeriodicBackgroundTask { 6 | const PostAnilistNotificationTask() 7 | : super( 8 | frequency: const Duration(hours: 1), 9 | ); 10 | 11 | @override 12 | Constraints? get constraints => 13 | Constraints(networkType: NetworkType.connected); 14 | 15 | @override 16 | Duration get initialDelay => const Duration(hours: 2); 17 | 18 | @override 19 | String get name => BackgroundTaskName.sendNotificationTaskName; 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/background_task/tasks/sync_new_released_play_source_task.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/background_task/task.dart'; 2 | import 'package:aniflow/core/background_task/task_manager.dart'; 3 | import 'package:workmanager/workmanager.dart'; 4 | 5 | class SyncNewReleasedPlaySourceTask extends PeriodicBackgroundTask { 6 | const SyncNewReleasedPlaySourceTask() 7 | : super( 8 | frequency: const Duration(hours: 1), 9 | ); 10 | 11 | @override 12 | Constraints? get constraints => 13 | Constraints(networkType: NetworkType.unmetered); 14 | 15 | @override 16 | Duration get initialDelay => const Duration(hours: 0); 17 | 18 | @override 19 | String get name => BackgroundTaskName.syncNewReleasedPlaySourceTaskName; 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/common/definitions/activity_filter_type.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'activity_filter_type.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum ActivityFilterType { 7 | /// no filter. 8 | @JsonValue('ALL') 9 | all, 10 | 11 | /// only test activity. 12 | @JsonValue('TEXT') 13 | text, 14 | 15 | /// only list activity 16 | @JsonValue('LIST') 17 | list; 18 | 19 | String toJson() => _$ActivityFilterTypeEnumMap[this]!; 20 | 21 | factory ActivityFilterType.fromJson(String json) => 22 | _$ActivityFilterTypeEnumMap 23 | .map((key, value) => MapEntry(value, key))[json]!; 24 | } 25 | -------------------------------------------------------------------------------- /lib/core/common/definitions/activity_filter_type.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'activity_filter_type.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$ActivityFilterTypeEnumMap = { 10 | ActivityFilterType.all: 'ALL', 11 | ActivityFilterType.text: 'TEXT', 12 | ActivityFilterType.list: 'LIST', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/definitions/activity_scope_category.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'activity_scope_category.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum ActivityScopeCategory { 7 | /// show activities of all users.. 8 | @JsonValue('GLOBAL') 9 | global, 10 | 11 | /// show activities of following users. 12 | @JsonValue('FOLLOWING') 13 | following; 14 | 15 | String toJson() => _$ActivityScopeCategoryEnumMap[this]!; 16 | 17 | factory ActivityScopeCategory.fromJson(String json) => 18 | _$ActivityScopeCategoryEnumMap 19 | .map((key, value) => MapEntry(value, key))[json]!; 20 | } 21 | 22 | -------------------------------------------------------------------------------- /lib/core/common/definitions/activity_scope_category.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'activity_scope_category.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$ActivityScopeCategoryEnumMap = { 10 | ActivityScopeCategory.global: 'GLOBAL', 11 | ActivityScopeCategory.following: 'FOLLOWING', 12 | }; 13 | -------------------------------------------------------------------------------- /lib/core/common/definitions/activity_type.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'activity_type.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$ActivityTypeEnumMap = { 10 | ActivityType.text: 'TEXT', 11 | ActivityType.animeList: 'ANIME_LIST', 12 | ActivityType.mangaList: 'MANGA_LIST', 13 | ActivityType.message: 'MESSAGE', 14 | ActivityType.mediaList: 'MEDIA_LIST', 15 | }; 16 | -------------------------------------------------------------------------------- /lib/core/common/definitions/anime_season.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'anime_season.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$AnimeSeasonEnumMap = { 10 | AnimeSeason.winter: 'WINTER', 11 | AnimeSeason.spring: 'SPRING', 12 | AnimeSeason.summer: 'SUMMER', 13 | AnimeSeason.fall: 'FALL', 14 | }; 15 | -------------------------------------------------------------------------------- /lib/core/common/definitions/anime_source.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'anime_source.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum AnimeSource { 7 | @JsonValue('ORIGINAL') 8 | original, 9 | @JsonValue('MANGA') 10 | manga, 11 | @JsonValue('LIGHT_NOVEL') 12 | lightNovel, 13 | @JsonValue('VISUAL_NOVEL') 14 | visualNovel, 15 | @JsonValue('VIDEO_GAME') 16 | videoGame, 17 | @JsonValue('OTHER') 18 | other; 19 | 20 | String toJson() => _$AnimeSourceEnumMap[this]!; 21 | 22 | static AnimeSource? fromJson(String? json) => 23 | _$AnimeSourceEnumMap.map((key, value) => MapEntry(value, key))[json]; 24 | } 25 | -------------------------------------------------------------------------------- /lib/core/common/definitions/anime_source.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'anime_source.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$AnimeSourceEnumMap = { 10 | AnimeSource.original: 'ORIGINAL', 11 | AnimeSource.manga: 'MANGA', 12 | AnimeSource.lightNovel: 'LIGHT_NOVEL', 13 | AnimeSource.visualNovel: 'VISUAL_NOVEL', 14 | AnimeSource.videoGame: 'VIDEO_GAME', 15 | AnimeSource.other: 'OTHER', 16 | }; 17 | -------------------------------------------------------------------------------- /lib/core/common/definitions/character_role.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'character_role.g.dart'; 4 | 5 | /// Bangumi character role. 6 | @JsonEnum(alwaysCreate: true) 7 | enum CharacterRole { 8 | @JsonValue('MAIN') 9 | main('MAIN'), 10 | @JsonValue('SUPPORTING') 11 | supporting('SUPPORTING'), 12 | @JsonValue('BACKGROUND') 13 | background('BACKGROUND'); 14 | 15 | final String sqlTypeString; 16 | 17 | const CharacterRole(this.sqlTypeString); 18 | 19 | String toJson() => _$CharacterRoleEnumMap[this]!; 20 | 21 | static CharacterRole? fromJson(String? json) => 22 | _$CharacterRoleEnumMap.map((key, value) => MapEntry(value, key))[json]; 23 | } 24 | -------------------------------------------------------------------------------- /lib/core/common/definitions/character_role.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'character_role.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$CharacterRoleEnumMap = { 10 | CharacterRole.main: 'MAIN', 11 | CharacterRole.supporting: 'SUPPORTING', 12 | CharacterRole.background: 'BACKGROUND', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/definitions/extension/activity_type_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/activity_filter_type.dart'; 2 | import 'package:aniflow/core/common/definitions/activity_scope_category.dart'; 3 | 4 | extension ActivityTypeEx on (ActivityFilterType, ActivityScopeCategory) { 5 | String get combineJsonKey => '${this.$1.toJson()}_${this.$2.toJson()}'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/core/common/definitions/favorite_category.dart: -------------------------------------------------------------------------------- 1 | 2 | enum FavoriteType { 3 | anime('favorite_anime'), 4 | manga('favorite_manga'), 5 | character('favorite_character'), 6 | staff('favorite_staff'), 7 | studio('favorite_studio'); 8 | 9 | const FavoriteType(this.contentValues); 10 | 11 | final String contentValues; 12 | } 13 | 14 | 15 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_external_link_type.dart: -------------------------------------------------------------------------------- 1 | import 'package:json_annotation/json_annotation.dart'; 2 | 3 | part 'media_external_link_type.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum MediaExternalLinkType { 7 | @JsonValue('INFO') 8 | info, 9 | @JsonValue('STREAMING') 10 | streaming, 11 | @JsonValue('SOCIAL') 12 | social; 13 | 14 | String toJson() => _$MediaExternalLinkTypeEnumMap[this]!; 15 | 16 | static MediaExternalLinkType? fromJson(String? json) => 17 | _$MediaExternalLinkTypeEnumMap 18 | .map((key, value) => MapEntry(value, key))[json]; 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_external_link_type.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_external_link_type.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaExternalLinkTypeEnumMap = { 10 | MediaExternalLinkType.info: 'INFO', 11 | MediaExternalLinkType.streaming: 'STREAMING', 12 | MediaExternalLinkType.social: 'SOCIAL', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_format.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_format.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaFormatEnumMap = { 10 | MediaFormat.tv: 'TV', 11 | MediaFormat.tvShort: 'TV_SHORT', 12 | MediaFormat.movie: 'MOVIE', 13 | MediaFormat.special: 'SPECIAL', 14 | MediaFormat.ova: 'OVA', 15 | MediaFormat.ona: 'ONA', 16 | MediaFormat.music: 'MUSIC', 17 | MediaFormat.manga: 'MANGA', 18 | MediaFormat.novel: 'NOVEL', 19 | MediaFormat.oneShot: 'ONE_SHOT', 20 | }; 21 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_list_status.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_list_status.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaListStatusEnumMap = { 10 | MediaListStatus.current: 'CURRENT', 11 | MediaListStatus.completed: 'COMPLETED', 12 | MediaListStatus.dropped: 'DROPPED', 13 | MediaListStatus.paused: 'PAUSED', 14 | MediaListStatus.planning: 'PLANNING', 15 | }; 16 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_sort.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'media_sort.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum MediaSort { 7 | @JsonValue('TRENDING_DESC') 8 | trending, 9 | @JsonValue('START_DATE_DESC') 10 | newest, 11 | @JsonValue('START_DATE') 12 | oldest, 13 | @JsonValue('SCORE_DESC') 14 | averageScore, 15 | @JsonValue('FAVOURITES_DESC') 16 | favorite, 17 | @JsonValue('POPULARITY_DESC') 18 | popularity; 19 | 20 | const MediaSort(); 21 | 22 | String toJson() => _$MediaSortEnumMap[this]!; 23 | 24 | factory MediaSort.fromJson(String json) => 25 | _$MediaSortEnumMap.map((key, value) => MapEntry(value, key))[json]!; 26 | } 27 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_sort.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_sort.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaSortEnumMap = { 10 | MediaSort.trending: 'TRENDING_DESC', 11 | MediaSort.newest: 'START_DATE_DESC', 12 | MediaSort.oldest: 'START_DATE', 13 | MediaSort.averageScore: 'SCORE_DESC', 14 | MediaSort.favorite: 'FAVOURITES_DESC', 15 | MediaSort.popularity: 'POPULARITY_DESC', 16 | }; 17 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_status.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_status.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaStatusEnumMap = { 10 | MediaStatus.finished: 'FINISHED', 11 | MediaStatus.releasing: 'RELEASING', 12 | MediaStatus.notYetReleased: 'NOT_YET_RELEASED', 13 | MediaStatus.cancelled: 'CANCELLED', 14 | MediaStatus.hiatus: 'HIATUS', 15 | }; 16 | -------------------------------------------------------------------------------- /lib/core/common/definitions/media_type.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_type.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$MediaTypeEnumMap = { 10 | MediaType.anime: 'ANIME', 11 | MediaType.manga: 'MANGA', 12 | }; 13 | -------------------------------------------------------------------------------- /lib/core/common/definitions/staff_language.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'staff_language.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$StaffLanguageEnumMap = { 10 | StaffLanguage.japanese: 'JAPANESE', 11 | StaffLanguage.english: 'ENGLISH', 12 | StaffLanguage.korean: 'KOREAN', 13 | StaffLanguage.italian: 'ITALIAN', 14 | StaffLanguage.spanish: 'SPANISH', 15 | StaffLanguage.portuguese: 'PORTUGUESE', 16 | StaffLanguage.french: 'FRENCH', 17 | StaffLanguage.german: 'GERMAN', 18 | StaffLanguage.hebrew: 'HEBREW', 19 | StaffLanguage.hungarian: 'HUNGARIAN', 20 | }; 21 | -------------------------------------------------------------------------------- /lib/core/common/definitions/track_list_filter.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'track_list_filter.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum TrackListFilter { 7 | @JsonValue('ALL') 8 | all, 9 | @JsonValue('NEW_AIRED') 10 | newAired, 11 | @JsonValue('HAS_NEXT') 12 | hasNext; 13 | 14 | String toJson() => _$TrackListFilterEnumMap[this]!; 15 | 16 | static TrackListFilter? fromJson(String? json) => 17 | _$TrackListFilterEnumMap.map((key, value) => MapEntry(value, key))[json]; 18 | } -------------------------------------------------------------------------------- /lib/core/common/definitions/track_list_filter.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'track_list_filter.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$TrackListFilterEnumMap = { 10 | TrackListFilter.all: 'ALL', 11 | TrackListFilter.newAired: 'NEW_AIRED', 12 | TrackListFilter.hasNext: 'HAS_NEXT', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/definitions/user_statics_sort.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'user_statics_sort.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum UserStaticsSort { 7 | @JsonValue('COUNT_DESC') 8 | count, 9 | @JsonValue('MEAN_SCORE_DESC') 10 | meanScore, 11 | @JsonValue('PROGRESS_DESC') 12 | timeWatched; 13 | 14 | String toJson() => _$UserStaticsSortEnumMap[this]!; 15 | 16 | static UserStaticsSort? fromJson(String? json) => 17 | _$UserStaticsSortEnumMap.map((key, value) => MapEntry(value, key))[json]; 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/common/definitions/user_statics_sort.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user_statics_sort.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$UserStaticsSortEnumMap = { 10 | UserStaticsSort.count: 'COUNT_DESC', 11 | UserStaticsSort.meanScore: 'MEAN_SCORE_DESC', 12 | UserStaticsSort.timeWatched: 'PROGRESS_DESC', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/definitions/user_stats_type.dart: -------------------------------------------------------------------------------- 1 | enum UserStatisticType { 2 | aimeGenres('Anime genres'), 3 | animeTags('Anime tags'), 4 | animeVoiceActors('Anime voice actors'), 5 | animeStudios('Anime studios'), 6 | animeStaff('Anime staff'), 7 | mangaGenres('Manga genres'), 8 | mangaTags('Manga tags'), 9 | mangaStaff('Manga staff'); 10 | 11 | final String label; 12 | 13 | bool get isManga => 14 | this == UserStatisticType.mangaGenres || 15 | this == UserStatisticType.mangaTags || 16 | this == UserStatisticType.mangaStaff; 17 | 18 | const UserStatisticType(this.label); 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/common/setting/about.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | 3 | class About implements Setting {} -------------------------------------------------------------------------------- /lib/core/common/setting/check_app_update.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | 3 | class CheckAppUpdate implements Setting {} -------------------------------------------------------------------------------- /lib/core/common/setting/display_adult_content.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | 3 | enum DisplayAdultContent implements BooleanSetting { 4 | on, 5 | off; 6 | 7 | @override 8 | bool get isOn => this == on; 9 | 10 | @override 11 | DisplayAdultContent toggle() => this == on ? off : on; 12 | 13 | 14 | static DisplayAdultContent getSetting(bool isOn) => isOn ? on : off; 15 | } -------------------------------------------------------------------------------- /lib/core/common/setting/github_link_setting.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | 3 | class GithubLinkSetting implements Setting {} 4 | -------------------------------------------------------------------------------- /lib/core/common/setting/in_app_player.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | 3 | enum InAppPlayer implements BooleanSetting { 4 | on, 5 | off; 6 | 7 | @override 8 | bool get isOn => this == on; 9 | 10 | @override 11 | InAppPlayer toggle() => this == on ? off : on; 12 | 13 | static InAppPlayer getSetting(bool isOn) => isOn ? on : off; 14 | } -------------------------------------------------------------------------------- /lib/core/common/setting/score_format.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'score_format.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$ScoreFormatEnumMap = { 10 | ScoreFormat.point100: 'POINT_100', 11 | ScoreFormat.point10Decimal: 'POINT_10_DECIMAL', 12 | ScoreFormat.point10: 'POINT_10', 13 | ScoreFormat.point5: 'POINT_5', 14 | ScoreFormat.point3: 'POINT_3', 15 | }; 16 | -------------------------------------------------------------------------------- /lib/core/common/setting/setting.dart: -------------------------------------------------------------------------------- 1 | interface class Setting {} 2 | 3 | abstract class BooleanSetting extends Setting { 4 | bool get isOn; 5 | 6 | BooleanSetting toggle(); 7 | } -------------------------------------------------------------------------------- /lib/core/common/setting/theme_setting.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/setting.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'theme_setting.g.dart'; 5 | 6 | @JsonEnum(alwaysCreate: true) 7 | enum ThemeSetting implements Setting { 8 | @JsonValue('DARK') 9 | dark, 10 | @JsonValue('LIGHT') 11 | light, 12 | @JsonValue('SYSTEM') 13 | system; 14 | 15 | String toJson() => _$ThemeSettingEnumMap[this]!; 16 | 17 | static ThemeSetting? fromJson(String? json) => 18 | _$ThemeSettingEnumMap.map((key, value) => MapEntry(value, key))[json]; 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/common/setting/theme_setting.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'theme_setting.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$ThemeSettingEnumMap = { 10 | ThemeSetting.dark: 'DARK', 11 | ThemeSetting.light: 'LIGHT', 12 | ThemeSetting.system: 'SYSTEM', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/setting/tutorial_setting.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/common/setting/setting.dart'; 3 | 4 | class Gesture implements Setting {} 5 | -------------------------------------------------------------------------------- /lib/core/common/setting/user_staff_name_language.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user_staff_name_language.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$UserStaffNameLanguageEnumMap = { 10 | UserStaffNameLanguage.romajiWestern: 'ROMAJI_WESTERN', 11 | UserStaffNameLanguage.romaji: 'ROMAJI', 12 | UserStaffNameLanguage.native: 'NATIVE', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/setting/user_title_language.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user_title_language.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$UserTitleLanguageEnumMap = { 10 | UserTitleLanguage.romaji: 'ROMAJI', 11 | UserTitleLanguage.english: 'ENGLISH', 12 | UserTitleLanguage.native: 'NATIVE', 13 | }; 14 | -------------------------------------------------------------------------------- /lib/core/common/util/anime_season_util.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/anime_season.dart'; 2 | 3 | mixin AnimeSeasonUtil { 4 | /// get anime season params by DateTime. 5 | static AnimeSeasonParam getAnimeSeasonByDataTime(DateTime time) { 6 | final year = time.year; 7 | final month = time.month; 8 | 9 | AnimeSeason season; 10 | switch (month) { 11 | case >= 1 && < 4: 12 | season = AnimeSeason.winter; 13 | case >= 4 && < 7: 14 | season = AnimeSeason.spring; 15 | case >= 7 && < 10: 16 | season = AnimeSeason.summer; 17 | case >= 10: 18 | season = AnimeSeason.fall; 19 | default: 20 | throw 'impossible'; 21 | } 22 | return AnimeSeasonParam(seasonYear: year, season: season); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/core/common/util/change_notifier_util.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/cupertino.dart'; 3 | 4 | extension IntValueNotifierEx on ValueNotifier { 5 | void notifyChanged() { 6 | value = value + 1; 7 | } 8 | } -------------------------------------------------------------------------------- /lib/core/common/util/collection_util.dart: -------------------------------------------------------------------------------- 1 | 2 | extension MapEx on Map { 3 | Map toMutableMap() { 4 | return {...this}; 5 | } 6 | } -------------------------------------------------------------------------------- /lib/core/common/util/color_util.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | mixin ColorUtil { 4 | /// parse color with format #001100. 5 | static Color? parseColor(String source) { 6 | final colorRegex = RegExp('#\\w{6}'); 7 | if (!colorRegex.hasMatch(source)) { 8 | return null; 9 | } 10 | 11 | final r = int.parse(source.substring(1, 3), radix: 16); 12 | final g = int.parse(source.substring(3, 5), radix: 16); 13 | final b = int.parse(source.substring(5, 7), radix: 16); 14 | return Color.fromARGB(255, r, g, b); 15 | } 16 | } -------------------------------------------------------------------------------- /lib/core/common/util/connectivity_util.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:connectivity_plus/connectivity_plus.dart'; 3 | 4 | mixin ConnectivityUtil { 5 | static Future isNetworkConnected() async { 6 | final connectivity = await Connectivity().checkConnectivity(); 7 | return !connectivity.contains(ConnectivityResult.none); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/common/util/logger.dart: -------------------------------------------------------------------------------- 1 | import 'package:logger/logger.dart'; 2 | 3 | final logger = Logger( 4 | filter: null, 5 | printer: PrettyPrinter(), 6 | output: null, 7 | ); -------------------------------------------------------------------------------- /lib/core/common/util/scheme_util.dart: -------------------------------------------------------------------------------- 1 | 2 | const String aniflowDeepLinkScheme = 'aniflow'; 3 | 4 | mixin SchemeUtil { 5 | static String createDeepLinkFromSiteUrl(String siteUrl) { 6 | return siteUrl.replaceFirst('http', aniflowDeepLinkScheme); 7 | } 8 | } -------------------------------------------------------------------------------- /lib/core/common/util/screen_size_util.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/cupertino.dart'; 3 | 4 | mixin ScreenSizeUtil { 5 | static bool isLargeScreen(BuildContext context) { 6 | return MediaQuery.of(context).size.width > 600; 7 | } 8 | } -------------------------------------------------------------------------------- /lib/core/common/util/stream_util.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | 5 | mixin StreamUtil { 6 | static Stream createStream( 7 | ChangeNotifier changeSource, Future Function() getEventData) { 8 | late StreamController controller; 9 | 10 | void listener() async { 11 | final data = await getEventData(); 12 | if (!controller.isClosed) { 13 | controller.add(data); 14 | } 15 | } 16 | 17 | controller = StreamController(onListen: () { 18 | listener(); 19 | changeSource.addListener(listener); 20 | }, onCancel: () { 21 | changeSource.removeListener(listener); 22 | controller.close(); 23 | }); 24 | return controller.stream; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/core/data/load_result.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/util/global_static_constants.dart'; 2 | 3 | sealed class LoadType { 4 | const LoadType(); 5 | } 6 | 7 | class Refresh extends LoadType { 8 | final int perPage; 9 | const Refresh([this.perPage = AfConfig.defaultPerPageCount]); 10 | } 11 | 12 | class Append extends LoadType { 13 | const Append({required this.page, required this.perPage}); 14 | 15 | final int page; 16 | final int perPage; 17 | } 18 | 19 | sealed class LoadResult {} 20 | 21 | class LoadError extends LoadResult { 22 | LoadError(this.exception); 23 | 24 | final Exception exception; 25 | } 26 | 27 | class LoadSuccess extends LoadResult { 28 | LoadSuccess({required this.data}); 29 | 30 | final T data; 31 | } 32 | -------------------------------------------------------------------------------- /lib/core/data/mappers/activity_reply_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/mappers/user_mapper.dart'; 2 | import 'package:aniflow/core/data/model/activity_reply_model.dart'; 3 | import 'package:aniflow/core/network/model/activity_reply_dto.dart'; 4 | 5 | extension ActivityMapper3 on ActivityReplyDto { 6 | ActivityReplyModel toModel() => ActivityReplyModel( 7 | id: id?.toString() ?? "", 8 | likeCount: likeCount ?? 0, 9 | text: text ?? "", 10 | user: user?.toModel(), 11 | isLiked: isLiked ?? false, 12 | createdAt: createdAt, 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/data/mappers/airing_schedule_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/airing_schedule_model.dart'; 2 | import 'package:aniflow/core/database/aniflow_database.dart'; 3 | 4 | extension AiringScheduleMapper on AiringScheduleEntity { 5 | AiringScheduleModel toModel() { 6 | return AiringScheduleModel( 7 | id: id, 8 | airingAt: airingAt, 9 | timeUntilAiring: timeUntilAiring, 10 | episode: episode 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/data/mappers/media_external_link_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/media_external_link_type.dart'; 2 | import 'package:aniflow/core/data/model/media_external_link_model.dart'; 3 | import 'package:aniflow/core/database/aniflow_database.dart'; 4 | 5 | extension MediaExternalLinkMapper on MediaExternalLinkEntity { 6 | MediaExternalLinkModel toModel() { 7 | return MediaExternalLinkModel( 8 | url: url ?? '', 9 | site: site ?? '', 10 | type: MediaExternalLinkType.fromJson(type)!, 11 | siteId: siteId ?? -1, 12 | icon: icon ?? '', 13 | color: color ?? '', 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/data/mappers/media_relation_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/media_relation.dart'; 2 | import 'package:aniflow/core/data/mappers/media_mapper.dart'; 3 | import 'package:aniflow/core/data/model/media_relation_model.dart'; 4 | import 'package:aniflow/core/database/relations/media_and_relation_type_entity.dart'; 5 | 6 | extension MediaAndRelationTypeMapper on MediaAndRelationTypeEntity { 7 | MediaRelationModel toModel() { 8 | return MediaRelationModel( 9 | mediaRelation != null 10 | ? MediaRelation.fromJson(mediaRelation!) 11 | : MediaRelation.other, 12 | media.toModel(), 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/data/mappers/studio_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/studio_model.dart'; 2 | import 'package:aniflow/core/database/aniflow_database.dart'; 3 | import 'package:aniflow/core/database/mappers/studio_mapper.dart'; 4 | import 'package:aniflow/core/network/model/studio_dto.dart'; 5 | 6 | extension StudioMapper on StudioEntity { 7 | StudioModel toModel() { 8 | return StudioModel( 9 | id: id, 10 | name: name, 11 | siteUrl: siteUrl, 12 | isFavourite: isFavourite, 13 | isAnimationStudio: isAnimationStudio, 14 | ); 15 | } 16 | } 17 | 18 | extension StudioMapper2 on StudioDto { 19 | StudioModel toModel() { 20 | return toEntity().toModel(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/core/data/model/activity_reply_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/user_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'activity_reply_model.freezed.dart'; 5 | 6 | @freezed 7 | class ActivityReplyModel with _$ActivityReplyModel { 8 | const factory ActivityReplyModel({ 9 | @Default("") String id, 10 | @Default(0) int likeCount, 11 | @Default("") String text, 12 | UserModel? user, 13 | @Default(false) bool isLiked, 14 | int? createdAt, 15 | }) = _ActivityReplyModel; 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/data/model/airing_schedule_and_anime_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/airing_schedule_model.dart'; 2 | import 'package:aniflow/core/data/model/media_model.dart'; 3 | 4 | class AiringScheduleAndAnimeModel { 5 | AiringScheduleAndAnimeModel( 6 | {required this.airingSchedule, required this.mediaModel}); 7 | 8 | final AiringScheduleModel airingSchedule; 9 | final MediaModel mediaModel; 10 | } 11 | -------------------------------------------------------------------------------- /lib/core/data/model/airing_schedule_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'airing_schedule_model.freezed.dart'; 4 | 5 | @freezed 6 | class AiringScheduleModel with _$AiringScheduleModel { 7 | factory AiringScheduleModel({ 8 | @Default('') String id, 9 | int? airingAt, 10 | int? timeUntilAiring, 11 | int? episode, 12 | }) = _AiringScheduleModel; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/data/model/character_and_voice_actor_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/character_role.dart'; 2 | import 'package:aniflow/core/common/definitions/staff_language.dart'; 3 | import 'package:aniflow/core/data/model/character_model.dart'; 4 | import 'package:aniflow/core/data/model/staff_model.dart'; 5 | 6 | class CharacterAndVoiceActorModel { 7 | CharacterAndVoiceActorModel({ 8 | required this.characterModel, 9 | this.voiceActorModel, 10 | this.role, 11 | this.staffLanguage, 12 | }); 13 | 14 | final CharacterModel characterModel; 15 | final StaffModel? voiceActorModel; 16 | final CharacterRole? role; 17 | final StaffLanguage? staffLanguage; 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/data/model/episode_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'episode_model.freezed.dart'; 4 | part 'episode_model.g.dart'; 5 | 6 | @freezed 7 | class EpisodeModel with _$EpisodeModel { 8 | const factory EpisodeModel({ 9 | required String url, 10 | required String title, 11 | required int episodeNum, 12 | }) = _EpisodeModel; 13 | 14 | factory EpisodeModel.fromJson(Map json) => 15 | _$EpisodeModelFromJson(json); 16 | } -------------------------------------------------------------------------------- /lib/core/data/model/extension/airing_schedule_and_anime_model_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/airing_schedule_and_anime_model.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | extension AiringScheduleAndAnimeModelEx on AiringScheduleAndAnimeModel { 5 | bool get isAired => airingSchedule.timeUntilAiring?.isNegative ?? false; 6 | 7 | TimeOfDay get airAtTimeOfDay => TimeOfDay.fromDateTime( 8 | DateTime.fromMillisecondsSinceEpoch(airingSchedule.airingAt! * 1000)); 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/data/model/github_user_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'github_user_model.freezed.dart'; 4 | 5 | part 'github_user_model.g.dart'; 6 | 7 | @freezed 8 | class GithubUserModel with _$GithubUserModel { 9 | const factory GithubUserModel({ 10 | @JsonKey(name: 'id') int? id, 11 | @JsonKey(name: 'login') String? login, 12 | @JsonKey(name: 'avatar_url') String? avatarUrl, 13 | @JsonKey(name: 'bio') String? bio, 14 | }) = _GithubUserModel; 15 | 16 | factory GithubUserModel.fromJson(Map json) => 17 | _$GithubUserModelFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/data/model/home_sector_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/home_sector_category.dart'; 2 | import 'package:aniflow/core/firebase/remote_config/model/home_struct_remote_model.dart'; 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class HomeSectorModel extends Equatable { 6 | final List animeSectors; 7 | final List mangaSectors; 8 | 9 | const HomeSectorModel(this.animeSectors, this.mangaSectors); 10 | 11 | @override 12 | List get props => [...animeSectors, ...mangaSectors]; 13 | } 14 | 15 | extension HomeStructRemoteModelEx on HomeStructRemoteModel { 16 | HomeSectorModel toModel() => HomeSectorModel( 17 | anime, 18 | manga, 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/data/model/media_cover_image_model.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'media_cover_image_model.freezed.dart'; 6 | 7 | @freezed 8 | class MediaCoverImageModel with _$MediaCoverImageModel { 9 | const factory MediaCoverImageModel({ 10 | String? extraLarge, 11 | String? large, 12 | String? medium, 13 | Color? color, 14 | }) = _MediaCoverImageModel; 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/data/model/media_relation_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/media_relation.dart'; 2 | import 'package:aniflow/core/data/model/media_model.dart'; 3 | 4 | class MediaRelationModel { 5 | MediaRelationModel(this.type, this.media); 6 | 7 | final MediaRelation type; 8 | final MediaModel media; 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/data/model/media_tag_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/media_tag_dto.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'media_tag_model.freezed.dart'; 5 | 6 | @freezed 7 | class MediaTagModel with _$MediaTagModel { 8 | const factory MediaTagModel({ 9 | @Default('') String id, 10 | String? name, 11 | String? description, 12 | String? category, 13 | String? rank, 14 | }) = _MediaTagModel; 15 | 16 | static MediaTagModel fromDto(MediaTagDto dto) { 17 | return MediaTagModel( 18 | id: dto.toString(), 19 | name: dto.name, 20 | description: dto.description, 21 | category: dto.category, 22 | rank: dto.rank, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/core/data/model/media_with_list_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/anime_list_item_model.dart'; 2 | import 'package:aniflow/core/data/model/media_model.dart'; 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class MediaWithListModel extends Equatable { 6 | const MediaWithListModel({required this.mediaModel, this.mediaListModel}); 7 | 8 | final MediaModel mediaModel; 9 | final MediaListItemModel? mediaListModel; 10 | 11 | @override 12 | List get props => [mediaModel, mediaListModel]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/data/model/release_package_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/util/app_version_util.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'release_package_model.freezed.dart'; 5 | 6 | @freezed 7 | class ReleasePackageModel with _$ReleasePackageModel { 8 | const factory ReleasePackageModel({ 9 | required AppVersion version, 10 | required String downloadUrl, 11 | }) = _ReleasePackageModel; 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/data/model/search_result_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/subject_with_episodes_model.dart'; 2 | import 'package:aniflow/core/network/model/search_title.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'search_result_model.freezed.dart'; 6 | part 'search_result_model.g.dart'; 7 | 8 | @freezed 9 | class SearchResultModel with _$SearchResultModel { 10 | const factory SearchResultModel({ 11 | required List subjects, 12 | required SearchTitle title, 13 | }) = _SearchResultModel; 14 | 15 | factory SearchResultModel.fromJson(Map json) => 16 | _$SearchResultModelFromJson(json); 17 | } -------------------------------------------------------------------------------- /lib/core/data/model/shortcut/activity_status_record.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'activity_status_record.freezed.dart'; 4 | 5 | @freezed 6 | class ActivityStatusRecord with _$ActivityStatusRecord { 7 | factory ActivityStatusRecord({ 8 | @Default(0) int likeCount, 9 | @Default(0) int replyCount, 10 | @Default(false) bool isLiked, 11 | }) = _ActivityStatusRecord; 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/data/model/sorted_group_media_list_model.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/data/model/media_with_list_model.dart'; 3 | import 'package:aniflow/core/database/aniflow_database.dart'; 4 | 5 | const int newUpdateDayRange = 3; 6 | 7 | class SortedGroupMediaListModel { 8 | const SortedGroupMediaListModel(this.newUpdateList, this.otherList); 9 | 10 | /// media lists which are regarded as newly updated 11 | /// by [newUpdateDayRange], before [MediaEntity.nextAiringEpisodeUpdateTime] 12 | final List newUpdateList; 13 | final List otherList; 14 | } 15 | 16 | extension SortedGroupMediaListModelEx on SortedGroupMediaListModel { 17 | bool get isEmpty => newUpdateList.isEmpty && otherList.isEmpty; 18 | } -------------------------------------------------------------------------------- /lib/core/data/model/staff_and_role_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/staff_model.dart'; 2 | 3 | class StaffAndRoleModel { 4 | StaffAndRoleModel({required this.role, required this.staff}); 5 | 6 | final String role; 7 | final StaffModel staff; 8 | } 9 | -------------------------------------------------------------------------------- /lib/core/data/model/staff_model.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/data/model/staff_character_name_model.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'staff_model.freezed.dart'; 6 | 7 | @freezed 8 | class StaffModel with _$StaffModel { 9 | factory StaffModel({ 10 | @Default('') String id, 11 | @Default('') String largeImage, 12 | @Default('') String mediumImage, 13 | StaffCharacterName? name, 14 | String? description, 15 | String? gender, 16 | String? siteUrl, 17 | DateTime? dateOfBirth, 18 | DateTime? dateOfDeath, 19 | int? age, 20 | @Default(false) bool isFavourite, 21 | @Default([]) List yearsActive, 22 | String? homeTown, 23 | String? bloodType, 24 | }) = _StaffModel; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /lib/core/data/model/studio_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'studio_model.freezed.dart'; 4 | 5 | @freezed 6 | class StudioModel with _$StudioModel { 7 | factory StudioModel({ 8 | @Default('') String id, 9 | String? name, 10 | String? siteUrl, 11 | @Default(false) bool isFavourite, 12 | @Default(false) bool isAnimationStudio, 13 | }) = _StudioModel; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/data/model/subject_with_episodes_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/episode_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'subject_with_episodes_model.freezed.dart'; 5 | 6 | part 'subject_with_episodes_model.g.dart'; 7 | 8 | @freezed 9 | class SubjectWithEpisodesModel with _$SubjectWithEpisodesModel { 10 | const factory SubjectWithEpisodesModel({ 11 | required String title, 12 | required String originalPageUrl, 13 | required int seasonNum, 14 | required List episodes, 15 | }) = _SubjectWithEpisodesModel; 16 | 17 | factory SubjectWithEpisodesModel.fromJson(Map json) => 18 | _$SubjectWithEpisodesModelFromJson(json); 19 | 20 | } -------------------------------------------------------------------------------- /lib/core/data/model/user_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'user_model.freezed.dart'; 5 | 6 | @freezed 7 | class UserModel with _$UserModel { 8 | factory UserModel({ 9 | @Default('') String id, 10 | @Default('') String name, 11 | @Default('') String avatar, 12 | String? bannerImage, 13 | String? siteUrl, 14 | Color? profileColor, 15 | @Default(0) int unreadNotificationCount, 16 | }) = _UserModel; 17 | } 18 | 19 | mixin ProfileColorDict { 20 | static final profileColorDict = { 21 | 'purple' : Colors.purple, 22 | }; 23 | 24 | static Color? fromDict(String? color) => profileColorDict[color]; 25 | } -------------------------------------------------------------------------------- /lib/core/data/user_info_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/app/di/env.dart'; 2 | import 'package:aniflow/core/data/mappers/user_mapper.dart'; 3 | import 'package:aniflow/core/data/model/user_model.dart'; 4 | import 'package:aniflow/core/database/dao/user_dao.dart'; 5 | import 'package:injectable/injectable.dart'; 6 | 7 | @LazySingleton(env: [AfEnvironment.mobile, AfEnvironment.desktop]) 8 | class UserInfoRepository { 9 | UserInfoRepository(this.userDao); 10 | 11 | final UserDao userDao; 12 | 13 | Future getUserDataById(String id) async { 14 | final userEntity = await userDao.getUser(id); 15 | return userEntity!.toModel(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/database/dao/activity_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'activity_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$ActivityDaoMixin on DatabaseAccessor { 7 | $ActivityTableTable get activityTable => attachedDatabase.activityTable; 8 | $UserTableTable get userTable => attachedDatabase.userTable; 9 | $MediaTableTable get mediaTable => attachedDatabase.mediaTable; 10 | $ActivityFilterTypePagingCrossRefTableTable 11 | get activityFilterTypePagingCrossRefTable => 12 | attachedDatabase.activityFilterTypePagingCrossRefTable; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/dao/airing_schedules_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'airing_schedules_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$AiringSchedulesDaoMixin on DatabaseAccessor { 7 | $AiringScheduleTableTable get airingScheduleTable => 8 | attachedDatabase.airingScheduleTable; 9 | $MediaTableTable get mediaTable => attachedDatabase.mediaTable; 10 | } 11 | -------------------------------------------------------------------------------- /lib/core/database/dao/episode_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'episode_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$EpisodeDaoMixin on DatabaseAccessor { 7 | $EpisodeTableTable get episodeTable => attachedDatabase.episodeTable; 8 | } 9 | -------------------------------------------------------------------------------- /lib/core/database/dao/favorite_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'favorite_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$FavoriteDaoMixin on DatabaseAccessor { 7 | $FavoriteInfoTableTable get favoriteInfoTable => 8 | attachedDatabase.favoriteInfoTable; 9 | $MediaTableTable get mediaTable => attachedDatabase.mediaTable; 10 | $CharacterTableTable get characterTable => attachedDatabase.characterTable; 11 | $StaffTableTable get staffTable => attachedDatabase.staffTable; 12 | $StudioTableTable get studioTable => attachedDatabase.studioTable; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/dao/github_release_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'github_release_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$GithubReleaseDaoMixin on DatabaseAccessor { 7 | $ReleasedPackageTableTable get releasedPackageTable => 8 | attachedDatabase.releasedPackageTable; 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/database/dao/media_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$MediaDaoMixin on DatabaseAccessor { 7 | $MediaTableTable get mediaTable => attachedDatabase.mediaTable; 8 | $MediaRelationCrossRefTableTable get mediaRelationCrossRefTable => 9 | attachedDatabase.mediaRelationCrossRefTable; 10 | $MediaExternalLinkTableTable get mediaExternalLinkTable => 11 | attachedDatabase.mediaExternalLinkTable; 12 | $CategoryMediaPagingCrossRefTableTable get categoryMediaPagingCrossRefTable => 13 | attachedDatabase.categoryMediaPagingCrossRefTable; 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/database/dao/media_list_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'media_list_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$MediaListDaoMixin on DatabaseAccessor { 7 | $MediaListTableTable get mediaListTable => attachedDatabase.mediaListTable; 8 | $MediaTableTable get mediaTable => attachedDatabase.mediaTable; 9 | $MediaAiringScheduleUpdatedTableTable get mediaAiringScheduleUpdatedTable => 10 | attachedDatabase.mediaAiringScheduleUpdatedTable; 11 | } 12 | -------------------------------------------------------------------------------- /lib/core/database/dao/search_result_cache_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'search_result_cache_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$SearchResultCacheDaoMixin on DatabaseAccessor { 7 | $SearchResultTableTable get searchResultTable => 8 | attachedDatabase.searchResultTable; 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/database/dao/staff_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'staff_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$StaffDaoMixin on DatabaseAccessor { 7 | $StaffTableTable get staffTable => attachedDatabase.staffTable; 8 | $MediaStaffPagingCrossRefTableTable get mediaStaffPagingCrossRefTable => 9 | attachedDatabase.mediaStaffPagingCrossRefTable; 10 | } 11 | -------------------------------------------------------------------------------- /lib/core/database/dao/studio_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'studio_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$StudioDaoMixin on DatabaseAccessor { 7 | $StudioTableTable get studioTable => attachedDatabase.studioTable; 8 | $StudioMediaCrossRefTableTable get studioMediaCrossRefTable => 9 | attachedDatabase.studioMediaCrossRefTable; 10 | } 11 | -------------------------------------------------------------------------------- /lib/core/database/dao/user_dao.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user_dao.dart'; 4 | 5 | // ignore_for_file: type=lint 6 | mixin _$UserDaoMixin on DatabaseAccessor { 7 | $UserTableTable get userTable => attachedDatabase.userTable; 8 | } 9 | -------------------------------------------------------------------------------- /lib/core/database/mappers/airing_schedule_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:aniflow/core/network/model/airing_schedule_dto.dart'; 3 | 4 | extension AiringScheduleMapper on AiringScheduleDto { 5 | AiringScheduleEntity toEntity() { 6 | return AiringScheduleEntity( 7 | id: id.toString(), 8 | mediaId: mediaId.toString(), 9 | airingAt: airingAt, 10 | timeUntilAiring: timeUntilAiring, 11 | episode: episode 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/database/mappers/github_data_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:aniflow/core/network/model/github_released_dto.dart'; 3 | 4 | extension GithubReleaseDtoEx on GithubReleaseDto { 5 | ReleasedPackageEntity toEntity() { 6 | final androidAssets = assets.firstWhere( 7 | (e) => 8 | e.contentType == 'application/vnd.android.package-archive' && 9 | e.name?.contains('v8a') == true, 10 | ); 11 | return ReleasedPackageEntity( 12 | tagName: tagName, 13 | apkDownloadUrl: androidAssets.browserDownloadUrl, 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/database/mappers/media_external_link_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:aniflow/core/network/model/media_external_links_dto.dart'; 3 | 4 | extension MediaExternalLinkMapper on MediaExternalLinkDto { 5 | MediaExternalLinkEntity toEntity(String mediaId) { 6 | return MediaExternalLinkEntity( 7 | id: id.toString(), 8 | mediaId: mediaId, 9 | url: url, 10 | site: site, 11 | type: type, 12 | siteId: siteId, 13 | icon: icon, 14 | color: color 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/database/mappers/studio_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:aniflow/core/network/model/studio_dto.dart'; 3 | 4 | extension StudioMapper on StudioDto { 5 | StudioEntity toEntity() { 6 | return StudioEntity( 7 | id: id.toString(), 8 | name: name ?? '', 9 | siteUrl: siteUrl, 10 | isFavourite: isFavourite, 11 | isAnimationStudio: isAnimationStudio, 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/database/mappers/user_mapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:aniflow/core/network/model/user_dto.dart'; 3 | 4 | extension UserMapper on UserDto { 5 | UserEntity toEntity() => UserEntity( 6 | id: id.toString(), 7 | name: name, 8 | avatarImage: avatar['large']!, 9 | bannerImage: bannerImage, 10 | profileColor: options?.profileColor, 11 | unreadNotificationCount: unreadNotificationCount, 12 | siteUrl: siteUrl 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/database/relations/activity_and_user_relation.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/database/aniflow_database.dart'; 3 | import 'package:equatable/equatable.dart'; 4 | 5 | class ActivityAndUserRelation extends Equatable { 6 | const ActivityAndUserRelation({ 7 | required this.user, 8 | required this.activity, 9 | this.media, 10 | }); 11 | 12 | final UserEntity? user; 13 | final ActivityEntity activity; 14 | final MediaEntity? media; 15 | 16 | @override 17 | List get props => [user, activity, media]; 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/database/relations/airing_schedule_and_media_relation.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class AiringScheduleAndMediaRelation extends Equatable { 5 | final AiringScheduleEntity airingSchedule; 6 | final MediaEntity mediaEntity; 7 | 8 | const AiringScheduleAndMediaRelation( 9 | {required this.airingSchedule, required this.mediaEntity}); 10 | 11 | @override 12 | List get props => [airingSchedule, mediaEntity]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/relations/character_and_related_media_relation.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class CharacterAndRelatedMediaRelation extends Equatable { 5 | const CharacterAndRelatedMediaRelation( 6 | {required this.character, required this.medias}); 7 | 8 | final CharacterEntity character; 9 | final List medias; 10 | 11 | @override 12 | List get props => [character, ...medias]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/relations/media_list_and_media_relation.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class MediaListAndMediaRelation extends Equatable { 5 | final MediaListEntity? mediaListEntity; 6 | final MediaEntity mediaEntity; 7 | final MediaAiringScheduleUpdatedEntity? mediaAiringScheduleUpdatedEntity; 8 | 9 | const MediaListAndMediaRelation({ 10 | required this.mediaListEntity, 11 | required this.mediaEntity, 12 | this.mediaAiringScheduleUpdatedEntity, 13 | }); 14 | 15 | @override 16 | List get props => [mediaEntity, mediaListEntity]; 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/database/relations/sorted_group_media_list_entity.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/relations/media_list_and_media_relation.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class SortedGroupMediaListEntity extends Equatable { 5 | const SortedGroupMediaListEntity(this.newUpdateList, this.otherList); 6 | 7 | final List newUpdateList; 8 | final List otherList; 9 | 10 | @override 11 | List get props => [...newUpdateList, ...otherList]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/database/relations/staff_and_role_relation_entity.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/database/aniflow_database.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class StaffAndRoleRelationEntity extends Equatable { 5 | const StaffAndRoleRelationEntity({required this.staff, required this.role}); 6 | 7 | final StaffEntity staff; 8 | final String role; 9 | 10 | @override 11 | List get props => [staff, role]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/database/tables/activity_filter_type_paging_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('ActivityFilterTypePagingCrossRefEntity') 4 | class ActivityFilterTypePagingCrossRefTable extends Table { 5 | @override 6 | List> get uniqueKeys => [ 7 | {activityId, category} 8 | ]; 9 | 10 | IntColumn get id => 11 | integer().autoIncrement().named('activity_filter_type_cross_id')(); 12 | 13 | TextColumn get activityId => 14 | text().named('activity_filter_type_cross_activity_id')(); 15 | 16 | TextColumn get category => 17 | text().named('activity_filter_type_cross_filter_category')(); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/database/tables/airing_schedule_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('AiringScheduleEntity') 4 | class AiringScheduleTable extends Table { 5 | @override 6 | Set get primaryKey => {id}; 7 | 8 | TextColumn get id => text().named('airing_schedules_id')(); 9 | 10 | TextColumn get mediaId => text().named('airing_schedules_media_id')(); 11 | 12 | IntColumn get airingAt => 13 | integer().named('airing_schedules_airing_at').nullable()(); 14 | 15 | IntColumn get timeUntilAiring => 16 | integer().named('airing_schedules_time_until_airing').nullable()(); 17 | 18 | IntColumn get episode => 19 | integer().named('airing_schedules_episode').nullable()(); 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/database/tables/category_media_paging_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('CategoryMediaPagingCrossRefEntity') 4 | class CategoryMediaPagingCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {category, mediaId}; 7 | 8 | TextColumn get mediaId => text().named('anime_category_cross_media_id')(); 9 | 10 | TextColumn get category => text().named('anime_category_cross_category_id')(); 11 | 12 | IntColumn get timeStamp => 13 | integer().named('anime_category_cross_time_stamp')(); 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/database/tables/character_media_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('CharacterRelatedMediaCrossRefEntity') 4 | class CharacterRelatedMediaCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {characterId, mediaId}; 7 | 8 | TextColumn get characterId => 9 | text().named('character_and_media_relation_cross_ref_character_id')(); 10 | 11 | TextColumn get mediaId => 12 | text().named('character_and_media_relation_cross_ref_media_id')(); 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/tables/favorite_info_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('FavoriteInfoEntity') 4 | class FavoriteInfoTable extends Table { 5 | IntColumn get id => integer().autoIncrement().named('favorite_info_id')(); 6 | 7 | TextColumn get favoriteType => text().named('favorite_type')(); 8 | 9 | TextColumn get infoId => text().named('favorite_info_foreign_id')(); 10 | 11 | TextColumn get userId => text().named('favorite_user_id')(); 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/database/tables/media_airing_schedule_updated_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('MediaAiringScheduleUpdatedEntity') 4 | class MediaAiringScheduleUpdatedTable extends Table { 5 | @override 6 | Set get primaryKey => {updatedMediaId}; 7 | 8 | TextColumn get updatedMediaId => text().named('updated_media_id')(); 9 | 10 | DateTimeColumn get updateTime => 11 | dateTime().named('new_episode_update_date_time')(); 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/database/tables/media_character_paging_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('MediaCharacterPagingCrossRefEntity') 4 | class MediaCharacterPagingCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {characterId, mediaId}; 7 | 8 | TextColumn get characterId => 9 | text().named('media_character_cross_anime_id')(); 10 | 11 | TextColumn get mediaId => 12 | text().named('media_character_cross_character_id')(); 13 | 14 | IntColumn get timeStamp => 15 | integer().named('media_character_cross_time_stamp')(); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/database/tables/media_relation_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('MediaRelationCrossRefEntity') 4 | class MediaRelationCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {ownerId, relationId}; 7 | 8 | TextColumn get ownerId => 9 | text().named('media_relation_cross_ref_owner_media_id')(); 10 | 11 | TextColumn get relationId => 12 | text().named('media_relation_cross_ref_relation_media_id')(); 13 | 14 | TextColumn get relationType => 15 | text().named('media_staff_cross_ref_relation_type')(); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/database/tables/media_staff_paging_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('MediaStaffPagingCrossRefEntity') 4 | class MediaStaffPagingCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {staffId, mediaId}; 7 | 8 | TextColumn get staffId => text().named('media_staff_cross_staff_id')(); 9 | 10 | TextColumn get mediaId => text().named('media_staff_cross_anime_id')(); 11 | 12 | TextColumn get staffRole => text().named('media_staff_cross_staff_role')(); 13 | 14 | IntColumn get timeStamp => integer().named('media_staff_cross_timeStamp')(); 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/database/tables/released_package_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('ReleasedPackageEntity') 4 | class ReleasedPackageTable extends Table { 5 | IntColumn get id => 6 | integer().nullable().autoIncrement().named('released_package_id')(); 7 | 8 | TextColumn get apkDownloadUrl => 9 | text().named('released_package_apk_download_url')(); 10 | 11 | TextColumn get tagName => text().named('released_package_tag_name')(); 12 | } 13 | -------------------------------------------------------------------------------- /lib/core/database/tables/search_result_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('SearchResultEntity') 4 | class SearchResultTable extends Table { 5 | @override 6 | Set get primaryKey => {mediaId, mediaSource}; 7 | 8 | TextColumn get mediaId => text().named('search_result_media_id')(); 9 | 10 | TextColumn get mediaSource => text().named('search_result_media_source')(); 11 | 12 | TextColumn get cache => text().named('search_result_cache')(); 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/database/tables/studio_media_cross_reference_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('StudioMediaCrossRefEntity') 4 | class StudioMediaCrossRefTable extends Table { 5 | @override 6 | Set get primaryKey => {studioId, mediaId}; 7 | 8 | TextColumn get studioId => text().named('studio_media_cross_ref_studio_id')(); 9 | 10 | TextColumn get mediaId => text().named('studio_media_cross_ref_media_id')(); 11 | } 12 | -------------------------------------------------------------------------------- /lib/core/database/tables/studio_table.dart: -------------------------------------------------------------------------------- 1 | import 'package:drift/drift.dart'; 2 | 3 | @DataClassName('StudioEntity') 4 | class StudioTable extends Table { 5 | @override 6 | Set get primaryKey => {id}; 7 | 8 | TextColumn get id => text().named('studio_id')(); 9 | 10 | TextColumn get name => text().named('studio_name')(); 11 | 12 | TextColumn get siteUrl => text().named('studio_site_url').nullable()(); 13 | 14 | BoolColumn get isAnimationStudio => 15 | boolean().named('studio_is_animation_studio')(); 16 | 17 | BoolColumn get isFavourite => boolean().named('studio_is_favourite')(); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/design_system/animation/scale_transaction_animation.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | Widget buildSizeTransition(Widget child, Animation animation) { 4 | return SizeTransition(sizeFactor: animation, child: child); 5 | } 6 | -------------------------------------------------------------------------------- /lib/core/design_system/assets/icons.dart: -------------------------------------------------------------------------------- 1 | 2 | mixin AfIcons { 3 | static const String icYoutube = 'assets/image/ic_youtube_xml'; 4 | static const String icNewBadge = 'assets/image/new_badge.png'; 5 | static const String icApp = 'assets/image/ic_launcher-playstore.png'; 6 | } 7 | 8 | -------------------------------------------------------------------------------- /lib/core/design_system/assets/video.dart: -------------------------------------------------------------------------------- 1 | mixin AfVideo { 2 | static const String longPressGestureVideo = 3 | 'assets/video/long_press_gesture_video.mp4'; 4 | static const String slidingGestureVideo = 5 | 'assets/video/sliding_gesture_video.mp4'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/core/design_system/theme/colors.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | const brandColor = Color(0xfffffbff); 4 | const hashtagColor = Color(0xff4aaef1); 5 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/af_toggle_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AniFlowToggleButton extends StatelessWidget { 4 | const AniFlowToggleButton( 5 | {required this.selected, 6 | required this.onClick, 7 | required this.label, 8 | super.key}); 9 | 10 | final bool selected; 11 | final VoidCallback onClick; 12 | final String label; 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | if (selected) { 17 | return FilledButton.tonalIcon( 18 | onPressed: onClick, 19 | icon: const Icon(Icons.check), 20 | label: Text(label)); 21 | } else { 22 | return OutlinedButton(onPressed: onClick, child: Text(label)); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/avatar_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/design_system/widget/af_network_image.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | 4 | Widget buildAvatarIcon(BuildContext context, String avatarUrl) { 5 | return Container( 6 | width: 48, 7 | height: 48, 8 | decoration: const BoxDecoration( 9 | shape: BoxShape.circle, 10 | ), 11 | clipBehavior: Clip.hardEdge, 12 | child: AFNetworkImage( 13 | imageUrl: avatarUrl, 14 | ), 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/comming_soon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ComingSoonPage extends StatelessWidget { 4 | const ComingSoonPage({super.key}); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Center( 9 | child: Text( 10 | 'Coming soon..', 11 | style: Theme.of(context).textTheme.headlineMedium, 12 | ), 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/genre_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class GenreItem extends StatelessWidget { 4 | const GenreItem({super.key, required this.label}); 5 | 6 | final String label; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Card( 11 | shape: const StadiumBorder(), 12 | color: Theme.of(context).colorScheme.secondaryContainer, 13 | child: Padding( 14 | padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4.0), 15 | child: Text( 16 | label, 17 | style: Theme.of(context).textTheme.labelLarge, 18 | ), 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/image_load_initial_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | Widget buildImageInitialWidget(BuildContext context) { 4 | return Container( 5 | color: Theme.of(context).colorScheme.surfaceContainerHighest, 6 | ); 7 | } 8 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/loading_dummy_scaffold.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/design_system/widget/loading_indicator.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class LoadingDummyScaffold extends StatelessWidget { 5 | const LoadingDummyScaffold({super.key}); 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | appBar: AppBar( 11 | title: const Text('----'), 12 | actions: const [ 13 | LoadingIndicator(isLoading: true), 14 | SizedBox(width: 10), 15 | ], 16 | ), 17 | body: const SizedBox(), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/loading_indicator.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/util/global_static_constants.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:loading_animation_widget/loading_animation_widget.dart'; 4 | 5 | class LoadingIndicator extends StatelessWidget { 6 | const LoadingIndicator({required this.isLoading, super.key}); 7 | 8 | final bool isLoading; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return AnimatedOpacity( 13 | opacity: isLoading ? 1.0 : 0.0, 14 | duration: AfConfig.defaultAnimationDuration, 15 | child: LoadingAnimationWidget.fourRotatingDots( 16 | color: Theme.of(context).colorScheme.onSurfaceVariant, 17 | size: 33.0, 18 | ), 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/core/design_system/widget/popup_menu_anchor.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PopupMenuAnchor extends StatelessWidget { 4 | const PopupMenuAnchor({ 5 | required this.menuItems, 6 | required this.builder, 7 | required this.menuItemBuilder, 8 | super.key, 9 | }); 10 | 11 | final List menuItems; 12 | final MenuAnchorChildBuilder builder; 13 | final Widget Function(BuildContext context, T item) menuItemBuilder; 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return MenuAnchor( 18 | builder: builder, 19 | menuChildren: menuItems 20 | .map( 21 | (e) => menuItemBuilder(context, e), 22 | ) 23 | .toList(), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/core/firebase/analytics/fa_user_property.dart: -------------------------------------------------------------------------------- 1 | 2 | enum FirebaseUserProperty { 3 | mediaContent(propertyName: 'media_content'); 4 | 5 | final String propertyName; 6 | 7 | const FirebaseUserProperty({required this.propertyName}); 8 | } 9 | -------------------------------------------------------------------------------- /lib/core/firebase/remote_config/model/home_struct_remote_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/home_sector_category.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'home_struct_remote_model.freezed.dart'; 5 | 6 | part 'home_struct_remote_model.g.dart'; 7 | 8 | @freezed 9 | class HomeStructRemoteModel with _$HomeStructRemoteModel { 10 | const factory HomeStructRemoteModel({ 11 | @JsonKey(name: 'anime') @Default([]) List anime, 12 | @JsonKey(name: 'manga') @Default([]) List manga, 13 | }) = _HomeStructRemoteModel; 14 | 15 | factory HomeStructRemoteModel.fromJson(Map json) => 16 | _$HomeStructRemoteModelFromJson(json); 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/network/api/activity_like_mution_graphql.dart: -------------------------------------------------------------------------------- 1 | 2 | String get activityLikeMutationGraphql => ''' 3 | mutation(\$id: Int, \$type: LikeableType) { 4 | ToggleLikeV2(id: \$id, type: \$type) { 5 | ...on ListActivity { 6 | id 7 | } 8 | } 9 | } 10 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/common_graphql.dart: -------------------------------------------------------------------------------- 1 | const String pageInfo = ''' 2 | pageInfo { 3 | total 4 | perPage 5 | currentPage 6 | lastPage 7 | hasNextPage 8 | } 9 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/medias_query_graphql.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/api/media_content_graphql.dart'; 2 | 3 | String get mediasQueryGraphql => ''' 4 | query(\$id_in: [Int]) { 5 | Page(page: 1, perPage: 10) { 6 | media(id_in: \$id_in) { 7 | $mediaContentQueryGraphql 8 | } 9 | } 10 | } 11 | '''; 12 | -------------------------------------------------------------------------------- /lib/core/network/api/query_anime_staff_page_graphql.dart: -------------------------------------------------------------------------------- 1 | String get staffPageGraphql => 2 | ''' 3 | query (\$id: Int, \$page: Int, \$perPage: Int) { 4 | Media(id: \$id) { 5 | staff(page: \$page, perPage: \$perPage, sort: FAVOURITES_DESC) { 6 | pageInfo { 7 | total 8 | perPage 9 | currentPage 10 | lastPage 11 | hasNextPage 12 | } 13 | edges { 14 | role 15 | node { 16 | id 17 | name { 18 | first 19 | middle 20 | last 21 | full 22 | native 23 | } 24 | image { 25 | large 26 | medium 27 | } 28 | } 29 | } 30 | } 31 | } 32 | } 33 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/studio_detail_query_graphql.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/api/media_content_graphql.dart'; 2 | 3 | String get studioDetailQueryGraphQLString => ''' 4 | query (\$id: Int) { 5 | Studio(id: \$id) { 6 | id 7 | name 8 | isAnimationStudio 9 | siteUrl 10 | isFavourite 11 | } 12 | } 13 | '''; 14 | 15 | String get studioRelatedMediaQueryGraphQl => ''' 16 | query(\$id: Int, \$page: Int, \$perPage: Int) { 17 | Studio(id: \$id) { 18 | media(page: \$page, perPage: \$perPage, sort: [START_DATE_DESC]) { 19 | $mediaConnectionQueryGraphql 20 | } 21 | } 22 | } 23 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/toggle_favorite_mutation_graphql.dart: -------------------------------------------------------------------------------- 1 | class ToggleFavoriteMutationParam { 2 | final int? animeId; 3 | final int? mangaId; 4 | final int? characterId; 5 | final int? staffId; 6 | final int? studioId; 7 | 8 | ToggleFavoriteMutationParam( 9 | {this.animeId, 10 | this.mangaId, 11 | this.characterId, 12 | this.staffId, 13 | this.studioId}); 14 | } 15 | 16 | String get toggleFavoriteMutationGraphQl => ''' 17 | mutation (\$animeId: Int, \$mangaId: Int, \$characterId: Int, \$staffId: Int, \$studioId: Int) { 18 | ToggleFavourite(animeId: \$animeId, mangaId: \$mangaId, characterId: \$characterId, staffId: \$staffId, studioId: \$studioId) { 19 | anime { 20 | edges { 21 | id 22 | } 23 | } 24 | } 25 | } 26 | '''; 27 | -------------------------------------------------------------------------------- /lib/core/network/api/user_favorite_anime_query_graphql.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/network/api/media_content_graphql.dart'; 3 | 4 | String get userFavoriteAnimeQueryGraphQl => 5 | ''' 6 | query(\$UserId: Int, \$page: Int, \$perPage: Int){ 7 | User(id: \$UserId) { 8 | id 9 | name 10 | favourites(page: 1) { 11 | anime(page: \$page, perPage: \$perPage) { 12 | nodes { 13 | $mediaContentQueryGraphql 14 | } 15 | } 16 | } 17 | } 18 | } 19 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/user_favorite_character_query_graphql.dart: -------------------------------------------------------------------------------- 1 | 2 | String get userFavoriteCharacterQueryGraphQl => 3 | ''' 4 | query(\$UserId: Int, \$page: Int, \$perPage: Int){ 5 | User(id: \$UserId) { 6 | id 7 | name 8 | favourites(page: 1) { 9 | characters(page: \$page, perPage: \$perPage) { 10 | nodes { 11 | id 12 | image { 13 | large 14 | medium 15 | } 16 | name { 17 | first 18 | middle 19 | last 20 | full 21 | native 22 | } 23 | } 24 | } 25 | } 26 | } 27 | } 28 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/user_favorite_manga_query_graphql.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/network/api/media_content_graphql.dart'; 3 | 4 | String get userFavoriteMangaQueryGraphQl => 5 | ''' 6 | query(\$UserId: Int, \$page: Int, \$perPage: Int){ 7 | User(id: \$UserId) { 8 | id 9 | name 10 | favourites(page: 1) { 11 | manga(page: \$page, perPage: \$perPage) { 12 | nodes { 13 | $mediaContentQueryGraphql 14 | } 15 | } 16 | } 17 | } 18 | } 19 | '''; -------------------------------------------------------------------------------- /lib/core/network/api/user_favorite_staff_query_graphql.dart: -------------------------------------------------------------------------------- 1 | 2 | String get userFavoriteStaffQueryGraphQl => 3 | ''' 4 | query(\$UserId: Int, \$page: Int, \$perPage: Int){ 5 | User(id: \$UserId) { 6 | id 7 | name 8 | favourites(page: 1) { 9 | staff(page: \$page, perPage: \$perPage) { 10 | nodes { 11 | id 12 | name { 13 | first 14 | middle 15 | last 16 | full 17 | native 18 | } 19 | image { 20 | large 21 | medium 22 | } 23 | } 24 | } 25 | } 26 | } 27 | } 28 | '''; -------------------------------------------------------------------------------- /lib/core/network/model/activity_reply_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/user_dto.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'activity_reply_dto.freezed.dart'; 5 | part 'activity_reply_dto.g.dart'; 6 | 7 | @freezed 8 | class ActivityReplyDto with _$ActivityReplyDto { 9 | const factory ActivityReplyDto({ 10 | @JsonKey(name: 'id') int? id, 11 | @JsonKey(name: 'likeCount') int? likeCount, 12 | @JsonKey(name: 'text') String? text, 13 | @JsonKey(name: 'user') UserDto? user, 14 | @JsonKey(name: 'isLiked') bool? isLiked, 15 | @JsonKey(name: 'createdAt') int? createdAt, 16 | }) = _ActivityReplyDto; 17 | 18 | factory ActivityReplyDto.fromJson(Map json) => 19 | _$ActivityReplyDtoFromJson(json); 20 | } -------------------------------------------------------------------------------- /lib/core/network/model/ani_activity.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/list_activity_dto.dart'; 2 | import 'package:aniflow/core/network/model/text_activity_dto.dart'; 3 | 4 | abstract class AniActivity { 5 | static AniActivity? mapToAniActivity(Map jsonMap) { 6 | switch (jsonMap['__typename']) { 7 | case 'TextActivity' : 8 | return TextActivityDto.fromJson(jsonMap); 9 | case 'ListActivity' : 10 | return ListActivityDto.fromJson(jsonMap); 11 | } 12 | 13 | return null; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/network/model/anime_rank.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'anime_rank.freezed.dart'; 4 | 5 | part 'anime_rank.g.dart'; 6 | 7 | @freezed 8 | class AnimeRank with _$AnimeRank { 9 | factory AnimeRank({ 10 | @JsonKey(name: 'rank') int? rank, 11 | @JsonKey(name: 'type') String? type, 12 | @JsonKey(name: 'allTime') bool? allTime, 13 | }) = _AnimeRank; 14 | 15 | factory AnimeRank.fromJson(Map json) => 16 | _$$AnimeRankImplFromJson(json); 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/network/model/anime_rank.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'anime_rank.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | _$AnimeRankImpl _$$AnimeRankImplFromJson(Map json) => 10 | _$AnimeRankImpl( 11 | rank: (json['rank'] as num?)?.toInt(), 12 | type: json['type'] as String?, 13 | allTime: json['allTime'] as bool?, 14 | ); 15 | 16 | Map _$$AnimeRankImplToJson(_$AnimeRankImpl instance) => 17 | { 18 | 'rank': instance.rank, 19 | 'type': instance.type, 20 | 'allTime': instance.allTime, 21 | }; 22 | -------------------------------------------------------------------------------- /lib/core/network/model/bangumi_subject_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'bangumi_subject_dto.freezed.dart'; 4 | part 'bangumi_subject_dto.g.dart'; 5 | 6 | @freezed 7 | class BangumiSubjectDto with _$BangumiSubjectDto { 8 | const factory BangumiSubjectDto({ 9 | @JsonKey(name: 'id') required int id, 10 | @JsonKey(name: 'name') required String name, 11 | @JsonKey(name: 'name_cn') required String nameCn, 12 | }) = _BangumiSubjectDto; 13 | 14 | factory BangumiSubjectDto.fromJson(Map json) => 15 | _$BangumiSubjectDtoFromJson(json); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/character_connection.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/character_edge.dart'; 2 | import 'package:aniflow/core/network/model/page_info.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'character_connection.freezed.dart'; 6 | part 'character_connection.g.dart'; 7 | 8 | @freezed 9 | class CharacterConnection with _$CharacterConnection { 10 | factory CharacterConnection({ 11 | @JsonKey(name: 'pageInfo') PageInfo? pageInfo, 12 | @Default([]) @JsonKey(name: 'edges') List edges, 13 | }) = _CharacterConnection; 14 | 15 | factory CharacterConnection.fromJson(Map json) => 16 | _$$CharacterConnectionImplFromJson(json); 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/network/model/character_image_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'character_image_dto.freezed.dart'; 4 | 5 | part 'character_image_dto.g.dart'; 6 | 7 | @freezed 8 | class CharacterImageDto with _$CharacterImageDto { 9 | const factory CharacterImageDto({ 10 | @JsonKey(name: 'large') String? large, 11 | @JsonKey(name: 'medium') String? medium, 12 | }) = _CharacterImageDto; 13 | 14 | factory CharacterImageDto.fromJson(Map json) => 15 | _$CharacterImageDtoFromJson(json); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/character_image_dto.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'character_image_dto.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | _$CharacterImageDtoImpl _$$CharacterImageDtoImplFromJson( 10 | Map json) => 11 | _$CharacterImageDtoImpl( 12 | large: json['large'] as String?, 13 | medium: json['medium'] as String?, 14 | ); 15 | 16 | Map _$$CharacterImageDtoImplToJson( 17 | _$CharacterImageDtoImpl instance) => 18 | { 19 | 'large': instance.large, 20 | 'medium': instance.medium, 21 | }; 22 | -------------------------------------------------------------------------------- /lib/core/network/model/fuzzy_date_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/notification.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'fuzzy_date_dto.freezed.dart'; 5 | 6 | part 'fuzzy_date_dto.g.dart'; 7 | 8 | @freezed 9 | class FuzzyDateDto extends AniNotification with _$FuzzyDateDto { 10 | factory FuzzyDateDto({ 11 | @JsonKey(name: 'year') int? year, 12 | @JsonKey(name: 'month') int? month, 13 | @JsonKey(name: 'day') int? day, 14 | }) = _FuzzyDateDto; 15 | 16 | factory FuzzyDateDto.fromJson(Map json) => 17 | _$$FuzzyDateDtoImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/fuzzy_date_input_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/notification.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'fuzzy_date_input_dto.freezed.dart'; 5 | 6 | part 'fuzzy_date_input_dto.g.dart'; 7 | 8 | @freezed 9 | class FuzzyDateInputDto extends AniNotification with _$FuzzyDateInputDto { 10 | factory FuzzyDateInputDto({ 11 | @JsonKey(name: 'year') int? year, 12 | @JsonKey(name: 'month') int? month, 13 | @JsonKey(name: 'day') int? day, 14 | }) = _FuzzyDateInputDto; 15 | 16 | factory FuzzyDateInputDto.fromJson(Map json) => 17 | _$$FuzzyDateInputDtoImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/github_user_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'github_user_dto.freezed.dart'; 4 | 5 | part 'github_user_dto.g.dart'; 6 | 7 | @freezed 8 | class GithubUserDto with _$GithubUserDto { 9 | const factory GithubUserDto({ 10 | @JsonKey(name: 'login') String? login, 11 | @JsonKey(name: 'id') int? id, 12 | @JsonKey(name: 'avatar_url') String? avatarUrl, 13 | @JsonKey(name: 'url') String? url, 14 | @JsonKey(name: 'bio') String? bio, 15 | }) = _GithubUserDto; 16 | 17 | factory GithubUserDto.fromJson(Map json) => 18 | _$GithubUserDtoFromJson(json); 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/network/model/likeable_type.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'likeable_type.g.dart'; 4 | 5 | @JsonEnum(alwaysCreate: true) 6 | enum LikeableType { 7 | @JsonValue('THREAD') 8 | thread, 9 | @JsonValue('THREAD_COMMENT') 10 | threadComment, 11 | @JsonValue('ACTIVITY') 12 | activity, 13 | @JsonValue('ACTIVITY_REPLY') 14 | activityReply; 15 | 16 | String toJson() => _$LikeableTypeEnumMap[this]!; 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/network/model/likeable_type.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'likeable_type.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | const _$LikeableTypeEnumMap = { 10 | LikeableType.thread: 'THREAD', 11 | LikeableType.threadComment: 'THREAD_COMMENT', 12 | LikeableType.activity: 'ACTIVITY', 13 | LikeableType.activityReply: 'ACTIVITY_REPLY', 14 | }; 15 | -------------------------------------------------------------------------------- /lib/core/network/model/media_connection.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/media_edge.dart'; 2 | import 'package:aniflow/core/network/model/page_info.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'media_connection.freezed.dart'; 6 | 7 | part 'media_connection.g.dart'; 8 | 9 | @freezed 10 | class MediaConnection with _$MediaConnection { 11 | factory MediaConnection({ 12 | @JsonKey(name: 'pageInfo') PageInfo? pageInfo, 13 | @Default([]) @JsonKey(name: 'edges') List edges, 14 | }) = _MediaConnection; 15 | 16 | factory MediaConnection.fromJson(Map json) => 17 | _$$MediaConnectionImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/media_cover_image_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'media_cover_image_dto.freezed.dart'; 4 | 5 | part 'media_cover_image_dto.g.dart'; 6 | 7 | @freezed 8 | class MediaCoverImageDto with _$MediaCoverImageDto { 9 | const factory MediaCoverImageDto({ 10 | @JsonKey(name: 'extraLarge') String? extraLarge, 11 | @JsonKey(name: 'large') String? large, 12 | @JsonKey(name: 'medium') String? medium, 13 | @JsonKey(name: 'color') String? color, 14 | }) = _MediaCoverImageDto; 15 | 16 | factory MediaCoverImageDto.fromJson(Map json) => 17 | _$MediaCoverImageDtoFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/media_list_option_dto.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/common/setting/score_format.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'media_list_option_dto.freezed.dart'; 6 | part 'media_list_option_dto.g.dart'; 7 | 8 | @freezed 9 | class MediaListOptionDto with _$MediaListOptionDto { 10 | factory MediaListOptionDto({ 11 | @JsonKey(name: 'scoreFormat') ScoreFormat? scoreFormat, 12 | }) = _MediaListOptionDto; 13 | 14 | factory MediaListOptionDto.fromJson(Map json) => 15 | _$$MediaListOptionDtoImplFromJson(json); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/media_tag_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'media_tag_dto.freezed.dart'; 4 | 5 | part 'media_tag_dto.g.dart'; 6 | 7 | @freezed 8 | class MediaTagDto with _$MediaTagDto { 9 | const factory MediaTagDto({ 10 | @JsonKey(name: 'id') int? id, 11 | @JsonKey(name: 'name') String? name, 12 | @JsonKey(name: 'description') String? description, 13 | @JsonKey(name: 'category') String? category, 14 | @JsonKey(name: 'rank') String? rank, 15 | }) = _MediaTagDto; 16 | 17 | factory MediaTagDto.fromJson(Map json) => 18 | _$MediaTagDtoFromJson(json); 19 | } -------------------------------------------------------------------------------- /lib/core/network/model/nodes_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'nodes_dto.freezed.dart'; 4 | 5 | part 'nodes_dto.g.dart'; 6 | 7 | @Freezed(genericArgumentFactories: true) 8 | sealed class NodesDto with _$NodesDto { 9 | const factory NodesDto({ 10 | @Default([]) @JsonKey(name: 'nodes') List nodes, 11 | }) = _NodesDto; 12 | 13 | factory NodesDto.fromJson( 14 | Map json, T Function(Object?) fromJsonT) => 15 | _$NodesDtoFromJson(json, fromJsonT); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/page_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'page_info.freezed.dart'; 4 | part 'page_info.g.dart'; 5 | 6 | @freezed 7 | class PageInfo with _$PageInfo { 8 | factory PageInfo({ 9 | @Default(-1) @JsonKey(name: 'total') int total, 10 | @Default(-1) @JsonKey(name: 'perPage') int perPage, 11 | @Default(-1) @JsonKey(name: 'currentPage') int currentPage, 12 | @Default(-1) @JsonKey(name: 'lastPage') int lastPage, 13 | @Default(true) @JsonKey(name: 'hasNextPage') bool hasNextPage, 14 | }) = _PageInfo; 15 | 16 | factory PageInfo.fromJson(Map json) => 17 | _$$PageInfoImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/search_request.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/search_title.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'search_request.freezed.dart'; 5 | 6 | @freezed 7 | class SearchRequest with _$SearchRequest { 8 | const factory SearchRequest({ 9 | required SearchTitle title, 10 | required int season, 11 | required int episode, 12 | @Default(false) bool useFirstKeyword, 13 | }) = _SearchRequest; 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/network/model/source_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/track_dto.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'source_dto.freezed.dart'; 5 | 6 | part 'source_dto.g.dart'; 7 | 8 | @freezed 9 | class SourceDto with _$SourceDto { 10 | const factory SourceDto({ 11 | required String sources, 12 | String? sourcesBackup, 13 | @Default([]) List tracks, 14 | int? server, 15 | }) = _SourceDto; 16 | 17 | factory SourceDto.fromJson(Map json) => 18 | _$SourceDtoFromJson(json); 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/network/model/staff_connection.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/page_info.dart'; 2 | import 'package:aniflow/core/network/model/staff_edge.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'staff_connection.freezed.dart'; 6 | 7 | part 'staff_connection.g.dart'; 8 | 9 | @freezed 10 | class StaffConnection with _$StaffConnection { 11 | factory StaffConnection({ 12 | @JsonKey(name: 'pageInfo') PageInfo? pageInfo, 13 | @Default([]) @JsonKey(name: 'edges') List edges, 14 | }) = _StaffConnection; 15 | 16 | factory StaffConnection.fromJson(Map json) => 17 | _$$StaffConnectionImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/staff_edge.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/staff_dto.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'staff_edge.freezed.dart'; 5 | part 'staff_edge.g.dart'; 6 | 7 | @freezed 8 | class StaffEdge with _$StaffEdge { 9 | factory StaffEdge({ 10 | @JsonKey(name: 'role') String? role, 11 | @JsonKey(name: 'node') StaffDto? staffNode, 12 | }) = _StaffEdge; 13 | 14 | factory StaffEdge.fromJson(Map json) => 15 | _$$StaffEdgeImplFromJson(json); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/staff_edge.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'staff_edge.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | _$StaffEdgeImpl _$$StaffEdgeImplFromJson(Map json) => 10 | _$StaffEdgeImpl( 11 | role: json['role'] as String?, 12 | staffNode: json['node'] == null 13 | ? null 14 | : StaffDto.fromJson(json['node'] as Map), 15 | ); 16 | 17 | Map _$$StaffEdgeImplToJson(_$StaffEdgeImpl instance) => 18 | { 19 | 'role': instance.role, 20 | 'node': instance.staffNode, 21 | }; 22 | -------------------------------------------------------------------------------- /lib/core/network/model/staff_image_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'staff_image_dto.freezed.dart'; 4 | 5 | part 'staff_image_dto.g.dart'; 6 | 7 | @freezed 8 | class StaffImageDto with _$StaffImageDto { 9 | const factory StaffImageDto({ 10 | @JsonKey(name: 'large') String? large, 11 | @JsonKey(name: 'medium') String? medium, 12 | }) = _StaffImageDto; 13 | 14 | factory StaffImageDto.fromJson(Map json) => 15 | _$StaffImageDtoFromJson(json); 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/network/model/staff_image_dto.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'staff_image_dto.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | _$StaffImageDtoImpl _$$StaffImageDtoImplFromJson(Map json) => 10 | _$StaffImageDtoImpl( 11 | large: json['large'] as String?, 12 | medium: json['medium'] as String?, 13 | ); 14 | 15 | Map _$$StaffImageDtoImplToJson(_$StaffImageDtoImpl instance) => 16 | { 17 | 'large': instance.large, 18 | 'medium': instance.medium, 19 | }; 20 | -------------------------------------------------------------------------------- /lib/core/network/model/studio_connection.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/page_info.dart'; 2 | import 'package:aniflow/core/network/model/studio_dto.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'studio_connection.freezed.dart'; 6 | 7 | part 'studio_connection.g.dart'; 8 | 9 | @freezed 10 | class StudioConnection with _$StudioConnection { 11 | factory StudioConnection({ 12 | @JsonKey(name: 'pageInfo') PageInfo? pageInfo, 13 | @Default([]) @JsonKey(name: 'nodes') List nodes, 14 | }) = _StudioConnection; 15 | 16 | factory StudioConnection.fromJson(Map json) => 17 | _$$StudioConnectionImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/studio_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'studio_dto.freezed.dart'; 4 | 5 | part 'studio_dto.g.dart'; 6 | 7 | @freezed 8 | class StudioDto with _$StudioDto { 9 | factory StudioDto({ 10 | @Default(-1) @JsonKey(name: 'id') int id, 11 | @JsonKey(name: 'name') String? name, 12 | @JsonKey(name: 'siteUrl') String? siteUrl, 13 | @Default(false) @JsonKey(name: 'isAnimationStudio') bool isAnimationStudio, 14 | @Default(false) @JsonKey(name: 'isFavourite') bool isFavourite, 15 | }) = _StudioDto; 16 | 17 | factory StudioDto.fromJson(Map json) => 18 | _$$StudioDtoImplFromJson(json); 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/network/model/track_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'track_dto.freezed.dart'; 4 | part 'track_dto.g.dart'; 5 | 6 | @freezed 7 | class TrackDto with _$TrackDto { 8 | const factory TrackDto({ 9 | @Default("") String file, 10 | @Default("") String label, 11 | @Default("") String kind, 12 | @Default(false) @JsonKey(name: "default") bool isDefault, 13 | }) = _TrackDto; 14 | 15 | factory TrackDto.fromJson(Map json) => 16 | _$TrackDtoFromJson(json); 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/network/model/trailer_dto.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'trailer_dto.freezed.dart'; 5 | 6 | part 'trailer_dto.g.dart'; 7 | 8 | @freezed 9 | class TrailerDto with _$TrailerDto { 10 | factory TrailerDto({ 11 | @Default('') @JsonKey(name: 'id') String id, 12 | @Default('') @JsonKey(name: 'site') String site, 13 | @Default('') @JsonKey(name: 'thumbnail') String thumbnail, 14 | }) = _TrailerDto; 15 | 16 | factory TrailerDto.fromJson(Map json) => 17 | _$$TrailerDtoImplFromJson(json); 18 | } 19 | -------------------------------------------------------------------------------- /lib/core/network/model/user_status_statics_dto.dart: -------------------------------------------------------------------------------- 1 | import 'package:freezed_annotation/freezed_annotation.dart'; 2 | 3 | part 'user_status_statics_dto.freezed.dart'; 4 | 5 | part 'user_status_statics_dto.g.dart'; 6 | 7 | @freezed 8 | class UserStatusStaticsDto with _$UserStatusStaticsDto { 9 | const factory UserStatusStaticsDto({ 10 | @JsonKey(name: 'count') int? count, 11 | @JsonKey(name: 'meanScore') double? meanScore, 12 | @JsonKey(name: 'minutesWatched') int? minutesWatched, 13 | @JsonKey(name: 'chaptersRead') int? chaptersRead, 14 | @Default([]) @JsonKey(name: 'mediaIds') List mediaIds, 15 | }) = _UserStatusStaticsDto; 16 | 17 | factory UserStatusStaticsDto.fromJson(Map json) => 18 | _$UserStatusStaticsDtoFromJson(json); 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/network/util/anilist_page_util.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/network/model/page_info.dart'; 2 | 3 | mixin AniListPageUtil { 4 | static Future> getAllPageItem({ 5 | required Future Function(int page) onGetPage, 6 | required PageInfo Function(dynamic result) getPageInfoFromResult, 7 | required List Function(dynamic result) getItemListFromResult, 8 | }) async { 9 | var currentPage = 1; 10 | PageInfo currentPageInfo; 11 | List accList = []; 12 | 13 | do { 14 | final result = await onGetPage(currentPage); 15 | currentPageInfo = getPageInfoFromResult(result); 16 | accList += getItemListFromResult(result); 17 | currentPage++; 18 | } while (currentPageInfo.hasNextPage); 19 | 20 | return accList; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/core/notification/notification_util.dart: -------------------------------------------------------------------------------- 1 | import 'package:permission_handler/permission_handler.dart'; 2 | import 'package:platform_notification/platform_notification.dart'; 3 | 4 | mixin NotificationUtil { 5 | static Future canSendNotificationToChannel(String channelId) async { 6 | final permissionStatus = await Permission.notification.status; 7 | final isChannelEnabled = 8 | await PlatformNotification().isNotificationChannelEnabled(channelId); 9 | return isChannelEnabled && permissionStatus == PermissionStatus.granted; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/core/platform/di/auth_event_channel_module.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/platform/auth_event_channel.dart'; 2 | import 'package:injectable/injectable.dart'; 3 | 4 | @module 5 | abstract class PlatformEventChannelModule { 6 | @lazySingleton 7 | AuthEventChannel getAuthEventChannel() => AuthEventChannel(); 8 | } 9 | -------------------------------------------------------------------------------- /lib/core/platform/platform_channel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart'; 2 | 3 | class PlatformMethod { 4 | static PlatformMethod? _instance; 5 | 6 | factory PlatformMethod() => _instance ??= PlatformMethod._(); 7 | 8 | PlatformMethod._(); 9 | 10 | final MethodChannel _channel = 11 | const MethodChannel('com.andannn.animetracker/platform_method'); 12 | 13 | Future installPackage(String path) async { 14 | await _channel.invokeMethod('installPackage', {'path': path}); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/shared_preference/di/shared_preferences_module.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/app/di/env.dart'; 2 | import 'package:injectable/injectable.dart'; 3 | import 'package:shared_preferences/shared_preferences.dart'; 4 | 5 | @module 6 | abstract class RegisterModule { 7 | @preResolve 8 | @Environment(AfEnvironment.mobile) 9 | @Environment(AfEnvironment.desktop) 10 | Future get prefs => SharedPreferences.getInstance(); 11 | } -------------------------------------------------------------------------------- /lib/feature/activity_replies/bloc/activity_replies_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/activity_model.dart'; 2 | import 'package:aniflow/core/data/model/activity_reply_model.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'activity_replies_state.freezed.dart'; 6 | 7 | @freezed 8 | class ActivityRepliesState with _$ActivityRepliesState { 9 | const factory ActivityRepliesState({ 10 | @Default(false) bool isLoading, 11 | @Default([]) List replies, 12 | ActivityModel? activityModel, 13 | }) = _ActivityRepliesState; 14 | } 15 | -------------------------------------------------------------------------------- /lib/feature/aniflow_home/aniflow_home_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/user_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'aniflow_home_state.freezed.dart'; 5 | 6 | 7 | @freezed 8 | class AniflowHomeState with _$AniflowHomeState { 9 | const factory AniflowHomeState({ 10 | @Default(false) bool isSocialFeatureEnabled, 11 | UserModel? userModel, 12 | }) = _AniflowHomeState; 13 | } 14 | -------------------------------------------------------------------------------- /lib/feature/auth/bloc/auth_ui_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/user_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'auth_ui_state.freezed.dart'; 5 | 6 | @freezed 7 | class AuthState with _$AuthState { 8 | factory AuthState({ 9 | UserModel? userData, 10 | }) = _AuthState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/character_page/bloc/character_page_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/staff_language.dart'; 2 | import 'package:aniflow/core/common/setting/user_staff_name_language.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'character_page_model.freezed.dart'; 6 | 7 | @freezed 8 | class CharacterPageState with _$CharacterPageState { 9 | factory CharacterPageState({ 10 | @Default(StaffLanguage.japanese) StaffLanguage language, 11 | @Default(UserStaffNameLanguage.native) 12 | UserStaffNameLanguage userStaffNameLanguage, 13 | }) = _CharacterPageState; 14 | } 15 | -------------------------------------------------------------------------------- /lib/feature/detail_studio/bloc/detail_studio_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/setting/user_title_language.dart'; 2 | import 'package:aniflow/core/data/model/studio_model.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'detail_studio_state.freezed.dart'; 6 | 7 | @freezed 8 | class DetailStudioState with _$DetailStudioState { 9 | factory DetailStudioState({ 10 | @Default(false) bool isLoading, 11 | StudioModel? studioModel, 12 | @Default(UserTitleLanguage.native) UserTitleLanguage userTitleLanguage, 13 | }) = _DetailStudioState; 14 | } 15 | -------------------------------------------------------------------------------- /lib/feature/discover/airing_schedule/dummy_schedule_category_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/airing_schedule_and_anime_model.dart'; 2 | import 'package:aniflow/core/data/model/airing_schedule_model.dart'; 3 | import 'package:aniflow/core/data/model/media_model.dart'; 4 | import 'package:aniflow/feature/airing_schedule/airing_schedule_of_day/schedule_page_state.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | final dummyScheduleCategoryData = [ 8 | DayScheduleCategoryModel( 9 | const TimeOfDay(hour: 0, minute: 0), 10 | List.generate(3, (index) { 11 | return AiringScheduleAndAnimeModel( 12 | airingSchedule: AiringScheduleModel(), 13 | mediaModel: MediaModel(), 14 | ); 15 | }), 16 | ), 17 | ]; 18 | -------------------------------------------------------------------------------- /lib/feature/discover/airing_schedule/today_airing_schedule_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/airing_schedule_and_anime_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'today_airing_schedule_state.freezed.dart'; 5 | 6 | @freezed 7 | class TodayAiringScheduleState with _$TodayAiringScheduleState { 8 | const factory TodayAiringScheduleState({ 9 | @Default([]) List schedules, 10 | }) = _TodayAiringScheduleState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/discover/birthday_characters/birthday_characters_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/character_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'birthday_characters_state.freezed.dart'; 5 | 6 | @freezed 7 | class BirthdayCharactersState with _$BirthdayCharactersState { 8 | const factory BirthdayCharactersState({ 9 | @Default([]) List data, 10 | }) = _BirthdayCharactersState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/discover/birthday_characters/dummy_birthday_character_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/character_model.dart'; 2 | 3 | final dummyBirthdayCharacterData = List.generate(5, (index) { 4 | return CharacterModel(); 5 | }); 6 | -------------------------------------------------------------------------------- /lib/feature/discover/discover_ui_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/home_sector_category.dart'; 2 | import 'package:aniflow/core/common/definitions/media_type.dart'; 3 | import 'package:aniflow/core/data/model/user_model.dart'; 4 | import 'package:freezed_annotation/freezed_annotation.dart'; 5 | 6 | part 'discover_ui_state.freezed.dart'; 7 | 8 | @freezed 9 | class DiscoverUiState with _$DiscoverUiState { 10 | factory DiscoverUiState({ 11 | @Default(false) bool isLoading, 12 | @Default(MediaType.anime) MediaType currentMediaType, 13 | UserModel? userData, 14 | @Default([]) List sectors, 15 | }) = _DiscoverUiState; 16 | } 17 | -------------------------------------------------------------------------------- /lib/feature/discover/media_category_preview/media_category_preview_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'media_category_preview_state.freezed.dart'; 5 | 6 | @freezed 7 | class MediaCategoryPreviewState with _$MediaCategoryPreviewState { 8 | const factory MediaCategoryPreviewState({ 9 | @Default([]) List data, 10 | }) = _MediaCategoryPreviewState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/discover/next_to_watch/next_to_watch_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_with_list_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'next_to_watch_state.freezed.dart'; 5 | 6 | @freezed 7 | class NextToWatchState with _$NextToWatchState { 8 | const factory NextToWatchState({ 9 | @Default([]) List nextToWatchMediaList, 10 | }) = _NextToWatchState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/discover/recent_movies/dummy_movies_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_model.dart'; 2 | 3 | final dummyMoviesData = List.generate(3, (index) { 4 | return MediaModel(); 5 | }); 6 | -------------------------------------------------------------------------------- /lib/feature/discover/recent_movies/recent_movies_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'recent_movies_state.freezed.dart'; 5 | 6 | @freezed 7 | class RecentMoviesState with _$RecentMoviesState { 8 | const factory RecentMoviesState({ 9 | @Default([]) List movies, 10 | }) = _RecentMoviesState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/edit_profile/bloc/edit_profile_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/user_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'edit_profile_state.freezed.dart'; 5 | 6 | @freezed 7 | class EditProfileState with _$EditProfileState { 8 | const factory EditProfileState({ 9 | UserModel? userModel, 10 | }) = _EditProfileState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/image_preview/preview_source.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'preview_source.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | _$PreviewSourceImpl _$$PreviewSourceImplFromJson(Map json) => 10 | _$PreviewSourceImpl( 11 | imageUrl: json['imageUrl'] as String, 12 | savedFileTitle: json['savedFileTitle'] as String?, 13 | ); 14 | 15 | Map _$$PreviewSourceImplToJson(_$PreviewSourceImpl instance) => 16 | { 17 | 'imageUrl': instance.imageUrl, 18 | 'savedFileTitle': instance.savedFileTitle, 19 | }; 20 | -------------------------------------------------------------------------------- /lib/feature/media_list_update_page/bloc/media_list_update_page_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_with_list_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'media_list_update_page_state.freezed.dart'; 5 | 6 | @freezed 7 | class MediaListUpdatePageState with _$MediaListUpdatePageState { 8 | const factory MediaListUpdatePageState({ 9 | MediaWithListModel? mediaWithListModel, 10 | }) = _MediaListUpdatePageState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/media_list_update_page/media_list_modify_result.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/media_list_status.dart'; 2 | 3 | class MediaListModifyResult { 4 | MediaListModifyResult({ 5 | required this.score, 6 | required this.progress, 7 | required this.progressVolumes, 8 | required this.repeat, 9 | required this.status, 10 | required this.notes, 11 | required this.startedAt, 12 | required this.completedAt, 13 | this.private = false, 14 | }); 15 | 16 | final double? score; 17 | final int? progress; 18 | final int? progressVolumes; 19 | final int? repeat; 20 | final MediaListStatus? status; 21 | final String? notes; 22 | final DateTime? startedAt; 23 | final DateTime? completedAt; 24 | final bool private; 25 | } 26 | -------------------------------------------------------------------------------- /lib/feature/notification/bloc/notification_bloc.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/notification_repository.dart'; 2 | import 'package:aniflow/feature/notification/bloc/notification_state.dart'; 3 | import 'package:bloc/bloc.dart'; 4 | import 'package:injectable/injectable.dart'; 5 | 6 | sealed class NotificationEvent {} 7 | 8 | class OnNotificationChanged extends NotificationEvent { 9 | OnNotificationChanged({required this.category}); 10 | 11 | final NotificationCategory category; 12 | } 13 | 14 | @Injectable() 15 | class NotificationBloc extends Bloc { 16 | NotificationBloc() : super(NotificationState()) { 17 | on( 18 | (event, emit) => emit(state.copyWith(category: event.category)), 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/feature/notification/bloc/notification_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/notification_repository.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'notification_state.freezed.dart'; 5 | 6 | @freezed 7 | class NotificationState with _$NotificationState { 8 | factory NotificationState({ 9 | @Default(NotificationCategory.all) NotificationCategory category, 10 | }) = _NotificationState; 11 | } 12 | -------------------------------------------------------------------------------- /lib/feature/profile/profile_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/user_model.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'profile_state.freezed.dart'; 5 | 6 | @freezed 7 | class ProfileState with _$ProfileState { 8 | factory ProfileState({ 9 | UserModel? userData, 10 | @Default(false) bool isLoading, 11 | }) = _ProfileState; 12 | } 13 | -------------------------------------------------------------------------------- /lib/feature/profile/profile_tab_category.dart: -------------------------------------------------------------------------------- 1 | enum ProfileTabType { 2 | favorite, 3 | activity, 4 | stats, 5 | animeList, 6 | mangaList, 7 | } 8 | 9 | -------------------------------------------------------------------------------- /lib/feature/profile/sub_favorite/profile_favorite_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/definitions/favorite_category.dart'; 2 | import 'package:aniflow/core/data/model/favorite_item_model.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'profile_favorite_state.freezed.dart'; 6 | 7 | @freezed 8 | class ProfileFavoriteState with _$ProfileFavoriteState { 9 | factory ProfileFavoriteState({ 10 | @Default({}) 11 | Map> favoriteItems, 12 | }) = _ProfileFavoriteState; 13 | } 14 | -------------------------------------------------------------------------------- /lib/feature/profile/sub_media_list/profile_media_list_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/model/media_with_list_model.dart'; 2 | import 'package:aniflow/feature/profile/sub_media_list/profile_media_list_bloc.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'profile_media_list_state.freezed.dart'; 6 | 7 | @freezed 8 | class ProfileMediaListState with _$ProfileMediaListState { 9 | const factory ProfileMediaListState({ 10 | @Default({}) Map> sectorMap, 11 | }) = _ProfileMediaListState; 12 | } 13 | -------------------------------------------------------------------------------- /lib/feature/search/bloc/search_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/feature/search/bloc/search_type.dart'; 2 | import 'package:freezed_annotation/freezed_annotation.dart'; 3 | 4 | part 'search_state.freezed.dart'; 5 | 6 | @freezed 7 | class SearchState with _$SearchState { 8 | const factory SearchState({ 9 | String? keyword, 10 | @Default(SearchType.anime) SearchType selectedSearchType, 11 | }) = _SearchState; 12 | } 13 | -------------------------------------------------------------------------------- /lib/feature/search/bloc/search_type.dart: -------------------------------------------------------------------------------- 1 | enum SearchType { 2 | anime, 3 | manga, 4 | character, 5 | staff, 6 | studio, 7 | user, 8 | } 9 | -------------------------------------------------------------------------------- /lib/feature/settings/check_for_update/check_for_update_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/common/util/app_version_util.dart'; 2 | import 'package:aniflow/core/data/model/release_package_model.dart'; 3 | import 'package:freezed_annotation/freezed_annotation.dart'; 4 | 5 | part 'check_for_update_state.freezed.dart'; 6 | 7 | @freezed 8 | class CheckForUpdateState with _$CheckForUpdateState { 9 | const factory CheckForUpdateState({ 10 | @Default(false) bool isLoading, 11 | AppVersion? currentVersion, 12 | ReleasePackageModel? latestReleasedPackage, 13 | }) = _CheckForUpdateState; 14 | } 15 | -------------------------------------------------------------------------------- /lib/feature/social/activity/bloc/activity_state.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/common/definitions/activity_filter_type.dart'; 3 | import 'package:aniflow/core/common/definitions/activity_scope_category.dart'; 4 | import 'package:freezed_annotation/freezed_annotation.dart'; 5 | 6 | part 'activity_state.freezed.dart'; 7 | 8 | @freezed 9 | class ActivityState with _$ActivityState { 10 | factory ActivityState({ 11 | @Default(true) bool isLoading, 12 | ActivityFilterType? filterType, 13 | ActivityScopeCategory? scopeCategory, 14 | }) = _ActivityState; 15 | } 16 | -------------------------------------------------------------------------------- /platform_downloader/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 26 | /pubspec.lock 27 | **/doc/api/ 28 | .dart_tool/ 29 | build/ 30 | -------------------------------------------------------------------------------- /platform_downloader/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.0.1 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /platform_downloader/LICENSE: -------------------------------------------------------------------------------- 1 | TODO: Add your license here. 2 | -------------------------------------------------------------------------------- /platform_downloader/README.md: -------------------------------------------------------------------------------- 1 | # platform_downloader 2 | 3 | A new Flutter plugin project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter 8 | [plug-in package](https://flutter.dev/developing-packages/), 9 | a specialized package that includes platform-specific implementation code for 10 | Android and/or iOS. 11 | 12 | For help getting started with Flutter development, view the 13 | [online documentation](https://flutter.dev/docs), which offers tutorials, 14 | samples, guidance on mobile development, and a full API reference. 15 | 16 | -------------------------------------------------------------------------------- /platform_downloader/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /platform_downloader/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .cxx 10 | -------------------------------------------------------------------------------- /platform_downloader/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /platform_downloader/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /platform_downloader/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'platform_downloader' 2 | -------------------------------------------------------------------------------- /platform_downloader/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /platform_downloader/android/src/main/kotlin/com/andannn/downloader/platform_downloader/Constants.kt: -------------------------------------------------------------------------------- 1 | package com.andannn.downloader.platform_downloader 2 | 3 | const val PARAM_URL: String = "url" 4 | const val PARAM_SUB_PATH: String = "subPath" 5 | const val PARAM_FILE_NAME: String = "fileName" -------------------------------------------------------------------------------- /platform_downloader/example/README.md: -------------------------------------------------------------------------------- 1 | # platform_downloader_example 2 | 3 | Demonstrates how to use the platform_downloader plugin. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) 13 | 14 | For help getting started with Flutter development, view the 15 | [online documentation](https://docs.flutter.dev/), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /platform_downloader/example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/kotlin/com/andannn/downloader/platform_downloader_example/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.andannn.downloader.platform_downloader_example 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() 6 | -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_downloader/example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_downloader/example/android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(':app') 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /platform_downloader/example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4G 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /platform_downloader/example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip 6 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /platform_downloader/example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /platform_downloader/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /platform_downloader/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_downloader/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /platform_downloader/ios/Classes/PlatformDownloaderPlugin.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | public class PlatformDownloaderPlugin: NSObject, FlutterPlugin { 5 | public static func register(with registrar: FlutterPluginRegistrar) { 6 | let channel = FlutterMethodChannel(name: "platform_downloader", binaryMessenger: registrar.messenger()) 7 | let instance = PlatformDownloaderPlugin() 8 | registrar.addMethodCallDelegate(instance, channel: channel) 9 | } 10 | 11 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 12 | switch call.method { 13 | case "getPlatformVersion": 14 | result("iOS " + UIDevice.current.systemVersion) 15 | default: 16 | result(FlutterMethodNotImplemented) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /platform_downloader/lib/platform_downloader.dart: -------------------------------------------------------------------------------- 1 | import 'platform_downloader_platform_interface.dart'; 2 | 3 | class PlatformDownloader { 4 | Future downloadImageToExternalStorage(String url, String subFolder, 5 | [String? fileName]) { 6 | return PlatformDownloaderPlatform.instance 7 | .downloadImageToExternalStorage(url, subFolder, fileName); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /platform_notification/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 26 | /pubspec.lock 27 | **/doc/api/ 28 | .dart_tool/ 29 | build/ 30 | -------------------------------------------------------------------------------- /platform_notification/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.0.1 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /platform_notification/LICENSE: -------------------------------------------------------------------------------- 1 | TODO: Add your license here. 2 | -------------------------------------------------------------------------------- /platform_notification/README.md: -------------------------------------------------------------------------------- 1 | # platform_notification 2 | 3 | A new Flutter plugin project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter 8 | [plug-in package](https://flutter.dev/developing-packages/), 9 | a specialized package that includes platform-specific implementation code for 10 | Android and/or iOS. 11 | 12 | For help getting started with Flutter development, view the 13 | [online documentation](https://flutter.dev/docs), which offers tutorials, 14 | samples, guidance on mobile development, and a full API reference. 15 | 16 | -------------------------------------------------------------------------------- /platform_notification/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /platform_notification/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .cxx 10 | -------------------------------------------------------------------------------- /platform_notification/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'platform_notification' 2 | -------------------------------------------------------------------------------- /platform_notification/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /platform_notification/example/README.md: -------------------------------------------------------------------------------- 1 | # platform_notification_example 2 | 3 | Demonstrates how to use the platform_notification plugin. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) 13 | 14 | For help getting started with Flutter development, view the 15 | [online documentation](https://docs.flutter.dev/), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /platform_notification/example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/kotlin/com/andannn/aniflow/notification/platform_notification_example/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.andannn.aniflow.notification.platform_notification_example 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() 6 | -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /platform_notification/example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_notification/example/android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = "../build" 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(":app") 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /platform_notification/example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /platform_notification/example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip 6 | -------------------------------------------------------------------------------- /platform_notification/example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /platform_notification/example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /platform_notification/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh 39 | -------------------------------------------------------------------------------- /platform_notification/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/platform_notification/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /platform_notification/ios/Classes/PlatformNotificationPlugin.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | public class PlatformNotificationPlugin: NSObject, FlutterPlugin { 5 | public static func register(with registrar: FlutterPluginRegistrar) { 6 | let channel = FlutterMethodChannel(name: "platform_notification", binaryMessenger: registrar.messenger()) 7 | let instance = PlatformNotificationPlugin() 8 | registrar.addMethodCallDelegate(instance, channel: channel) 9 | } 10 | 11 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 12 | switch call.method { 13 | case "getPlatformVersion": 14 | result("iOS " + UIDevice.current.systemVersion) 15 | default: 16 | result(FlutterMethodNotImplemented) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /screen_shots/anime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/anime.png -------------------------------------------------------------------------------- /screen_shots/character.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/character.png -------------------------------------------------------------------------------- /screen_shots/home_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/home_page.png -------------------------------------------------------------------------------- /screen_shots/profile.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/profile.jpeg -------------------------------------------------------------------------------- /screen_shots/track_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/track_list.png -------------------------------------------------------------------------------- /screen_shots/voice_actor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andannn/aniflow/effaa03e4cf13af3106500cd873eb50128402c53/screen_shots/voice_actor.png -------------------------------------------------------------------------------- /test/core/data/mocks/mock_favorite_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/favorite_repository.dart'; 2 | import 'package:aniflow/core/data/load_result.dart'; 3 | import 'package:dio/dio.dart'; 4 | import 'package:flutter_test/flutter_test.dart'; 5 | 6 | class MockFavoriteRepository extends Fake implements FavoriteRepository { 7 | @override 8 | Future toggleFavoriteCharacter( 9 | String id, CancelToken token) async { 10 | return LoadSuccess(data: null); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test/core/data/mocks/mock_github_data_source.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/network/github_data_source.dart'; 3 | import 'package:aniflow/core/network/model/github_user_dto.dart'; 4 | import 'package:flutter_test/flutter_test.dart'; 5 | 6 | class MockGithubDataSource extends Fake implements GithubDataSource { 7 | @override 8 | Future getGithubUserById(String id) async { 9 | return const GithubUserDto( 10 | id: 121212, 11 | login: 'login', 12 | avatarUrl: 'avatarUrl', 13 | ); 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /test/core/data/mocks/mock_github_release_dao.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:aniflow/core/database/dao/github_release_dao.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | 5 | class MockGithubReleaseDao extends Fake implements GithubReleaseDao { 6 | } 7 | 8 | -------------------------------------------------------------------------------- /test/core/data/mocks/mock_media_list_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/data/media_list_repository.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | 4 | class MockMediaListRepository extends Fake implements MediaListRepository { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /test/core/data/mocks/mock_remote_config_manager.dart: -------------------------------------------------------------------------------- 1 | import 'package:aniflow/core/firebase/remote_config/remote_config_manager.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | 4 | class MockRemoteConfigManager extends Fake implements RemoteConfigManager {} 5 | -------------------------------------------------------------------------------- /test/feature/airing_schedule/bloc/airing_schedule_bloc_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:shared_preferences/shared_preferences.dart'; 3 | 4 | void main() { 5 | group('airing_schedule_bloc_test', () { 6 | setUp(() async { 7 | TestWidgetsFlutterBinding.ensureInitialized(); 8 | SharedPreferences.setMockInitialValues({}); 9 | }); 10 | 11 | tearDown(() async {}); 12 | }); 13 | } 14 | -------------------------------------------------------------------------------- /test_driver/run_flutter_drive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/zsh 2 | 3 | # Run the integration test 4 | flutter drive \ 5 | --driver=test_driver/integration_test.dart \ 6 | --target=integration_test/integration_test.dart \ 7 | --flavor=full 8 | --------------------------------------------------------------------------------