├── .gitignore ├── .idea ├── .gitignore ├── .name ├── compiler.xml ├── gradle.xml ├── kotlinc.xml ├── misc.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── mrntlu │ │ └── projectconsumer │ │ ├── HiltApplication.kt │ │ ├── MainActivity.kt │ │ ├── adapters │ │ ├── AnimeRecommendationsAdapter.kt │ │ ├── AnimeRelationContentAdapter.kt │ │ ├── AnimeRelationsAdapter.kt │ │ ├── BaseGridPaginationAdapter.kt │ │ ├── CalendarAdapter.kt │ │ ├── ConsumeLaterAdapter.kt │ │ ├── ConsumeLaterPreviewAdapter.kt │ │ ├── ContentAdapter.kt │ │ ├── DetailsAdapter.kt │ │ ├── DiaryAdapter.kt │ │ ├── DiffUtilCallback.kt │ │ ├── DiscoverAdapter.kt │ │ ├── FilterAdapter.kt │ │ ├── FriendsAdapter.kt │ │ ├── GamePlatformAdapter.kt │ │ ├── GameRelationsAdapter.kt │ │ ├── GenreAdapter.kt │ │ ├── LegendContentAdapter.kt │ │ ├── LikeUserStackAdapter.kt │ │ ├── NameUrlAdapter.kt │ │ ├── PremiumAdapter.kt │ │ ├── PreviewAdapter.kt │ │ ├── ProfileImageAdapter.kt │ │ ├── RecommendationsAdapter.kt │ │ ├── RequestsAdapter.kt │ │ ├── ReviewAdapter.kt │ │ ├── ReviewPreviewAdapter.kt │ │ ├── ReviewWithContentAdapter.kt │ │ ├── SeasonAdapter.kt │ │ ├── StreamingAdapter.kt │ │ ├── SuggestionsAdapter.kt │ │ ├── UserListAdapter.kt │ │ ├── decorations │ │ │ ├── BulletItemDecoration.kt │ │ │ ├── LinearHorizontalSpacingDecoration.kt │ │ │ └── OverlapDecoration.kt │ │ └── viewholders │ │ │ ├── EmptyHorizontalViewHolder.kt │ │ │ ├── EmptyViewHolder.kt │ │ │ ├── ErrorViewHolder.kt │ │ │ ├── LoadingViewHolder.kt │ │ │ ├── PaginationExhaustViewHolder.kt │ │ │ ├── PaginationLoadingViewHolder.kt │ │ │ └── PreviewErrorViewHolder.kt │ │ ├── di │ │ ├── HiltModule.kt │ │ └── SingletonModule.kt │ │ ├── interfaces │ │ ├── AISuggestionsInteraction.kt │ │ ├── BaseViewHolderInterfaces.kt │ │ ├── ConnectivityObserver.kt │ │ ├── ConsumeLaterInteraction.kt │ │ ├── ContentModel.kt │ │ ├── DetailsModel.kt │ │ ├── DiffUtilComparison.kt │ │ ├── DiscoverOnBottomSheet.kt │ │ ├── EntityMapper.kt │ │ ├── FriendRequestInteraction.kt │ │ ├── Interaction.kt │ │ ├── OnBottomSheetClosed.kt │ │ ├── ReviewInteraction.kt │ │ ├── UserListContentModel.kt │ │ ├── UserListInteraction.kt │ │ └── UserListModel.kt │ │ ├── models │ │ ├── auth │ │ │ ├── BasicUserInfo.kt │ │ │ ├── FriendRequest.kt │ │ │ ├── UserInfo.kt │ │ │ ├── UserInfoCommon.kt │ │ │ └── retrofit │ │ │ │ ├── AnswerFriendRequestBody.kt │ │ │ │ ├── ForgotPasswordBody.kt │ │ │ │ ├── GoogleLoginBody.kt │ │ │ │ ├── LoginBody.kt │ │ │ │ ├── LoginResponse.kt │ │ │ │ ├── RegisterBody.kt │ │ │ │ ├── UpdateFCMTokenBody.kt │ │ │ │ ├── UpdateMembershipBody.kt │ │ │ │ ├── UpdateNotification.kt │ │ │ │ ├── UpdatePassword.kt │ │ │ │ ├── UpdateUserImageBody.kt │ │ │ │ └── UpdateUsernameBody.kt │ │ ├── common │ │ │ ├── AISuggestion.kt │ │ │ ├── AISuggestionResponse.kt │ │ │ ├── Actor.kt │ │ │ ├── BackendRequestMapper.kt │ │ │ ├── CalendarUI.kt │ │ │ ├── DetailsUI.kt │ │ │ ├── GamePlatformUI.kt │ │ │ ├── GenreUI.kt │ │ │ ├── LogsUI.kt │ │ │ ├── ProductionAndCompany.kt │ │ │ ├── Recommendation.kt │ │ │ ├── ReviewSummary.kt │ │ │ ├── Streaming.kt │ │ │ ├── StreamingPlatform.kt │ │ │ ├── Trailer.kt │ │ │ ├── Translation.kt │ │ │ ├── entity │ │ │ │ ├── Converters.kt │ │ │ │ └── TranslationEntity.kt │ │ │ └── retrofit │ │ │ │ ├── DataNullableResponse.kt │ │ │ │ ├── DataPaginationResponse.kt │ │ │ │ ├── DataResponse.kt │ │ │ │ ├── DataSearchPaginationResponse.kt │ │ │ │ ├── DayOfWeekResponse.kt │ │ │ │ ├── ErrorResponse.kt │ │ │ │ ├── IDBody.kt │ │ │ │ ├── MessageResponse.kt │ │ │ │ ├── PaginationResponse.kt │ │ │ │ └── PreviewResponse.kt │ │ └── main │ │ │ ├── anime │ │ │ ├── Anime.kt │ │ │ ├── AnimeAirDate.kt │ │ │ ├── AnimeCharacter.kt │ │ │ ├── AnimeDetails.kt │ │ │ ├── AnimeGenre.kt │ │ │ ├── AnimeNameURL.kt │ │ │ ├── AnimeRecommendation.kt │ │ │ ├── AnimeRelation.kt │ │ │ ├── entity │ │ │ │ ├── AnimeEntity.kt │ │ │ │ └── AnimeTypeConverters.kt │ │ │ └── mapper │ │ │ │ └── AnimeEntityMapper.kt │ │ │ ├── game │ │ │ ├── Game.kt │ │ │ ├── GameDetails.kt │ │ │ ├── GameDetailsRelation.kt │ │ │ ├── GameMetacriticScorePlatform.kt │ │ │ ├── GameRelation.kt │ │ │ ├── GameStore.kt │ │ │ ├── entity │ │ │ │ ├── GameEntity.kt │ │ │ │ └── GameTypeConverters.kt │ │ │ └── mapper │ │ │ │ └── GameEntityMapper.kt │ │ │ ├── movie │ │ │ ├── Movie.kt │ │ │ ├── MovieDetails.kt │ │ │ ├── entity │ │ │ │ ├── MovieEntity.kt │ │ │ │ └── MovieTypeConverters.kt │ │ │ └── mapper │ │ │ │ └── MovieEntityMapper.kt │ │ │ ├── review │ │ │ ├── Author.kt │ │ │ ├── Review.kt │ │ │ ├── ReviewDetails.kt │ │ │ ├── ReviewWithContent.kt │ │ │ └── retrofit │ │ │ │ ├── ReviewBody.kt │ │ │ │ └── UpdateReviewBody.kt │ │ │ ├── tv │ │ │ ├── Network.kt │ │ │ ├── Season.kt │ │ │ ├── TVSeries.kt │ │ │ ├── TVSeriesDetails.kt │ │ │ ├── entity │ │ │ │ ├── NetworkEntity.kt │ │ │ │ ├── TVSeriesEntity.kt │ │ │ │ └── TVSeriesTypeConverters.kt │ │ │ └── mapper │ │ │ │ └── TVSeriesEntityMapper.kt │ │ │ ├── userInteraction │ │ │ ├── ConsumeLater.kt │ │ │ ├── ConsumeLaterResponse.kt │ │ │ ├── entity │ │ │ │ ├── ConsumeLaterEntity.kt │ │ │ │ └── ConsumeLaterTypeConverters.kt │ │ │ ├── mapper │ │ │ │ └── UserInteractionEntityMapper.kt │ │ │ └── retrofit │ │ │ │ ├── ConsumeLaterBody.kt │ │ │ │ └── MarkConsumeLaterBody.kt │ │ │ └── userList │ │ │ ├── AnimeList.kt │ │ │ ├── AnimeWatchList.kt │ │ │ ├── GameList.kt │ │ │ ├── GamePlayList.kt │ │ │ ├── Log.kt │ │ │ ├── LogsByDate.kt │ │ │ ├── MovieList.kt │ │ │ ├── MovieWatchList.kt │ │ │ ├── TVSeriesList.kt │ │ │ ├── TVSeriesWatchList.kt │ │ │ ├── UserList.kt │ │ │ └── retrofit │ │ │ ├── AnimeWatchListBody.kt │ │ │ ├── DeleteUserListBody.kt │ │ │ ├── GamePlayListBody.kt │ │ │ ├── IncrementTVSeriesListBody.kt │ │ │ ├── MovieWatchListBody.kt │ │ │ ├── TVWatchListBody.kt │ │ │ ├── UpdateAnimeWatchListBody.kt │ │ │ ├── UpdateGamePlayListBody.kt │ │ │ ├── UpdateMovieWatchListBody.kt │ │ │ └── UpdateTVWatchListBody.kt │ │ ├── repository │ │ ├── AISuggestionsRepository.kt │ │ ├── AnimePreviewRepository.kt │ │ ├── AnimeRepository.kt │ │ ├── AuthRepository.kt │ │ ├── GamePreviewRepository.kt │ │ ├── GameRepository.kt │ │ ├── MoviePreviewRepository.kt │ │ ├── MovieRepository.kt │ │ ├── PreviewRepository.kt │ │ ├── ReviewRepository.kt │ │ ├── TVPreviewRepository.kt │ │ ├── TVRepository.kt │ │ ├── UserInteractionRepository.kt │ │ ├── UserListRepository.kt │ │ └── UserRepository.kt │ │ ├── service │ │ ├── AuthAuthenticator.kt │ │ ├── AuthInterceptor.kt │ │ ├── TokenManager.kt │ │ ├── notification │ │ │ └── FirebaseMessagingService.kt │ │ ├── retrofit │ │ │ ├── AISuggestionApiService.kt │ │ │ ├── AnimeApiService.kt │ │ │ ├── AuthApiService.kt │ │ │ ├── GameApiService.kt │ │ │ ├── MovieApiService.kt │ │ │ ├── PreviewApiService.kt │ │ │ ├── ReviewApiService.kt │ │ │ ├── TVSeriesApiService.kt │ │ │ ├── UserApiService.kt │ │ │ ├── UserInteractionApiService.kt │ │ │ └── UserListApiService.kt │ │ └── room │ │ │ ├── AnimeDao.kt │ │ │ ├── CacheDatabase.kt │ │ │ ├── GameDao.kt │ │ │ ├── MovieDao.kt │ │ │ ├── TVSeriesDao.kt │ │ │ └── UserInteractionDao.kt │ │ ├── ui │ │ ├── BaseDayOfWeekFragment.kt │ │ ├── BaseDetailsFragment.kt │ │ ├── BaseFragment.kt │ │ ├── BaseListFragment.kt │ │ ├── BaseProfileFragment.kt │ │ ├── anime │ │ │ ├── AnimeDetailsFragment.kt │ │ │ └── AnimeListFragment.kt │ │ ├── auth │ │ │ ├── AuthFragment.kt │ │ │ ├── ForgotPasswordBottomSheet.kt │ │ │ └── RegisterFragment.kt │ │ ├── common │ │ │ ├── AnimeDayOfWeekFragment.kt │ │ │ ├── BoardingBottomSheet.kt │ │ │ ├── ChangeLayoutBottomSheet.kt │ │ │ ├── ChangeTabLayoutBottomSheet.kt │ │ │ ├── ConsumeLaterFragment.kt │ │ │ ├── HomeFragment.kt │ │ │ ├── ImageFragment.kt │ │ │ ├── PolicyFragment.kt │ │ │ ├── PremiumBottomSheet.kt │ │ │ ├── SearchFragment.kt │ │ │ ├── SettingsFragment.kt │ │ │ ├── TVSeriesDayOfWeekFragment.kt │ │ │ └── TrailerFragment.kt │ │ ├── compose │ │ │ ├── LoadingShimmer.kt │ │ │ ├── PaginationLoadingShimmer.kt │ │ │ └── ShimmerBrush.kt │ │ ├── dialog │ │ │ ├── LoadingDialog.kt │ │ │ └── SuccessDialog.kt │ │ ├── discover │ │ │ ├── AISuggestionsFragment.kt │ │ │ ├── DiscoverBottomSheet.kt │ │ │ └── DiscoverListFragment.kt │ │ ├── game │ │ │ ├── GameDetailsFragment.kt │ │ │ └── GameListFragment.kt │ │ ├── movie │ │ │ ├── MovieDetailsFragment.kt │ │ │ └── MovieListFragment.kt │ │ ├── profile │ │ │ ├── DiaryFragment.kt │ │ │ ├── ProfileDisplayFragment.kt │ │ │ ├── ProfileEditBottomSheet.kt │ │ │ ├── ProfileFragment.kt │ │ │ ├── UserListBottomSheet.kt │ │ │ └── UserListFragment.kt │ │ ├── review │ │ │ ├── ReviewCreateFragment.kt │ │ │ ├── ReviewDetailsFragment.kt │ │ │ ├── ReviewFragment.kt │ │ │ └── ReviewListUserFragment.kt │ │ ├── social │ │ │ ├── AddFriendBottomSheet.kt │ │ │ ├── RequestsFragment.kt │ │ │ └── SocialHubFragment.kt │ │ └── tv │ │ │ ├── TVSeriesDetailsFragment.kt │ │ │ └── TVSeriesListFragment.kt │ │ ├── utils │ │ ├── Extensions.kt │ │ ├── FetchType.kt │ │ ├── MessageBoxType.kt │ │ ├── NetworkBoundResource.kt │ │ ├── NetworkConnectivityObserver.kt │ │ ├── NetworkListResponse.kt │ │ ├── NetworkResponse.kt │ │ ├── NetworkResponseFlow.kt │ │ ├── Operation.kt │ │ ├── Orientation.kt │ │ ├── RecyclerViewEnum.kt │ │ ├── SafeClickListener.kt │ │ └── Utils.kt │ │ └── viewmodels │ │ ├── auth │ │ ├── LoginViewModel.kt │ │ └── RegisterViewModel.kt │ │ ├── main │ │ ├── anime │ │ │ ├── AnimeDetailsViewModel.kt │ │ │ ├── AnimePreviewViewModel.kt │ │ │ └── AnimeViewModel.kt │ │ ├── common │ │ │ ├── AISuggestionsConsumeLaterViewModel.kt │ │ │ ├── AISuggestionsViewModel.kt │ │ │ ├── DayOfWeekViewModel.kt │ │ │ ├── DetailsConsumeLaterViewModel.kt │ │ │ ├── PreviewViewModel.kt │ │ │ └── SettingsViewModel.kt │ │ ├── discover │ │ │ ├── DiscoverListViewModel.kt │ │ │ └── SearchViewModel.kt │ │ ├── game │ │ │ ├── GameDetailsViewModel.kt │ │ │ ├── GamePreviewViewModel.kt │ │ │ └── GameViewModel.kt │ │ ├── movie │ │ │ ├── MovieDetailsViewModel.kt │ │ │ ├── MoviePreviewViewModel.kt │ │ │ └── MovieViewModel.kt │ │ ├── profile │ │ │ ├── ConsumeLaterViewModel.kt │ │ │ ├── DiaryViewModel.kt │ │ │ ├── ProfileDisplayViewModel.kt │ │ │ ├── ProfileViewModel.kt │ │ │ ├── UserListBottomSheetViewModel.kt │ │ │ └── UserListViewModel.kt │ │ ├── review │ │ │ ├── ReviewCreateViewModel.kt │ │ │ ├── ReviewDetailsViewModel.kt │ │ │ ├── ReviewListUserViewModel.kt │ │ │ └── ReviewViewModel.kt │ │ ├── social │ │ │ ├── RequestsViewModel.kt │ │ │ └── SocialHubViewModel.kt │ │ └── tv │ │ │ ├── TVDetailsViewModel.kt │ │ │ ├── TVPreviewViewModel.kt │ │ │ └── TVSeriesViewModel.kt │ │ └── shared │ │ ├── ActivitySharedViewModel.kt │ │ ├── HomeDiscoverSharedViewModel.kt │ │ └── UserSharedViewModel.kt │ └── res │ ├── anim │ ├── slide_in_left.xml │ ├── slide_in_right.xml │ ├── slide_out_left.xml │ └── slide_out_right.xml │ ├── color │ └── tab_text_selector.xml │ ├── drawable │ ├── bottom_nav_background.xml │ ├── bottom_nav_selector.xml │ ├── bottom_nav_text_selector.xml │ ├── custom_popup_background.xml │ ├── highlight_bg.xml │ ├── home_24.xml │ ├── home_filled_24.xml │ ├── ic_add.xml │ ├── ic_ai.xml │ ├── ic_anime.xml │ ├── ic_arrow.xml │ ├── ic_arrow_back_24.xml │ ├── ic_arrow_right_24.xml │ ├── ic_arrow_settings.xml │ ├── ic_bookmark.xml │ ├── ic_bookmark_filled.xml │ ├── ic_cancel.xml │ ├── ic_circle_12.xml │ ├── ic_company_75.xml │ ├── ic_content_type_24.xml │ ├── ic_country.xml │ ├── ic_day_24.xml │ ├── ic_delete.xml │ ├── ic_diary.xml │ ├── ic_edit.xml │ ├── ic_explore.xml │ ├── ic_explore_outlined.xml │ ├── ic_feedback.xml │ ├── ic_filter_48.xml │ ├── ic_finish_24.xml │ ├── ic_friend_request.xml │ ├── ic_game_24.xml │ ├── ic_google.xml │ ├── ic_grid.xml │ ├── ic_heart.xml │ ├── ic_home.xml │ ├── ic_home_outline.xml │ ├── ic_info_24.xml │ ├── ic_language.xml │ ├── ic_launcher_dark.xml │ ├── ic_launcher_foreground.xml │ ├── ic_launcher_light.xml │ ├── ic_launcher_logo.xml │ ├── ic_like.xml │ ├── ic_like_outline.xml │ ├── ic_list.xml │ ├── ic_log.xml │ ├── ic_login_24.xml │ ├── ic_logout_24.xml │ ├── ic_mail.xml │ ├── ic_more.xml │ ├── ic_night_24.xml │ ├── ic_no_internet_24.xml │ ├── ic_notification_off.xml │ ├── ic_notification_off_24.xml │ ├── ic_notification_on_24.xml │ ├── ic_people.xml │ ├── ic_person_64.xml │ ├── ic_person_75.xml │ ├── ic_person_bottom.xml │ ├── ic_person_outlined.xml │ ├── ic_play.xml │ ├── ic_rate.xml │ ├── ic_refresh.xml │ ├── ic_remove.xml │ ├── ic_remove_heart.xml │ ├── ic_restore.xml │ ├── ic_round_check.xml │ ├── ic_search.xml │ ├── ic_settings_64.xml │ ├── ic_settings_outlined.xml │ ├── ic_share.xml │ ├── ic_sort_48.xml │ ├── ic_star_36.xml │ ├── ic_star_48.xml │ ├── ic_storage.xml │ ├── ic_tab_24.xml │ ├── ic_thumb.xml │ ├── ic_time_24.xml │ ├── ic_trash.xml │ ├── ic_tv.xml │ ├── ic_x.xml │ ├── linux.xml │ ├── nintendo.xml │ ├── nintendo_switch.xml │ ├── notification_switch_thumb.xml │ ├── notification_switch_track.xml │ ├── ps4.xml │ ├── ps5.xml │ ├── selector_discover.xml │ ├── selector_home.xml │ ├── selector_person.xml │ ├── selector_settings.xml │ ├── steam.xml │ ├── switch_thumb_notification_off.xml │ ├── switch_thumb_notification_on.xml │ ├── tab_background.xml │ ├── tab_background_selector.xml │ ├── tab_selected_background.xml │ ├── theme_switch_thumb.xml │ ├── theme_switch_track.xml │ ├── top_rounded_corners.xml │ └── xbox.xml │ ├── layout │ ├── activity_main.xml │ ├── cell_anime_relation.xml │ ├── cell_anime_relation_content.xml │ ├── cell_calendar.xml │ ├── cell_carousel.xml │ ├── cell_carousel_error.xml │ ├── cell_carousel_shimmer.xml │ ├── cell_consume_later.xml │ ├── cell_consume_later_empty.xml │ ├── cell_consume_later_loading.xml │ ├── cell_consume_later_preview.xml │ ├── cell_content_alt.xml │ ├── cell_content_alt_loading.xml │ ├── cell_details.xml │ ├── cell_diary.xml │ ├── cell_diary_header.xml │ ├── cell_empty.xml │ ├── cell_empty_horizontal.xml │ ├── cell_error.xml │ ├── cell_filter.xml │ ├── cell_friend.xml │ ├── cell_friend_loading.xml │ ├── cell_friend_request.xml │ ├── cell_friend_request_loading.xml │ ├── cell_genre.xml │ ├── cell_grid.xml │ ├── cell_legend_content.xml │ ├── cell_loading.xml │ ├── cell_name_url.xml │ ├── cell_pagination_exhaust.xml │ ├── cell_pagination_loading.xml │ ├── cell_premium.xml │ ├── cell_preview_error.xml │ ├── cell_preview_item.xml │ ├── cell_profile_image.xml │ ├── cell_review.xml │ ├── cell_review_content.xml │ ├── cell_review_content_loading.xml │ ├── cell_review_content_preview.xml │ ├── cell_review_loading.xml │ ├── cell_season.xml │ ├── cell_status_tab_layout.xml │ ├── cell_streaming.xml │ ├── cell_streaming_empty.xml │ ├── cell_suggestion.xml │ ├── cell_suggestion_error.xml │ ├── cell_suggestion_loading.xml │ ├── cell_user_list.xml │ ├── cell_user_list_loading.xml │ ├── cell_user_stack.xml │ ├── fragment_ai_suggestions.xml │ ├── fragment_anime_details.xml │ ├── fragment_auth.xml │ ├── fragment_diary.xml │ ├── fragment_game_details.xml │ ├── fragment_home.xml │ ├── fragment_image.xml │ ├── fragment_list.xml │ ├── fragment_movie_details.xml │ ├── fragment_policy.xml │ ├── fragment_preview.xml │ ├── fragment_profile.xml │ ├── fragment_profile_display.xml │ ├── fragment_register.xml │ ├── fragment_review.xml │ ├── fragment_review_create.xml │ ├── fragment_review_details.xml │ ├── fragment_search.xml │ ├── fragment_settings.xml │ ├── fragment_social_hub.xml │ ├── fragment_trailer.xml │ ├── fragment_tv_details.xml │ ├── fragment_user_list.xml │ ├── layout_boarding.xml │ ├── layout_change_layout.xml │ ├── layout_change_tab_layout.xml │ ├── layout_discover_bottom_sheet.xml │ ├── layout_edit_profile_bottom_sheet.xml │ ├── layout_forgot_password.xml │ ├── layout_loading_dialog.xml │ ├── layout_premium.xml │ ├── layout_response_status_bottom_sheet.xml │ ├── layout_review_summary.xml │ ├── layout_score_dialog.xml │ ├── layout_shimmer_anime_details.xml │ ├── layout_shimmer_game_details.xml │ ├── layout_shimmer_movie_details.xml │ ├── layout_shimmer_profile.xml │ ├── layout_shimmer_profile_display.xml │ ├── layout_shimmer_review_details.xml │ ├── layout_shimmer_review_summary.xml │ ├── layout_success_dialog.xml │ ├── layout_tab.xml │ ├── layout_tab_title.xml │ ├── layout_user_interaction.xml │ ├── layout_user_list_bottom_sheet.xml │ ├── layout_user_list_edit_bottom_sheet.xml │ ├── layout_user_list_view_bottom_sheet.xml │ ├── settings_click_tile.xml │ └── settings_info_tile.xml │ ├── menu │ ├── ai_suggestions_menu.xml │ ├── bottom_nav_auth_menu.xml │ ├── bottom_nav_menu.xml │ ├── consume_later_item_menu.xml │ ├── details_share_menu.xml │ ├── filter_consume_later_menu.xml │ ├── profile_display_menu.xml │ ├── profile_menu.xml │ ├── search_toolbar_menu.xml │ ├── social_hub_menu.xml │ ├── sort_dual_menu.xml │ ├── sort_extra_menu.xml │ ├── sort_menu.xml │ ├── sort_toolbar_menu.xml │ ├── user_list_item_menu.xml │ └── user_list_menu.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── navigation │ └── mobile_navigation.xml │ ├── raw │ ├── ai_error.json │ ├── ai_loading.json │ ├── bookmark.json │ ├── bookmark_night.json │ ├── discover.json │ ├── empty.json │ ├── empty_horizontal.json │ ├── error.json │ ├── error_small.json │ ├── like.json │ ├── like_night.json │ ├── loading.json │ ├── no_social.json │ ├── notification_empty.json │ ├── premium.json │ └── success.json │ ├── values-night │ ├── splash.xml │ └── themes.xml │ ├── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── splash.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ └── data_extraction_rules.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | /.idea/codeStyles 11 | 12 | .DS_Store 13 | /build 14 | /captures 15 | .externalNativeBuild 16 | .cxx 17 | local.properties 18 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Project Consumer -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | # API Key 2 | /src/main/java/com/mrntlu/projectconsumer/utils/Constants.kt 3 | 4 | # Gradle files 5 | .gradle/ 6 | build/ 7 | 8 | # Local configuration file (sdk path, etc) 9 | local.properties 10 | 11 | # Log/OS Files 12 | *.log 13 | 14 | # Android Studio generated files and folders 15 | captures/ 16 | .externalNativeBuild/ 17 | .cxx/ 18 | *.apk 19 | output.json 20 | 21 | # IntelliJ 22 | *.iml 23 | .idea/ 24 | misc.xml 25 | deploymentTargetDropDown.xml 26 | render.experimental.xml 27 | 28 | # Keystore files 29 | *.jks 30 | *.keystore 31 | 32 | # Android Profiling 33 | *.hprof\ 34 | 35 | google-services.json -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrNtlu/Project-Consumer-Android/aa65b12e0178546b1a2a955213aaa4829e46eafe/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/DiffUtilCallback.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import com.mrntlu.projectconsumer.interfaces.DiffUtilComparison 5 | 6 | class DiffUtilCallback>( 7 | private val oldList: List, 8 | private val newList: List, 9 | ): DiffUtil.Callback() { 10 | override fun getOldListSize() = oldList.size 11 | 12 | override fun getNewListSize() = newList.size 13 | 14 | override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { 15 | return oldList[oldItemPosition].areItemsTheSame(newList[newItemPosition]) 16 | } 17 | 18 | override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { 19 | return oldList[oldItemPosition].areContentsTheSame(newList[newItemPosition]) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/GenreAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.mrntlu.projectconsumer.databinding.CellGenreBinding 7 | import com.mrntlu.projectconsumer.utils.setSafeOnClickListener 8 | 9 | class GenreAdapter( 10 | private val genreList: List, 11 | private val onClick: (Int) -> Unit, 12 | ): RecyclerView.Adapter() { 13 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder { 14 | return ItemHolder(CellGenreBinding.inflate(LayoutInflater.from(parent.context), parent, false)) 15 | } 16 | 17 | override fun getItemCount() = genreList.size 18 | 19 | override fun onBindViewHolder(holder: ItemHolder, position: Int) { 20 | val genre = genreList[position] 21 | 22 | holder.binding.genreTV.text = genre 23 | 24 | holder.binding.root.setSafeOnClickListener { 25 | onClick(position) 26 | } 27 | } 28 | 29 | inner class ItemHolder( 30 | val binding: CellGenreBinding 31 | ): RecyclerView.ViewHolder(binding.root) 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/decorations/LinearHorizontalSpacingDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.decorations 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.annotation.Px 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | class LinearHorizontalSpacingDecoration(@Px private val innerSpacing: Int) : 9 | RecyclerView.ItemDecoration() { 10 | 11 | override fun getItemOffsets( 12 | outRect: Rect, 13 | view: View, 14 | parent: RecyclerView, 15 | state: RecyclerView.State 16 | ) { 17 | super.getItemOffsets(outRect, view, parent, state) 18 | 19 | val itemPosition = parent.getChildAdapterPosition(view) 20 | 21 | outRect.left = if (itemPosition == 0) 0 else innerSpacing / 2 22 | outRect.right = if (itemPosition == state.itemCount - 1) 0 else innerSpacing / 2 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/decorations/OverlapDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.decorations 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.RecyclerView 6 | import androidx.recyclerview.widget.RecyclerView.ItemDecoration 7 | 8 | class OverlapDecoration : ItemDecoration() { 9 | 10 | override fun getItemOffsets( 11 | outRect: Rect, 12 | view: View, 13 | parent: RecyclerView, 14 | state: RecyclerView.State 15 | ) { 16 | super.getItemOffsets(outRect, view, parent, state) 17 | val itemPosition = parent.getChildAdapterPosition(view) 18 | if (itemPosition == 0) { 19 | outRect.set(0, 0, 0, 0) 20 | } else { 21 | outRect.set(overlap, 0, 0, 0) 22 | } 23 | } 24 | 25 | companion object { 26 | private const val overlap = -32 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/EmptyHorizontalViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.mrntlu.projectconsumer.databinding.CellEmptyHorizontalBinding 5 | import com.mrntlu.projectconsumer.utils.dpToPx 6 | 7 | class EmptyHorizontalViewHolder( 8 | private val binding: CellEmptyHorizontalBinding 9 | ): RecyclerView.ViewHolder(binding.root) { 10 | fun setHeight(heightInDp: Float) { 11 | val height = binding.root.context.dpToPx(heightInDp) 12 | 13 | val layoutParams = binding.root.layoutParams 14 | layoutParams.height = height 15 | binding.root.layoutParams = layoutParams 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/EmptyViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.mrntlu.projectconsumer.databinding.CellEmptyBinding 5 | 6 | class EmptyViewHolder( 7 | private val binding: CellEmptyBinding 8 | ): RecyclerView.ViewHolder(binding.root) { 9 | fun changeLottieAnimation(newAnimation: Int) { 10 | binding.emptyLottieAnimation.setAnimation(newAnimation) 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/ErrorViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.mrntlu.projectconsumer.databinding.CellErrorBinding 5 | import com.mrntlu.projectconsumer.interfaces.ErrorViewHolderBind 6 | import com.mrntlu.projectconsumer.interfaces.Interaction 7 | import com.mrntlu.projectconsumer.utils.setVisibilityByCondition 8 | 9 | class ErrorViewHolder( 10 | private val binding: CellErrorBinding, 11 | ): RecyclerView.ViewHolder(binding.root), ErrorViewHolderBind { 12 | override fun bind(errorMessage: String?, interaction: Interaction, shouldHideCancelButton: Boolean) { 13 | binding.errorText.text = errorMessage 14 | 15 | binding.refreshButton.setOnClickListener { interaction.onErrorRefreshPressed() } 16 | binding.cancelButton.setOnClickListener { interaction.onCancelPressed() } 17 | binding.cancelButton.setVisibilityByCondition(shouldHideCancelButton) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/PaginationExhaustViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.mrntlu.projectconsumer.databinding.CellPaginationExhaustBinding 5 | import com.mrntlu.projectconsumer.interfaces.Interaction 6 | import com.mrntlu.projectconsumer.interfaces.PaginationExhaustViewHolderBind 7 | import com.mrntlu.projectconsumer.models.main.movie.Movie 8 | 9 | class PaginationExhaustViewHolder( 10 | private val binding: CellPaginationExhaustBinding 11 | ): RecyclerView.ViewHolder(binding.root), PaginationExhaustViewHolderBind { 12 | override fun bind(interaction: Interaction) { 13 | binding.backToTopButton.setOnClickListener { interaction.onExhaustButtonPressed() } 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/PaginationLoadingViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.compose.ui.platform.ViewCompositionStrategy 4 | import androidx.recyclerview.widget.RecyclerView 5 | import com.mrntlu.projectconsumer.databinding.CellPaginationLoadingBinding 6 | import com.mrntlu.projectconsumer.interfaces.PaginationLoadingViewHolderBind 7 | import com.mrntlu.projectconsumer.ui.compose.PaginationLoadingShimmer 8 | import com.mrntlu.projectconsumer.utils.Constants 9 | 10 | class PaginationLoadingViewHolder(private val binding: CellPaginationLoadingBinding): RecyclerView.ViewHolder(binding.root), PaginationLoadingViewHolderBind { 11 | override fun bind(gridCount: Int, aspectRatio: Float?, isDarkTheme: Boolean) { 12 | binding.paginationLoadingComposeView.apply { 13 | setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) 14 | setContent { 15 | PaginationLoadingShimmer( 16 | gridCount = gridCount, 17 | aspectRatio = aspectRatio ?: Constants.DEFAULT_RATIO, 18 | isDarkTheme = isDarkTheme 19 | ) 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/adapters/viewholders/PreviewErrorViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.adapters.viewholders 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.mrntlu.projectconsumer.databinding.CellPreviewErrorBinding 5 | import com.mrntlu.projectconsumer.interfaces.ErrorViewHolderBind 6 | import com.mrntlu.projectconsumer.interfaces.Interaction 7 | 8 | class PreviewErrorViewHolder( 9 | private val binding: CellPreviewErrorBinding, 10 | ): RecyclerView.ViewHolder(binding.root), ErrorViewHolderBind { 11 | override fun bind(errorMessage: String?, interaction: Interaction, shouldHideCancelButton: Boolean) { 12 | binding.errorText.text = errorMessage 13 | 14 | binding.refreshButton.setOnClickListener { interaction.onErrorRefreshPressed() } 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/AISuggestionsInteraction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.common.AISuggestion 4 | 5 | interface AISuggestionsInteraction: Interaction { 6 | fun onAddToListPressed(item: AISuggestion, position: Int) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/BaseViewHolderInterfaces.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface ItemViewHolderBind { 4 | fun bind(item: T, position: Int, interaction: Interaction) 5 | } 6 | 7 | interface ErrorViewHolderBind { 8 | fun bind(errorMessage: String?, interaction: Interaction, shouldHideCancelButton: Boolean = false) 9 | } 10 | 11 | interface LoadingViewHolderBind { 12 | fun bind(aspectRatio: Float?, isDarkTheme: Boolean, isPreview: Boolean) 13 | } 14 | 15 | interface PaginationLoadingViewHolderBind { 16 | fun bind(gridCount: Int, aspectRatio: Float?, isDarkTheme: Boolean) 17 | } 18 | 19 | interface PaginationExhaustViewHolderBind { 20 | fun bind(interaction: Interaction) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/ConnectivityObserver.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | 5 | interface ConnectivityObserver { 6 | fun observe(): Flow 7 | 8 | enum class Status { 9 | Available, Unavailable, Lost 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/ConsumeLaterInteraction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.main.userInteraction.ConsumeLaterResponse 4 | 5 | interface ConsumeLaterInteraction: Interaction { 6 | fun onDeletePressed(item: ConsumeLaterResponse, position: Int) 7 | fun onAddToListPressed(item: ConsumeLaterResponse, position: Int) 8 | fun onDiscoverButtonPressed() 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/ContentModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.main.anime.AnimeAirDate 4 | 5 | abstract class ContentModel: DiffUtilComparison { 6 | abstract val id: String 7 | abstract val imageURL: String 8 | abstract val title: String 9 | abstract val titleOriginal: String 10 | abstract val description: String 11 | abstract val score: Float 12 | abstract val releaseDate: String? 13 | abstract val episodes: Int? 14 | abstract val totalSeasons: Int? 15 | abstract val length: Int? 16 | abstract val aired: AnimeAirDate? 17 | 18 | override fun areItemsTheSame(newItem: ContentModel): Boolean { 19 | return id == newItem.id 20 | } 21 | 22 | override fun areContentsTheSame(newItem: ContentModel): Boolean { 23 | return when { 24 | id != newItem.id -> false 25 | imageURL != newItem.imageURL -> false 26 | title != newItem.title -> false 27 | titleOriginal != newItem.titleOriginal -> false 28 | else -> true 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/DetailsModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.main.userInteraction.ConsumeLater 4 | 5 | abstract class DetailsModel { 6 | abstract var watchList: WatchList? 7 | abstract var consumeLater: ConsumeLater? 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/DiffUtilComparison.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface DiffUtilComparison { 4 | fun areItemsTheSame(newItem: Model): Boolean 5 | 6 | fun areContentsTheSame(newItem: Model): Boolean 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/DiscoverOnBottomSheet.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface DiscoverOnBottomSheet { 4 | fun onApply( 5 | genre: String?, 6 | status: String?, 7 | sort: String, 8 | from: Int?, 9 | to: Int?, 10 | animeTheme: String?, 11 | animeDemographics: String?, 12 | gameTBA: Boolean?, 13 | gamePlatform: String?, 14 | ) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/EntityMapper.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface EntityMapper { 4 | 5 | fun asEntity( 6 | model: Model, tag: String, page: Int, 7 | ): Entity 8 | 9 | fun asModel(entity: Entity): Model 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/FriendRequestInteraction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.auth.FriendRequest 4 | 5 | interface FriendRequestInteraction: Interaction { 6 | fun onAcceptClicked(item: FriendRequest, position: Int) 7 | fun onIgnoreClicked(item: FriendRequest, position: Int) 8 | fun onDenyClicked(item: FriendRequest, position: Int) 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/Interaction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface Interaction { 4 | fun onItemSelected(item: T, position: Int) 5 | 6 | fun onErrorRefreshPressed() 7 | fun onCancelPressed() 8 | fun onExhaustButtonPressed() 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/OnBottomSheetClosed.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | interface OnBottomSheetClosed { 4 | fun onSuccess(data: UserListModel?, operation: BottomSheetOperation) 5 | } 6 | 7 | enum class BottomSheetOperation { 8 | INSERT, 9 | UPDATE, 10 | DELETE 11 | } 12 | 13 | enum class BottomSheetState { 14 | VIEW, 15 | EDIT, 16 | SUCCESS, 17 | FAILURE, 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/ReviewInteraction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.main.review.Review 4 | import com.mrntlu.projectconsumer.models.main.review.ReviewWithContent 5 | 6 | interface ReviewInteraction: Interaction { 7 | fun onEditClicked(item: Review, position: Int) 8 | fun onDeleteClicked(item: Review, position: Int) 9 | fun onLikeClicked(item: Review, position: Int) 10 | fun onProfileClicked(item: Review, position: Int) 11 | } 12 | 13 | interface ReviewWithContentInteraction: Interaction { 14 | fun onEditClicked(item: ReviewWithContent, position: Int) 15 | fun onDeleteClicked(item: ReviewWithContent, position: Int) 16 | fun onLikeClicked(item: ReviewWithContent, position: Int) 17 | fun onContentClicked(item: ReviewWithContent, position: Int) 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/interfaces/UserListInteraction.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.interfaces 2 | 3 | import com.mrntlu.projectconsumer.models.main.userList.UserList 4 | import com.mrntlu.projectconsumer.utils.Constants 5 | 6 | interface UserListInteraction: Interaction { 7 | fun onDeletePressed(item: UserList, contentType: Constants.ContentType, position: Int) 8 | fun onUpdatePressed(item: UserList, contentType: Constants.ContentType, position: Int) 9 | fun onDetailsPressed(item: UserList, contentType: Constants.ContentType, position: Int) 10 | fun onEpisodeIncrementPressed(item: UserList, contentType: Constants.ContentType, position: Int) 11 | fun onSeasonIncrementPressed(item: UserList, contentType: Constants.ContentType, position: Int) 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/BasicUserInfo.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class BasicUserInfo( 6 | @SerializedName("fcm_token") 7 | val fcmToken: String, 8 | 9 | @SerializedName("is_oauth") 10 | val isOAuth: Boolean, 11 | 12 | @SerializedName("is_premium") 13 | val isPremium: Boolean, 14 | 15 | @SerializedName("membership_type") 16 | val membershipType: Int, 17 | 18 | @SerializedName("oauth_type") 19 | val oauthType: Int?, 20 | 21 | @SerializedName("can_change_username") 22 | var canChangeUsername: Boolean, 23 | 24 | @SerializedName("app_notification") 25 | val appNotification: Notification, 26 | 27 | val email: String, 28 | val image: String?, 29 | val username: String 30 | ) 31 | 32 | data class Notification( 33 | @SerializedName("friend_request") 34 | var friendRequest: Boolean, 35 | 36 | @SerializedName("review_likes") 37 | var reviewLikes: Boolean 38 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/FriendRequest.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.DiffUtilComparison 5 | import com.mrntlu.projectconsumer.models.main.review.Author 6 | 7 | data class FriendRequest( 8 | @SerializedName("_id") 9 | val id: String, 10 | 11 | @SerializedName("is_ignored") 12 | val isIgnored: Boolean, 13 | 14 | @SerializedName("created_at") 15 | val createdAt: String, 16 | 17 | val sender: Author, 18 | val receiver: Author, 19 | ): DiffUtilComparison { 20 | override fun areItemsTheSame(newItem: FriendRequest): Boolean { 21 | return id == newItem.id 22 | } 23 | 24 | override fun areContentsTheSame(newItem: FriendRequest): Boolean { 25 | return when { 26 | id != newItem.id -> false 27 | isIgnored != newItem.isIgnored -> false 28 | sender.id != newItem.sender.id -> false 29 | receiver.id != newItem.receiver.id -> false 30 | else -> true 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/UserInfoCommon.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.ContentModel 5 | import com.mrntlu.projectconsumer.models.main.anime.AnimeAirDate 6 | 7 | data class UserInfoCommon( 8 | @SerializedName("_id") 9 | override val id: String, 10 | 11 | @SerializedName("image_url") 12 | override val imageURL: String, 13 | 14 | @SerializedName("title_en") 15 | override val title: String, 16 | 17 | @SerializedName("title_original") 18 | override val titleOriginal: String, 19 | 20 | @SerializedName("times_finished") 21 | val timesFinished: Int, 22 | 23 | @SerializedName("content_type") 24 | val contentType: String, 25 | 26 | @SerializedName("hours_played") 27 | val hoursPlayed: Long?, 28 | 29 | override val description: String = "", 30 | override val score: Float = 0f, 31 | override val releaseDate: String? = null, 32 | override val episodes: Int? = null, 33 | override val totalSeasons: Int? = null, 34 | override val length: Int? = null, 35 | override val aired: AnimeAirDate? = null, 36 | ): ContentModel() 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/AnswerFriendRequestBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | data class AnswerFriendRequestBody( 4 | val id: String, 5 | val answer: Int, 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/ForgotPasswordBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ForgotPasswordBody( 6 | @SerializedName("email_address") 7 | private val email: String 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/GoogleLoginBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class GoogleLoginBody( 6 | val token: String, 7 | 8 | val image: String, 9 | 10 | @SerializedName("fcm_token") 11 | val fcmToken: String, 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/LoginBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class LoginBody( 6 | @SerializedName("email_address") 7 | val email: String, 8 | 9 | @SerializedName("fcm_token") 10 | val fcmToken: String?, 11 | 12 | val password: String 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/LoginResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class LoginResponse( 6 | @SerializedName("access_token") 7 | val token: String, 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/RegisterBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class RegisterBody( 6 | @SerializedName("email_address") 7 | val email: String, 8 | 9 | @SerializedName("fcm_token") 10 | val fcmToken: String, 11 | 12 | val username: String, 13 | val password: String, 14 | val image: String, 15 | ) 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdateFCMTokenBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateFCMTokenBody( 6 | @SerializedName("fcm_token") 7 | val fcmToken: String, 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdateMembershipBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateMembershipBody( 6 | @SerializedName("is_premium") 7 | val isPremium: Boolean, 8 | 9 | @SerializedName("membership_type") 10 | val membershipType: Int 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdateNotification.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateNotification( 6 | @SerializedName("friend_request") 7 | val friendRequest: Boolean, 8 | 9 | @SerializedName("review_likes") 10 | val reviewLikes: Boolean, 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdatePassword.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdatePassword( 6 | @SerializedName("old_password") 7 | val oldPassword: String, 8 | 9 | @SerializedName("new_password") 10 | val newPassword: String, 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdateUserImageBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | data class UpdateUserImageBody( 4 | val image: String, 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/auth/retrofit/UpdateUsernameBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.auth.retrofit 2 | 3 | data class UpdateUsernameBody( 4 | val username: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/AISuggestionResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class AISuggestionResponse( 6 | val suggestions: List, 7 | 8 | @SerializedName("created_at") 9 | val createdAt: String, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/Actor.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Actor( 9 | @SerializedName("tmdb_id") 10 | val tmdbID: String, 11 | 12 | val name: String, 13 | val image: String?, 14 | val character: String, 15 | ) : Parcelable { 16 | constructor(): this("", "", "", "") 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/BackendRequestMapper.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | data class BackendRequestMapper( 4 | val name: String, 5 | val request: String, 6 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/CalendarUI.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import java.time.LocalDate 4 | 5 | data class CalendarUI( 6 | val date: LocalDate, 7 | val count: Int, 8 | ) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/DetailsUI.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | data class DetailsUI( 4 | val title: String, 5 | val image: String, 6 | val subTitle: String, 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/GamePlatformUI.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | data class GamePlatformUI( 4 | val requestMapper: BackendRequestMapper, 5 | val image: Int, 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/GenreUI.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | data class GenreUI( 4 | val genre: String, 5 | val image: String 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/LogsUI.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import com.mrntlu.projectconsumer.models.main.userList.Log 4 | 5 | data class LogsUI( 6 | val log: Log, 7 | val isHeader: Boolean, 8 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/ProductionAndCompany.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class ProductionAndCompany( 9 | val logo: String?, 10 | val name: String, 11 | @SerializedName("origin_country") 12 | val originCountry: String 13 | ) : Parcelable { 14 | constructor(): this("", "", "") 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/Recommendation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Recommendation( 9 | val description: String, 10 | 11 | @SerializedName("tmdb_id") 12 | val tmdbID: String, 13 | 14 | @SerializedName("title_en") 15 | val title: String, 16 | 17 | @SerializedName("title_original") 18 | val titleOriginal: String, 19 | 20 | @SerializedName("release_date") 21 | val releaseDate: String, 22 | 23 | @SerializedName("image_url") 24 | val imageURL: String, 25 | ) : Parcelable 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/ReviewSummary.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.mrntlu.projectconsumer.models.main.review.Review 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class ReviewSummary( 10 | val review: Review?, 11 | 12 | @SerializedName("avg_star") 13 | val averageStar: Float, 14 | 15 | @SerializedName("total_votes") 16 | val totalVotes: Int, 17 | 18 | @SerializedName("is_reviewed") 19 | val isReviewed: Boolean, 20 | 21 | @SerializedName("star_counts") 22 | val starCounts: StarCounts, 23 | ): Parcelable { 24 | constructor(): this(null, 0f, 0, false, StarCounts()) 25 | } 26 | 27 | @Parcelize 28 | data class StarCounts( 29 | @SerializedName("one_star") 30 | val oneStar: Int, 31 | 32 | @SerializedName("two_star") 33 | val twoStar: Int, 34 | 35 | @SerializedName("three_star") 36 | val threeStar: Int, 37 | 38 | @SerializedName("four_star") 39 | val fourStar: Int, 40 | 41 | @SerializedName("five_star") 42 | val fiveStar: Int, 43 | ): Parcelable { 44 | constructor(): this(0, 0, 0, 0, 0) 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/Streaming.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Streaming( 6 | @SerializedName("buy_options") 7 | val buyOptions: List?, 8 | @SerializedName("country_code") 9 | val countryCode: String, 10 | @SerializedName("rent_options") 11 | val rentOptions: List?, 12 | @SerializedName("streaming_platforms") 13 | val streamingPlatforms: List? 14 | ) { 15 | constructor(): this(listOf(), "", listOf(), listOf()) 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/StreamingPlatform.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class StreamingPlatform( 8 | val logo: String, 9 | val name: String 10 | ) : Parcelable { 11 | constructor(): this("", "") 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/Trailer.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class Trailer( 8 | val name: String, 9 | val key: String, 10 | val type: String, 11 | ): Parcelable { 12 | constructor(): this("", "", "") 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/Translation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class Translation( 9 | @SerializedName("lan_code") 10 | val lanCode: String, 11 | @SerializedName("lan_name") 12 | val lanName: String, 13 | @SerializedName("lan_name_en") 14 | val lanNameEn: String, 15 | val title: String, 16 | val description: String, 17 | ) : Parcelable { 18 | constructor(): this("","","","","") 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/entity/TranslationEntity.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.entity 2 | 3 | import androidx.room.ColumnInfo 4 | 5 | data class TranslationEntity( 6 | @ColumnInfo("lan_code") 7 | val lanCode: String, 8 | @ColumnInfo("lan_name") 9 | val lanName: String, 10 | @ColumnInfo("lan_name_en") 11 | val lanNameEn: String, 12 | val title: String, 13 | val description: String, 14 | ) { 15 | constructor(): this("","","","","") 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/DataNullableResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class DataNullableResponse( 4 | val data: T? 5 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/DataPaginationResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class DataPaginationResponse( 4 | val data: List, 5 | val pagination: PaginationResponse 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/DataResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class DataResponse( 4 | val data: T 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/DataSearchPaginationResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class DataSearchPaginationResponse( 4 | val data: List?, 5 | val pagination: PaginationResponse 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/DayOfWeekResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class DayOfWeekResponse( 6 | val data: List, 7 | 8 | @SerializedName("day_of_week") 9 | val dayOfWeek: Int, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/ErrorResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ErrorResponse( 6 | val code: Int, 7 | val message: String 8 | ) 9 | 10 | data class ErrorAltResponse( 11 | @SerializedName("error") 12 | val error: String 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/IDBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class IDBody( 4 | val id: String 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/MessageResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class MessageResponse( 4 | val message: String, 5 | ) 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/PaginationResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | data class PaginationResponse( 4 | val next: Int, 5 | val page: Int, 6 | val perPage: Int, 7 | val prev: Int, 8 | val total: Int, 9 | val totalPage: Int 10 | ) { 11 | constructor(): this(0,0,0,0,0,0) 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/common/retrofit/PreviewResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.common.retrofit 2 | 3 | import com.mrntlu.projectconsumer.models.main.anime.Anime 4 | import com.mrntlu.projectconsumer.models.main.game.Game 5 | import com.mrntlu.projectconsumer.models.main.movie.Movie 6 | import com.mrntlu.projectconsumer.models.main.tv.TVSeries 7 | 8 | data class PreviewResponse( 9 | val upcoming: List, 10 | val popular: List, 11 | val top: List, 12 | val extra: List?, 13 | ) 14 | 15 | data class Preview( 16 | val movie: PreviewResponse, 17 | val tv: PreviewResponse, 18 | val anime: PreviewResponse, 19 | val game: PreviewResponse, 20 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeAirDate.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AnimeAirDate( 9 | val from: String?, 10 | val to: String?, 11 | 12 | @SerializedName("from_day") 13 | val fromDay: Int?, 14 | 15 | @SerializedName("from_month") 16 | val fromMonth: Int?, 17 | 18 | @SerializedName("from_year") 19 | val fromYear: Int?, 20 | 21 | @SerializedName("to_day") 22 | val toDay: Int?, 23 | 24 | @SerializedName("to_month") 25 | val toMonth: Int?, 26 | 27 | @SerializedName("to_year") 28 | val toYear: Int?, 29 | ) : Parcelable { 30 | constructor(): this( 31 | "", "", 0, 0, 0, 0, 0, 0 32 | ) 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeCharacter.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AnimeCharacter( 9 | val name: String, 10 | val role: String, 11 | val image: String, 12 | 13 | @SerializedName("mal_id") 14 | val malID: Int, 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeGenre.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class AnimeGenre( 8 | val name: String, 9 | val url: String, 10 | ) : Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeNameURL.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class AnimeNameURL( 8 | val name: String, 9 | val url: String, 10 | ) : Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeRecommendation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AnimeRecommendation( 9 | val title: String, 10 | 11 | @SerializedName("mal_id") 12 | val malID: Int, 13 | 14 | @SerializedName("image_url") 15 | val imageURL: String, 16 | ) : Parcelable 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/anime/AnimeRelation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.anime 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AnimeRelation( 9 | @SerializedName("_id") 10 | val id: String, 11 | 12 | @SerializedName("mal_id") 13 | val malID: Int, 14 | 15 | @SerializedName("anime_id") 16 | val animeID: String, 17 | 18 | @SerializedName("image_url") 19 | val imageURL: String, 20 | 21 | @SerializedName("title_en") 22 | val titleEn: String, 23 | 24 | @SerializedName("title_original") 25 | val titleOriginal: String, 26 | 27 | val relation: String, 28 | val type: String, 29 | ) : Parcelable -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/game/GameDetailsRelation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.game 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class GameDetailsRelation( 6 | @SerializedName("_id") 7 | val id: String, 8 | val platforms: List, 9 | 10 | @SerializedName("title") 11 | val title: String, 12 | 13 | @SerializedName("title_original") 14 | val titleOriginal: String, 15 | 16 | @SerializedName("rawg_id") 17 | val rawgID: Int, 18 | 19 | @SerializedName("release_date") 20 | val releaseDate: String?, 21 | 22 | @SerializedName("image_url") 23 | val imageURL: String, 24 | ) 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/game/GameMetacriticScorePlatform.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.game 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class GameMetacriticScorePlatform( 8 | val score: Float, 9 | val platform: String, 10 | ) : Parcelable 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/game/GameRelation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.game 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class GameRelation( 9 | val name: String, 10 | 11 | @SerializedName("release_date") 12 | val releaseDate: String, 13 | 14 | @SerializedName("rawg_id") 15 | val rawgID: Int, 16 | ) : Parcelable 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/game/GameStore.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.game 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class GameStore( 9 | val url: String, 10 | 11 | @SerializedName("store_id") 12 | val storeId: Int, 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/movie/entity/MovieTypeConverters.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.movie.entity 2 | 3 | import androidx.room.TypeConverter 4 | import com.google.gson.Gson 5 | import com.google.gson.reflect.TypeToken 6 | import com.mrntlu.projectconsumer.models.common.Streaming 7 | 8 | class MovieTypeConverters { 9 | private val gson = Gson() 10 | 11 | @TypeConverter 12 | fun fromStreamingList(streamingList: List?): String { 13 | return gson.toJson(streamingList) 14 | } 15 | 16 | @TypeConverter 17 | fun toStreamingList(streamingList: String?): List? { 18 | if (streamingList != null) { 19 | val streaming = object : TypeToken>() {}.type 20 | return gson.fromJson(streamingList, streaming) 21 | } 22 | return emptyList() 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/review/Author.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.review 2 | 3 | import android.os.Parcelable 4 | import com.google.gson.annotations.SerializedName 5 | import com.mrntlu.projectconsumer.interfaces.DiffUtilComparison 6 | import kotlinx.parcelize.Parcelize 7 | 8 | @Parcelize 9 | data class Author( 10 | val image: String, 11 | val username: String, 12 | val email: String, 13 | 14 | @SerializedName("_id") 15 | val id: String, 16 | 17 | @SerializedName("is_premium") 18 | val isPremium: Boolean, 19 | ): Parcelable, DiffUtilComparison { 20 | constructor(): this("", "", "", "", false) 21 | 22 | override fun areItemsTheSame(newItem: Author): Boolean { 23 | return id == newItem.id 24 | } 25 | 26 | override fun areContentsTheSame(newItem: Author): Boolean { 27 | return when { 28 | id != newItem.id -> false 29 | image != newItem.image -> false 30 | else -> true 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/review/retrofit/ReviewBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.review.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ReviewBody( 6 | @SerializedName("content_id") 7 | val contentId: String, 8 | 9 | @SerializedName("content_external_id") 10 | val contentExternalId: String?, 11 | 12 | @SerializedName("content_external_int_id") 13 | val contentExternalIntId: Int?, 14 | 15 | @SerializedName("content_type") 16 | val contentType: String, 17 | 18 | @SerializedName("is_spoiler") 19 | val isSpoiler: Boolean, 20 | 21 | val star: Int, 22 | val review: String, 23 | ) 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/review/retrofit/UpdateReviewBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.review.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateReviewBody( 6 | val id: String, 7 | val review: String?, 8 | val star: Int?, 9 | 10 | @SerializedName("is_spoiler") 11 | val isSpoiler: Boolean?, 12 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/tv/Network.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.tv 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Network( 6 | val logo: String?, 7 | val name: String, 8 | 9 | @SerializedName("origin_country") 10 | val originCountry: String? 11 | ) { 12 | constructor(): this("", "", "") 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/tv/Season.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.tv 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Season( 6 | val name: String, 7 | 8 | @SerializedName("air_date") 9 | val airDate: String, 10 | 11 | @SerializedName("episode_count") 12 | val episodeCount: Int, 13 | 14 | @SerializedName("image_url") 15 | val imageURL: String, 16 | 17 | @SerializedName("season_num") 18 | val seasonNum: Int 19 | ) { 20 | constructor(): this("", "", 0, "", 0) 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/tv/entity/NetworkEntity.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.tv.entity 2 | 3 | import androidx.room.ColumnInfo 4 | 5 | data class NetworkEntity( 6 | val logo: String?, 7 | val name: String, 8 | 9 | @ColumnInfo("origin_country") 10 | val originCountry: String? 11 | ) { 12 | constructor(): this("", "", "") 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/tv/entity/TVSeriesTypeConverters.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.tv.entity 2 | 3 | import androidx.room.TypeConverter 4 | import com.google.gson.Gson 5 | import com.google.gson.reflect.TypeToken 6 | import com.mrntlu.projectconsumer.models.main.tv.Season 7 | 8 | class TVSeriesTypeConverters { 9 | @TypeConverter 10 | fun fromNetworkList(networks: List?): String { 11 | return Gson().toJson(networks) 12 | } 13 | 14 | @TypeConverter 15 | fun toNetworkList(networks: String?): List? { 16 | if (networks != null) { 17 | val network = object : TypeToken>() {}.type 18 | return Gson().fromJson(networks, network) 19 | } 20 | return emptyList() 21 | } 22 | 23 | @TypeConverter 24 | fun fromSeasonList(seasons: List?): String { 25 | return Gson().toJson(seasons) 26 | } 27 | 28 | @TypeConverter 29 | fun toSeasonList(seasons: String?): List? { 30 | if (seasons != null) { 31 | val season = object : TypeToken>() {}.type 32 | return Gson().fromJson(seasons, season) 33 | } 34 | return emptyList() 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userInteraction/ConsumeLater.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userInteraction 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ConsumeLater( 6 | @SerializedName("_id") 7 | val id: String, 8 | 9 | @SerializedName("user_id") 10 | val userID: String, 11 | 12 | @SerializedName("content_id") 13 | val contentID: String, 14 | 15 | @SerializedName("content_external_id") 16 | val contentExternalID: String, 17 | 18 | @SerializedName("content_external_int_id") 19 | val contentExternalIntID: Int, 20 | 21 | @SerializedName("content_type") 22 | val contentType: String, 23 | 24 | @SerializedName("self_note") 25 | val selfNote: String 26 | ) 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userInteraction/entity/ConsumeLaterTypeConverters.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userInteraction.entity 2 | 3 | import androidx.room.TypeConverter 4 | import com.google.gson.Gson 5 | 6 | class ConsumeLaterTypeConverters { 7 | @TypeConverter 8 | fun fromConsumeLaterContent(consumeLaterContentEntity: ConsumeLaterContentEntity): String { 9 | return Gson().toJson(consumeLaterContentEntity) 10 | } 11 | 12 | @TypeConverter 13 | fun toConsumeLaterContent(consumeLaterContent: String): ConsumeLaterContentEntity { 14 | return Gson().fromJson(consumeLaterContent, ConsumeLaterContentEntity::class.java) 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userInteraction/retrofit/ConsumeLaterBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userInteraction.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class ConsumeLaterBody( 6 | @SerializedName("content_id") 7 | val contentId: String, 8 | 9 | @SerializedName("content_external_id") 10 | val contentExternalId: String?, 11 | 12 | @SerializedName("content_external_int_id") 13 | val contentExternalIntId: Int?, 14 | 15 | @SerializedName("content_type") 16 | val contentType: String, 17 | 18 | @SerializedName("self_note") 19 | val selfNote: String?, 20 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userInteraction/retrofit/MarkConsumeLaterBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userInteraction.retrofit 2 | 3 | data class MarkConsumeLaterBody( 4 | val id: String, 5 | val score: Int?, 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/AnimeWatchList.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.UserListModel 5 | 6 | data class AnimeWatchList( 7 | @SerializedName("_id") 8 | override val id: String, 9 | 10 | @SerializedName("anime_id") 11 | override val contentId: String, 12 | 13 | @SerializedName("anime_mal_id") 14 | override val contentExternalId: String, 15 | 16 | @SerializedName("watched_episodes") 17 | override val mainAttribute: Int, 18 | 19 | @SerializedName("times_finished") 20 | override val timesFinished: Int, 21 | 22 | @SerializedName("status") 23 | override val contentStatus: String, 24 | 25 | @SerializedName("created_at") 26 | override val createdAt: String, 27 | 28 | override val score: Int?, 29 | 30 | override val subAttribute: Int? = null, 31 | ): UserListModel() 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/GamePlayList.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.UserListModel 5 | 6 | data class GamePlayList( 7 | @SerializedName("_id") 8 | override val id: String, 9 | 10 | @SerializedName("game_id") 11 | override val contentId: String, 12 | 13 | @SerializedName("game_rawg_id") 14 | override val contentExternalId: String, 15 | 16 | @SerializedName("times_finished") 17 | override val timesFinished: Int, 18 | 19 | @SerializedName("hours_played") 20 | override val mainAttribute: Int?, 21 | 22 | @SerializedName("status") 23 | override val contentStatus: String, 24 | 25 | @SerializedName("created_at") 26 | override val createdAt: String, 27 | 28 | override val score: Int?, 29 | 30 | override val subAttribute: Int? = null, 31 | ): UserListModel() 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/Log.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Log( 6 | @SerializedName("content_id") 7 | val contentId: String, 8 | 9 | @SerializedName("content_image") 10 | val contentImage: String, 11 | 12 | @SerializedName("content_title") 13 | val contentTitle: String, 14 | 15 | @SerializedName("content_type") 16 | val contentType: String, 17 | 18 | @SerializedName("created_at") 19 | val createdAt: String, 20 | 21 | @SerializedName("log_action") 22 | val logAction: String, 23 | 24 | @SerializedName("log_action_details") 25 | val logActionDetails: String, 26 | 27 | @SerializedName("log_type") 28 | val logType: String, 29 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/LogsByDate.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | data class LogsByDate( 4 | val date: String, 5 | val count: Int, 6 | val data: List, 7 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/MovieWatchList.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.UserListModel 5 | 6 | data class MovieWatchList( 7 | @SerializedName("_id") 8 | override val id: String, 9 | 10 | @SerializedName("movie_id") 11 | override val contentId: String, 12 | 13 | @SerializedName("movie_tmdb_id") 14 | override val contentExternalId: String, 15 | 16 | @SerializedName("times_finished") 17 | override val timesFinished: Int, 18 | 19 | @SerializedName("status") 20 | override val contentStatus: String, 21 | 22 | @SerializedName("created_at") 23 | override val createdAt: String, 24 | 25 | override val score: Int?, 26 | 27 | override val mainAttribute: Int? = null, 28 | override val subAttribute: Int? = null, 29 | ): UserListModel() -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/TVSeriesWatchList.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import com.mrntlu.projectconsumer.interfaces.UserListModel 5 | 6 | data class TVSeriesWatchList( 7 | @SerializedName("_id") 8 | override val id: String, 9 | 10 | @SerializedName("tv_id") 11 | override val contentId: String, 12 | 13 | @SerializedName("tv_tmdb_id") 14 | override val contentExternalId: String, 15 | 16 | @SerializedName("times_finished") 17 | override val timesFinished: Int, 18 | 19 | @SerializedName("watched_episodes") 20 | override val mainAttribute: Int, 21 | 22 | @SerializedName("watched_seasons") 23 | override val subAttribute: Int, 24 | 25 | @SerializedName("status") 26 | override val contentStatus: String, 27 | 28 | @SerializedName("created_at") 29 | override val createdAt: String, 30 | 31 | override val score: Int?, 32 | ): UserListModel() 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/UserList.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UserList( 6 | @SerializedName("_id") 7 | val id: String, 8 | 9 | @SerializedName("user_id") 10 | val userID: String, 11 | 12 | @SerializedName("is_public") 13 | val isPublic: Boolean, 14 | 15 | @SerializedName("anime_list") 16 | var animeList: List, 17 | 18 | @SerializedName("game_list") 19 | var gameList: List, 20 | 21 | @SerializedName("movie_watch_list") 22 | var movieList: List, 23 | 24 | @SerializedName("tv_watch_list") 25 | var tvList: List, 26 | 27 | val slug: String, 28 | ) 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/AnimeWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class AnimeWatchListBody( 6 | @SerializedName("anime_id") 7 | val animeId: String, 8 | 9 | @SerializedName("anime_mal_id") 10 | val animeMalId: Int, 11 | 12 | @SerializedName("watched_episodes") 13 | val watchedEpisodes: Int?, 14 | 15 | @SerializedName("times_finished") 16 | val timesFinished: Int?, 17 | 18 | val score: Int?, 19 | val status: String, 20 | ) 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/DeleteUserListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | data class DeleteUserListBody( 4 | val id: String, 5 | val type: String, 6 | ) 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/GamePlayListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class GamePlayListBody( 6 | @SerializedName("game_id") 7 | val gameId: String, 8 | 9 | @SerializedName("game_rawg_id") 10 | val gameRawgId: Int, 11 | 12 | @SerializedName("times_finished") 13 | val timesFinished: Int?, 14 | 15 | @SerializedName("hours_played") 16 | val hoursPlayed: Int?, 17 | 18 | val score: Int?, 19 | val status: String, 20 | ) 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/IncrementTVSeriesListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IncrementTVSeriesListBody( 6 | val id: String, 7 | 8 | @SerializedName("is_episode") 9 | val isEpisode: Boolean, 10 | ) 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/MovieWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class MovieWatchListBody( 6 | @SerializedName("movie_id") 7 | val movieId: String, 8 | 9 | @SerializedName("movie_tmdb_id") 10 | val movieTMDBId: String, 11 | 12 | @SerializedName("times_finished") 13 | val timesFinished: Int?, 14 | 15 | val score: Int?, 16 | val status: String 17 | ) 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/TVWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class TVWatchListBody( 6 | @SerializedName("tv_id") 7 | val tvId: String, 8 | 9 | @SerializedName("tv_tmdb_id") 10 | val tvTMDBId: String, 11 | 12 | @SerializedName("times_finished") 13 | val timesFinished: Int?, 14 | 15 | @SerializedName("watched_episodes") 16 | val watchedEpisodes: Int?, 17 | 18 | @SerializedName("watched_seasons") 19 | val watchedSeasons: Int?, 20 | 21 | val score: Int?, 22 | val status: String 23 | ) 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/UpdateAnimeWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateAnimeWatchListBody( 6 | val id: String, 7 | 8 | @SerializedName("is_updating_score") 9 | val isUpdatingScore: Boolean, 10 | 11 | @SerializedName("times_finished") 12 | val timesFinished: Int?, 13 | 14 | @SerializedName("watched_episodes") 15 | val watchedEpisodes: Int?, 16 | 17 | val score: Int?, 18 | val status: String? 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/UpdateGamePlayListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateGamePlayListBody( 6 | val id: String, 7 | 8 | @SerializedName("is_updating_score") 9 | val isUpdatingScore: Boolean, 10 | 11 | @SerializedName("times_finished") 12 | val timesFinished: Int?, 13 | 14 | @SerializedName("hours_played") 15 | val hoursPlayed: Int?, 16 | 17 | val score: Int?, 18 | val status: String? 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/UpdateMovieWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateMovieWatchListBody( 6 | val id: String, 7 | 8 | @SerializedName("is_updating_score") 9 | val isUpdatingScore: Boolean, 10 | 11 | @SerializedName("times_finished") 12 | val timesFinished: Int?, 13 | 14 | val score: Int?, 15 | val status: String?, 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/models/main/userList/retrofit/UpdateTVWatchListBody.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.models.main.userList.retrofit 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class UpdateTVWatchListBody( 6 | val id: String, 7 | 8 | @SerializedName("is_updating_score") 9 | val isUpdatingScore: Boolean, 10 | 11 | @SerializedName("times_finished") 12 | val timesFinished: Int?, 13 | 14 | @SerializedName("watched_episodes") 15 | val watchedEpisodes: Int?, 16 | 17 | @SerializedName("watched_seasons") 18 | val watchedSeasons: Int?, 19 | 20 | val score: Int?, 21 | val status: String? 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/AISuggestionsRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.AISuggestionApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class AISuggestionsRepository @Inject constructor( 8 | private val aiSuggestionApiService: AISuggestionApiService, 9 | ) { 10 | 11 | fun getAISuggestions() = networkResponseFlow { 12 | aiSuggestionApiService.getAISuggestions() 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/AnimePreviewRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.AnimeApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class AnimePreviewRepository @Inject constructor( 8 | private val animeApiService: AnimeApiService, 9 | ) { 10 | fun fetchPreviewAnimes() = networkResponseFlow { 11 | animeApiService.getPreviewAnimes() 12 | } 13 | 14 | fun getCurrentlyAiringTVSeriesByDayOfWeek() = networkResponseFlow { 15 | animeApiService.getCurrentlyAiringAnimesByDayOfWeek() 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/AuthRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.models.auth.retrofit.ForgotPasswordBody 4 | import com.mrntlu.projectconsumer.models.auth.retrofit.GoogleLoginBody 5 | import com.mrntlu.projectconsumer.models.auth.retrofit.LoginBody 6 | import com.mrntlu.projectconsumer.models.auth.retrofit.RegisterBody 7 | import com.mrntlu.projectconsumer.service.retrofit.AuthApiService 8 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 9 | import javax.inject.Inject 10 | 11 | class AuthRepository @Inject constructor( 12 | private val authApiService: AuthApiService, 13 | ) { 14 | 15 | fun login(body: LoginBody) = networkResponseFlow { 16 | authApiService.login(body) 17 | } 18 | 19 | fun register(body: RegisterBody) = networkResponseFlow { 20 | authApiService.register(body) 21 | } 22 | 23 | fun googleLogin(body: GoogleLoginBody) = networkResponseFlow { 24 | authApiService.googleLogin(body) 25 | } 26 | 27 | fun forgotPassword(body: ForgotPasswordBody) = networkResponseFlow { 28 | authApiService.forgotPassword(body) 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/GamePreviewRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.GameApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class GamePreviewRepository @Inject constructor( 8 | private val gameApiService: GameApiService, 9 | ) { 10 | fun fetchPreviewGames() = networkResponseFlow { 11 | gameApiService.getPreviewGames() 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/MoviePreviewRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.MovieApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class MoviePreviewRepository @Inject constructor( 8 | private val movieApiService: MovieApiService, 9 | ) { 10 | fun fetchPreviewMovies() = networkResponseFlow { 11 | movieApiService.getPreviewMovies() 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/PreviewRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.PreviewApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class PreviewRepository @Inject constructor( 8 | private val previewApiService: PreviewApiService, 9 | ) { 10 | fun getPreview() = networkResponseFlow { 11 | previewApiService.getPreview() 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/repository/TVPreviewRepository.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.repository 2 | 3 | import com.mrntlu.projectconsumer.service.retrofit.TVSeriesApiService 4 | import com.mrntlu.projectconsumer.utils.networkResponseFlow 5 | import javax.inject.Inject 6 | 7 | class TVPreviewRepository @Inject constructor( 8 | private val tvSeriesApiService: TVSeriesApiService, 9 | ) { 10 | 11 | fun fetchPreviewTVSeries() = networkResponseFlow { 12 | tvSeriesApiService.getPreviewTVSeries() 13 | } 14 | 15 | fun getCurrentlyAiringTVSeriesByDayOfWeek() = networkResponseFlow { 16 | tvSeriesApiService.getCurrentlyAiringTVSeriesByDayOfWeek() 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/service/AuthInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.service 2 | 3 | import kotlinx.coroutines.flow.first 4 | import kotlinx.coroutines.runBlocking 5 | import okhttp3.Interceptor 6 | import okhttp3.Response 7 | import javax.inject.Inject 8 | 9 | class AuthInterceptor @Inject constructor( 10 | private val tokenManager: TokenManager, 11 | ): Interceptor { 12 | override fun intercept(chain: Interceptor.Chain): Response { 13 | val token = runBlocking { 14 | tokenManager.getToken().first() 15 | } 16 | val request = chain.request().newBuilder() 17 | request.addHeader("Authorization", "Bearer $token") 18 | return chain.proceed(request.build()) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/service/TokenManager.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.service 2 | 3 | import android.content.Context 4 | import androidx.datastore.preferences.core.edit 5 | import androidx.datastore.preferences.core.stringPreferencesKey 6 | import com.mrntlu.projectconsumer.utils.dataStore 7 | import kotlinx.coroutines.flow.Flow 8 | import kotlinx.coroutines.flow.map 9 | 10 | class TokenManager(private val context: Context) { 11 | companion object { 12 | private val TOKEN_KEY = stringPreferencesKey("jwt_token") 13 | } 14 | 15 | fun getToken(): Flow { 16 | return context.dataStore.data.map { preferences -> 17 | preferences[TOKEN_KEY] 18 | } 19 | } 20 | 21 | suspend fun saveToken(token: String) { 22 | context.dataStore.edit { preferences -> 23 | preferences[TOKEN_KEY] = token 24 | } 25 | } 26 | 27 | suspend fun deleteToken() { 28 | context.dataStore.edit { preferences -> 29 | preferences.remove(TOKEN_KEY) 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/service/retrofit/AISuggestionApiService.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.service.retrofit 2 | 3 | import com.mrntlu.projectconsumer.models.common.AISuggestionResponse 4 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 5 | import retrofit2.Response 6 | import retrofit2.http.GET 7 | 8 | interface AISuggestionApiService { 9 | @GET("suggestions") 10 | suspend fun getAISuggestions(): Response> 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/service/retrofit/AuthApiService.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.service.retrofit 2 | 3 | import com.mrntlu.projectconsumer.models.auth.retrofit.ForgotPasswordBody 4 | import com.mrntlu.projectconsumer.models.auth.retrofit.GoogleLoginBody 5 | import com.mrntlu.projectconsumer.models.auth.retrofit.LoginBody 6 | import com.mrntlu.projectconsumer.models.auth.retrofit.LoginResponse 7 | import com.mrntlu.projectconsumer.models.auth.retrofit.RegisterBody 8 | import com.mrntlu.projectconsumer.models.common.retrofit.MessageResponse 9 | import retrofit2.Response 10 | import retrofit2.http.Body 11 | import retrofit2.http.GET 12 | import retrofit2.http.Header 13 | import retrofit2.http.POST 14 | 15 | interface AuthApiService { 16 | @POST("auth/login") 17 | suspend fun login(@Body body: LoginBody): Response 18 | 19 | @POST("auth/register") 20 | suspend fun register(@Body body: RegisterBody): Response 21 | 22 | @POST("oauth/google") 23 | suspend fun googleLogin(@Body body: GoogleLoginBody): Response 24 | 25 | @GET("auth/refresh") 26 | suspend fun refreshToken(@Header("Authorization") token: String): Response 27 | 28 | @POST("user/forgot-password") 29 | suspend fun forgotPassword(@Body body: ForgotPasswordBody): Response 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/service/retrofit/PreviewApiService.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.service.retrofit 2 | 3 | import com.mrntlu.projectconsumer.models.common.retrofit.Preview 4 | import retrofit2.Response 5 | import retrofit2.http.GET 6 | 7 | interface PreviewApiService { 8 | 9 | @GET("preview") 10 | suspend fun getPreview(): Response 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/ui/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.ui 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.fragment.app.Fragment 6 | import androidx.fragment.app.activityViewModels 7 | import androidx.navigation.NavController 8 | import androidx.navigation.Navigation 9 | import androidx.navigation.fragment.findNavController 10 | import com.mrntlu.projectconsumer.viewmodels.shared.ActivitySharedViewModel 11 | 12 | abstract class BaseFragment: Fragment() { 13 | protected var _binding: T? = null 14 | protected val binding get() = _binding!! 15 | protected val sharedViewModel: ActivitySharedViewModel by activityViewModels() 16 | 17 | protected lateinit var navController: NavController 18 | 19 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 20 | super.onViewCreated(view, savedInstanceState) 21 | navController = try { 22 | findNavController() 23 | } catch (_: Exception) { 24 | Navigation.findNavController(view) 25 | } 26 | } 27 | 28 | // To prevent memory leak 29 | override fun onDestroyView() { 30 | super.onDestroyView() 31 | _binding = null 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/ui/compose/LoadingShimmer.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.ui.compose 2 | 3 | import androidx.compose.foundation.background 4 | import androidx.compose.foundation.layout.Spacer 5 | import androidx.compose.foundation.layout.aspectRatio 6 | import androidx.compose.foundation.layout.fillMaxWidth 7 | import androidx.compose.foundation.shape.RoundedCornerShape 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Modifier 10 | import androidx.compose.ui.draw.clip 11 | import androidx.compose.ui.unit.Dp 12 | import androidx.compose.ui.unit.dp 13 | 14 | @Composable 15 | fun LoadingShimmer( 16 | modifier: Modifier = Modifier, 17 | isDarkTheme: Boolean = false, 18 | roundedCornerSize: Dp = 8.dp, 19 | aspectRatio: Float = 0.6666667f, 20 | sizeModifier: Modifier.() -> Modifier = { modifier.fillMaxWidth() }, 21 | ) { 22 | Spacer( 23 | modifier = modifier 24 | .sizeModifier() 25 | .aspectRatio(aspectRatio) 26 | .clip(RoundedCornerShape(roundedCornerSize)) 27 | .background(getShimmerBrush(isDarkTheme = isDarkTheme)), 28 | ) 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/ui/dialog/LoadingDialog.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.ui.dialog 2 | 3 | import android.app.Activity 4 | import android.graphics.Color 5 | import android.graphics.drawable.ColorDrawable 6 | import android.view.WindowManager 7 | import androidx.appcompat.app.AlertDialog 8 | import com.mrntlu.projectconsumer.R 9 | 10 | class LoadingDialog( 11 | private val activity: Activity 12 | ) { 13 | lateinit var dialog: AlertDialog 14 | 15 | fun showLoadingDialog() { 16 | val builder = AlertDialog.Builder(activity, R.style.WrapContentDialog) 17 | 18 | builder.apply { 19 | setView(activity.layoutInflater.inflate(R.layout.layout_loading_dialog, null)) 20 | setCancelable(false) 21 | dialog = create() 22 | } 23 | 24 | dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) 25 | val layoutParams = WindowManager.LayoutParams().apply { 26 | copyFrom(dialog.window?.attributes) 27 | width = WindowManager.LayoutParams.WRAP_CONTENT 28 | height = WindowManager.LayoutParams.WRAP_CONTENT 29 | } 30 | dialog.window?.attributes = layoutParams 31 | dialog.show() 32 | } 33 | 34 | fun dismissDialog() { 35 | if (::dialog.isInitialized) 36 | dialog.dismiss() 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/FetchType.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | enum class FetchType(val tag: String) { 4 | UPCOMING("upcoming"), 5 | POPULAR("popular"), 6 | TOP("top"), 7 | EXTRA("extra") 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/MessageBoxType.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | enum class MessageBoxType { 4 | NOTHING, 5 | ERROR, 6 | SUCCESS, 7 | INFO, 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/NetworkResponse.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | sealed class NetworkResponse { 4 | object Loading: NetworkResponse() 5 | 6 | data class Success( 7 | val data: T 8 | ): NetworkResponse() 9 | 10 | data class Failure( 11 | val errorMessage: String, 12 | ): NetworkResponse() 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/Operation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | data class Operation( 4 | val data: T?, 5 | val position: Int, 6 | val operationEnum: OperationEnum 7 | ) 8 | 9 | enum class OperationEnum { 10 | Delete, 11 | Update, 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/Orientation.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | enum class Orientation { 4 | Idle, 5 | Landscape, 6 | LandscapeReverse, 7 | Portrait, 8 | PortraitReverse, 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/RecyclerViewEnum.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | enum class RecyclerViewEnum(val value: Int) { 4 | Empty(0), 5 | Loading(1), 6 | Error(2), 7 | View(3), 8 | PaginationLoading(4), 9 | PaginationExhaust(5), 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/SafeClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | import android.os.SystemClock 4 | import android.view.View 5 | 6 | class SafeClickListener( 7 | private var defaultInterval: Int = 550, 8 | private val onSafeCLick: (View) -> Unit, 9 | ): View.OnClickListener { 10 | private var lastTimeClicked: Long = 0 11 | 12 | override fun onClick(v: View) { 13 | if (SystemClock.elapsedRealtime() - lastTimeClicked < defaultInterval) { 14 | return 15 | } 16 | lastTimeClicked = SystemClock.elapsedRealtime() 17 | onSafeCLick(v) 18 | } 19 | } 20 | 21 | fun View.setSafeOnClickListener(interval: Int = 550, onSafeClick: (View) -> Unit) { 22 | val safeClickListener = SafeClickListener(interval) { 23 | onSafeClick(it) 24 | } 25 | setOnClickListener(safeClickListener) 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/utils/Utils.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.utils 2 | 3 | import android.util.Log 4 | 5 | fun printLog(message:String, tag: String = "TestLog") = Log.d(tag, message) 6 | 7 | fun compactMediumCalculator(height: Float): Double { 8 | var i = 20 9 | var span = i 10 | while (i < 30) { 11 | val remainder = height.toDouble().roundOffDecimal() % i 12 | 13 | if (remainder <= 0.5) { 14 | if (i > span) 15 | span = i 16 | } 17 | i += 1 18 | } 19 | return span / 10.0 20 | } 21 | 22 | fun expandedMediumCalculator(height: Float): Double { 23 | var i = 200 24 | var span = i 25 | while (i < 300) { 26 | val remainder = height.toDouble().roundSingleDecimal() % i 27 | 28 | if (remainder.toInt() <= 10) { 29 | if (i > span) 30 | span = i 31 | } 32 | i += 1 33 | } 34 | return span / 100.0 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/auth/RegisterViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.auth 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.auth.retrofit.RegisterBody 7 | import com.mrntlu.projectconsumer.models.common.retrofit.MessageResponse 8 | import com.mrntlu.projectconsumer.repository.AuthRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class RegisterViewModel @Inject constructor( 16 | private val repository: AuthRepository, 17 | ): ViewModel() { 18 | 19 | private val _registerResponse = MutableLiveData>() 20 | val registerResponse: LiveData> = _registerResponse 21 | 22 | fun register(body: RegisterBody) = networkResponseFlowCollector( 23 | repository.register(body) 24 | ) { response -> 25 | _registerResponse.value = response 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/anime/AnimeDetailsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.anime 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 7 | import com.mrntlu.projectconsumer.models.main.anime.AnimeDetails 8 | import com.mrntlu.projectconsumer.repository.AnimeRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class AnimeDetailsViewModel @Inject constructor( 16 | private val animeRepository: AnimeRepository, 17 | ): ViewModel() { 18 | private val _animeDetails = MutableLiveData>>() 19 | val animeDetails: LiveData>> = _animeDetails 20 | 21 | fun getAnimeDetails(id: String) = networkResponseFlowCollector( 22 | animeRepository.getAnimeDetails(id) 23 | ) { response -> 24 | _animeDetails.value = response 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/anime/AnimePreviewViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.anime 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.PreviewResponse 7 | import com.mrntlu.projectconsumer.models.main.anime.Anime 8 | import com.mrntlu.projectconsumer.repository.AnimePreviewRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class AnimePreviewViewModel @Inject constructor( 16 | private val animePreviewRepository: AnimePreviewRepository, 17 | ): ViewModel() { 18 | private val _previewList = MutableLiveData>>() 19 | val previewList: LiveData>> = _previewList 20 | 21 | init { 22 | fetchPreviewAnimes() 23 | } 24 | 25 | fun fetchPreviewAnimes() = networkResponseFlowCollector( 26 | animePreviewRepository.fetchPreviewAnimes() 27 | ) { response -> 28 | _previewList.value = response 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/common/AISuggestionsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.common 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.AISuggestionResponse 7 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 8 | import com.mrntlu.projectconsumer.repository.AISuggestionsRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class AISuggestionsViewModel @Inject constructor( 16 | private val repository: AISuggestionsRepository, 17 | ): ViewModel() { 18 | 19 | private val _aiSuggestionsResponse = MutableLiveData>>() 20 | val aiSuggestionsResponse: LiveData>> = _aiSuggestionsResponse 21 | 22 | fun getAISuggestions() = networkResponseFlowCollector( 23 | repository.getAISuggestions() 24 | ) { response -> 25 | _aiSuggestionsResponse.value = response 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/common/PreviewViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.common 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.Preview 7 | import com.mrntlu.projectconsumer.repository.PreviewRepository 8 | import com.mrntlu.projectconsumer.utils.NetworkResponse 9 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 10 | import dagger.hilt.android.lifecycle.HiltViewModel 11 | import javax.inject.Inject 12 | 13 | @HiltViewModel 14 | class PreviewViewModel @Inject constructor( 15 | private val previewRepository: PreviewRepository, 16 | ): ViewModel() { 17 | 18 | private val _previewList = MutableLiveData>() 19 | val previewList: LiveData> = _previewList 20 | 21 | init { 22 | getPreview() 23 | } 24 | 25 | fun getPreview() = networkResponseFlowCollector( 26 | previewRepository.getPreview() 27 | ) { response -> 28 | _previewList.value = response 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/game/GameDetailsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.game 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 7 | import com.mrntlu.projectconsumer.models.main.game.GameDetails 8 | import com.mrntlu.projectconsumer.repository.GameRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class GameDetailsViewModel @Inject constructor( 16 | private val gameRepository: GameRepository, 17 | ): ViewModel() { 18 | private val _gameDetails = MutableLiveData>>() 19 | val gameDetails: LiveData>> = _gameDetails 20 | 21 | fun getGameDetails(id: String) = networkResponseFlowCollector( 22 | gameRepository.getGameDetails(id) 23 | ) { response -> 24 | _gameDetails.value = response 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/game/GamePreviewViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.game 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.PreviewResponse 7 | import com.mrntlu.projectconsumer.models.main.game.Game 8 | import com.mrntlu.projectconsumer.repository.GamePreviewRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class GamePreviewViewModel @Inject constructor( 16 | private val gamePreviewRepository: GamePreviewRepository, 17 | ): ViewModel() { 18 | private val _previewList = MutableLiveData>>() 19 | val previewList: LiveData>> = _previewList 20 | 21 | init { 22 | fetchPreviewGames() 23 | } 24 | 25 | fun fetchPreviewGames() = networkResponseFlowCollector( 26 | gamePreviewRepository.fetchPreviewGames() 27 | ) { response -> 28 | _previewList.value = response 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/movie/MovieDetailsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.movie 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 7 | import com.mrntlu.projectconsumer.models.main.movie.MovieDetails 8 | import com.mrntlu.projectconsumer.repository.MovieRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class MovieDetailsViewModel @Inject constructor( 16 | private val movieRepository: MovieRepository, 17 | ): ViewModel() { 18 | private val _movieDetails = MutableLiveData>>() 19 | val movieDetails: LiveData>> = _movieDetails 20 | 21 | fun getMovieDetails(id: String) = networkResponseFlowCollector( 22 | movieRepository.getMovieDetails(id) 23 | ) { response -> 24 | _movieDetails.value = response 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/movie/MoviePreviewViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.movie 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.PreviewResponse 7 | import com.mrntlu.projectconsumer.models.main.movie.Movie 8 | import com.mrntlu.projectconsumer.repository.MoviePreviewRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class MoviePreviewViewModel @Inject constructor( 16 | private val moviePreviewRepository: MoviePreviewRepository, 17 | ): ViewModel() { 18 | private val _previewList = MutableLiveData>>() 19 | val previewList: LiveData>> = _previewList 20 | 21 | init { 22 | fetchPreviewMovies() 23 | } 24 | 25 | fun fetchPreviewMovies() = networkResponseFlowCollector( 26 | moviePreviewRepository.fetchPreviewMovies() 27 | ) { response -> 28 | _previewList.value = response 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/profile/DiaryViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.profile 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 7 | import com.mrntlu.projectconsumer.models.main.userList.LogsByDate 8 | import com.mrntlu.projectconsumer.repository.UserListRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class DiaryViewModel @Inject constructor( 16 | private val repository: UserListRepository, 17 | ): ViewModel() { 18 | private val _logsResponse = MutableLiveData?>>>() 19 | val logsResponse: LiveData?>>> = _logsResponse 20 | 21 | fun getUserLogs(from: String, to: String) = networkResponseFlowCollector( 22 | repository.getUserLogs(from, to) 23 | ) { response -> 24 | _logsResponse.value = response 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/tv/TVDetailsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.tv 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.DataResponse 7 | import com.mrntlu.projectconsumer.models.main.tv.TVSeriesDetails 8 | import com.mrntlu.projectconsumer.repository.TVRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class TVDetailsViewModel @Inject constructor( 16 | private val tvRepository: TVRepository, 17 | ): ViewModel() { 18 | private val _tvDetails = MutableLiveData>>() 19 | val tvDetails: LiveData>> = _tvDetails 20 | 21 | fun getTVDetails(id: String) = networkResponseFlowCollector( 22 | tvRepository.getTVSeriesDetails(id) 23 | ) { response -> 24 | _tvDetails.value = response 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/main/tv/TVPreviewViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.main.tv 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | import androidx.lifecycle.ViewModel 6 | import com.mrntlu.projectconsumer.models.common.retrofit.PreviewResponse 7 | import com.mrntlu.projectconsumer.models.main.tv.TVSeries 8 | import com.mrntlu.projectconsumer.repository.TVPreviewRepository 9 | import com.mrntlu.projectconsumer.utils.NetworkResponse 10 | import com.mrntlu.projectconsumer.utils.networkResponseFlowCollector 11 | import dagger.hilt.android.lifecycle.HiltViewModel 12 | import javax.inject.Inject 13 | 14 | @HiltViewModel 15 | class TVPreviewViewModel @Inject constructor( 16 | private val tvPreviewRepository: TVPreviewRepository 17 | ): ViewModel() { 18 | private val _previewList = MutableLiveData>>() 19 | val previewList: LiveData>> = _previewList 20 | 21 | init { 22 | fetchPreviewTVSeries() 23 | } 24 | 25 | fun fetchPreviewTVSeries() = networkResponseFlowCollector( 26 | tvPreviewRepository.fetchPreviewTVSeries() 27 | ) { response -> 28 | _previewList.value = response 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mrntlu/projectconsumer/viewmodels/shared/HomeDiscoverSharedViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mrntlu.projectconsumer.viewmodels.shared 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import androidx.lifecycle.ViewModel 5 | import com.mrntlu.projectconsumer.utils.Constants.ContentType 6 | 7 | class HomeDiscoverSharedViewModel: ViewModel() { 8 | 9 | val currentContentType: MutableLiveData by lazy { 10 | MutableLiveData(ContentType.MOVIE) 11 | } 12 | 13 | fun contentType() = currentContentType.value ?: ContentType.MOVIE 14 | 15 | fun setContentType(newContentType: ContentType) { 16 | if (currentContentType.value != newContentType) 17 | this.currentContentType.value = newContentType 18 | } 19 | 20 | val selectedTabIndex: MutableLiveData by lazy { 21 | MutableLiveData(0) 22 | } 23 | 24 | fun setSelectedTabIndex(newIndex: Int) { 25 | if (selectedTabIndex.value != newIndex) 26 | this.selectedTabIndex.value = newIndex 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/color/tab_text_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_nav_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_nav_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_nav_text_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_popup_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/highlight_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/home_filled_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ai.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_anime.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_right_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_settings.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark_filled.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cancel.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_circle_12.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_company_75.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_content_type_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_country.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_explore.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_explore_outlined.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_feedback.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_48.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_finish_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_friend_request.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_game_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_google.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_grid.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_heart.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_outline.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_language.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like_outline.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_log.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_login_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logout_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mail.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_night_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_no_internet_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification_off.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification_off_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification_on_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_people.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_64.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_75.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_bottom.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_outlined.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rate.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_remove.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_remove_heart.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restore.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_round_check.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_64.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort_48.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_36.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_48.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_storage.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_thumb.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_time_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_trash.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tv.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_x.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nintendo.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nintendo_switch.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/notification_switch_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/notification_switch_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 13 | 14 | 15 | 16 | 18 | 20 | 22 | 24 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_discover.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_person.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/switch_thumb_notification_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 11 | 14 | 15 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/switch_thumb_notification_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 11 | 14 | 15 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_background_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/theme_switch_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 12 | 13 | 14 | 15 | 17 | 18 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/theme_switch_track.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/top_rounded_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_anime_relation.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_anime_relation_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_carousel_shimmer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_genre.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_name_url.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_pagination_exhaust.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |