├── .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 |
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