gitextract_3d2wqgev/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── feature_request.yml │ └── workflows/ │ ├── build.yml │ ├── reproducible-build.yml │ └── test.yml ├── .gitignore ├── .idea/ │ ├── .gitignore │ ├── AndroidProjectSystem.xml │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ ├── compiler.xml │ └── kotlinc.xml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Gemfile ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── gradle.properties │ ├── proguard-rules.pro │ ├── schemas/ │ │ └── io.github.drumber.kitsune.data.source.local.LocalDatabase/ │ │ ├── 1.json │ │ ├── 2.json │ │ └── 3.json │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── io/ │ │ └── github/ │ │ └── drumber/ │ │ └── kitsune/ │ │ ├── fastlane/ │ │ │ └── CaptureScreenshots.kt │ │ ├── navigation/ │ │ │ └── NavigationTest.kt │ │ └── utils/ │ │ ├── OkHttpIdlingResource.kt │ │ ├── SearchViewActions.kt │ │ ├── ViewActions.kt │ │ ├── WaitForView.kt │ │ └── filter/ │ │ ├── RequiresScreenshotMode.kt │ │ └── ScreenshotModeCustomFilter.kt │ ├── debug/ │ │ └── AndroidManifest.xml │ ├── instrumented/ │ │ └── AndroidManifest.xml │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── io/ │ │ │ └── github/ │ │ │ └── drumber/ │ │ │ └── kitsune/ │ │ │ ├── KitsuneApplication.kt │ │ │ ├── KitsuneGlideModule.kt │ │ │ ├── constants/ │ │ │ │ ├── AppTheme.kt │ │ │ │ ├── Defaults.kt │ │ │ │ ├── GitHub.kt │ │ │ │ ├── IntentAction.kt │ │ │ │ ├── Kitsu.kt │ │ │ │ ├── LibraryWidget.kt │ │ │ │ ├── MediaItemSize.kt │ │ │ │ ├── Repository.kt │ │ │ │ ├── SortFilter.kt │ │ │ │ └── StreamingLogo.kt │ │ │ ├── data/ │ │ │ │ ├── common/ │ │ │ │ │ ├── Filter.kt │ │ │ │ │ ├── Image.kt │ │ │ │ │ ├── Titles.kt │ │ │ │ │ ├── exception/ │ │ │ │ │ │ ├── InvalidDataException.kt │ │ │ │ │ │ ├── NoDataException.kt │ │ │ │ │ │ ├── NotFoundException.kt │ │ │ │ │ │ ├── ResourceUpdateFailed.kt │ │ │ │ │ │ └── SearchProviderUnavailableException.kt │ │ │ │ │ ├── library/ │ │ │ │ │ │ └── LibraryEntryKind.kt │ │ │ │ │ ├── media/ │ │ │ │ │ │ ├── AgeRating.kt │ │ │ │ │ │ ├── AnimeSubtype.kt │ │ │ │ │ │ ├── MangaSubtype.kt │ │ │ │ │ │ ├── MediaType.kt │ │ │ │ │ │ ├── RatingFrequencies.kt │ │ │ │ │ │ └── ReleaseStatus.kt │ │ │ │ │ └── user/ │ │ │ │ │ └── UserThemePreference.kt │ │ │ │ ├── mapper/ │ │ │ │ │ ├── AlgoliaMapper.kt │ │ │ │ │ ├── AppUpdateMapper.kt │ │ │ │ │ ├── AuthMapper.kt │ │ │ │ │ ├── CharacterMapper.kt │ │ │ │ │ ├── ImageMapper.kt │ │ │ │ │ ├── LibraryMapper.kt │ │ │ │ │ ├── MapperUtils.kt │ │ │ │ │ ├── MappingMapper.kt │ │ │ │ │ ├── MediaMapper.kt │ │ │ │ │ ├── MediaUnitMapper.kt │ │ │ │ │ ├── ProfileLinksMapper.kt │ │ │ │ │ ├── UserMapper.kt │ │ │ │ │ └── UserStatsMapper.kt │ │ │ │ ├── presentation/ │ │ │ │ │ ├── LocalRatingSystemPreference.kt │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── CharacterDto.kt │ │ │ │ │ │ ├── ImageDto.kt │ │ │ │ │ │ ├── MediaDto.kt │ │ │ │ │ │ └── MediaUnitDto.kt │ │ │ │ │ └── model/ │ │ │ │ │ ├── algolia/ │ │ │ │ │ │ ├── AlgoliaKey.kt │ │ │ │ │ │ ├── AlgoliaKeyCollection.kt │ │ │ │ │ │ └── SearchType.kt │ │ │ │ │ ├── appupdate/ │ │ │ │ │ │ ├── AppRelease.kt │ │ │ │ │ │ └── UpdateCheckResult.kt │ │ │ │ │ ├── character/ │ │ │ │ │ │ ├── Character.kt │ │ │ │ │ │ ├── CharacterSearchResult.kt │ │ │ │ │ │ ├── MediaCharacter.kt │ │ │ │ │ │ └── MediaCharacterRole.kt │ │ │ │ │ ├── library/ │ │ │ │ │ │ ├── LibraryEntry.kt │ │ │ │ │ │ ├── LibraryEntryFilter.kt │ │ │ │ │ │ ├── LibraryEntryModification.kt │ │ │ │ │ │ ├── LibraryEntryUiModel.kt │ │ │ │ │ │ ├── LibraryEntryWithModification.kt │ │ │ │ │ │ ├── LibraryModificationState.kt │ │ │ │ │ │ ├── LibraryStatus.kt │ │ │ │ │ │ └── ReactionSkip.kt │ │ │ │ │ ├── mapping/ │ │ │ │ │ │ └── Mapping.kt │ │ │ │ │ ├── media/ │ │ │ │ │ │ ├── Anime.kt │ │ │ │ │ │ ├── Manga.kt │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ ├── MediaSelector.kt │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── Category.kt │ │ │ │ │ │ │ └── CategoryNode.kt │ │ │ │ │ │ ├── production/ │ │ │ │ │ │ │ ├── AnimeProduction.kt │ │ │ │ │ │ │ ├── AnimeProductionRole.kt │ │ │ │ │ │ │ ├── Casting.kt │ │ │ │ │ │ │ ├── Person.kt │ │ │ │ │ │ │ └── Producer.kt │ │ │ │ │ │ ├── relationship/ │ │ │ │ │ │ │ ├── MediaRelationship.kt │ │ │ │ │ │ │ └── MediaRelationshipRole.kt │ │ │ │ │ │ ├── streamer/ │ │ │ │ │ │ │ ├── Streamer.kt │ │ │ │ │ │ │ └── StreamingLink.kt │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── Chapter.kt │ │ │ │ │ │ ├── Episode.kt │ │ │ │ │ │ └── MediaUnit.kt │ │ │ │ │ └── user/ │ │ │ │ │ ├── Favorite.kt │ │ │ │ │ ├── User.kt │ │ │ │ │ ├── profilelinks/ │ │ │ │ │ │ ├── ProfileLink.kt │ │ │ │ │ │ └── ProfileLinkSite.kt │ │ │ │ │ └── stats/ │ │ │ │ │ ├── AmountConsumedPercentiles.kt │ │ │ │ │ ├── UserStats.kt │ │ │ │ │ ├── UserStatsData.kt │ │ │ │ │ └── UserStatsKind.kt │ │ │ │ ├── repository/ │ │ │ │ │ ├── AccessTokenRepository.kt │ │ │ │ │ ├── AlgoliaKeyRepository.kt │ │ │ │ │ ├── AnimeRepository.kt │ │ │ │ │ ├── AppUpdateRepository.kt │ │ │ │ │ ├── CastingRepository.kt │ │ │ │ │ ├── CategoryRepository.kt │ │ │ │ │ ├── CharacterRepository.kt │ │ │ │ │ ├── FavoriteRepository.kt │ │ │ │ │ ├── LibraryChangeListener.kt │ │ │ │ │ ├── LibraryEntryRemoteMediator.kt │ │ │ │ │ ├── LibraryRepository.kt │ │ │ │ │ ├── MangaRepository.kt │ │ │ │ │ ├── MappingRepository.kt │ │ │ │ │ ├── MediaUnitRepository.kt │ │ │ │ │ ├── ProfileLinkRepository.kt │ │ │ │ │ └── UserRepository.kt │ │ │ │ ├── source/ │ │ │ │ │ ├── local/ │ │ │ │ │ │ ├── LocalDatabase.kt │ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ │ ├── AccessTokenLocalDataSource.kt │ │ │ │ │ │ │ ├── AccessTokenPreference.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── LocalAccessToken.kt │ │ │ │ │ │ ├── character/ │ │ │ │ │ │ │ └── LocalCharacter.kt │ │ │ │ │ │ ├── library/ │ │ │ │ │ │ │ ├── LibraryLocalDataSource.kt │ │ │ │ │ │ │ ├── LocalLibraryConverters.kt │ │ │ │ │ │ │ ├── dao/ │ │ │ │ │ │ │ │ ├── LibraryEntryDao.kt │ │ │ │ │ │ │ │ ├── LibraryEntryModificationDao.kt │ │ │ │ │ │ │ │ ├── LibraryEntryWithModificationDao.kt │ │ │ │ │ │ │ │ └── RemoteKeyDao.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ ├── LocalImage.kt │ │ │ │ │ │ │ ├── LocalLibraryEntry.kt │ │ │ │ │ │ │ ├── LocalLibraryEntryModification.kt │ │ │ │ │ │ │ ├── LocalLibraryEntryWithModification.kt │ │ │ │ │ │ │ ├── LocalLibraryMedia.kt │ │ │ │ │ │ │ ├── LocalLibraryModificationState.kt │ │ │ │ │ │ │ ├── LocalLibraryStatus.kt │ │ │ │ │ │ │ ├── LocalReactionSkip.kt │ │ │ │ │ │ │ └── RemoteKeyEntity.kt │ │ │ │ │ │ └── user/ │ │ │ │ │ │ ├── UserLocalDataSource.kt │ │ │ │ │ │ ├── UserPreferences.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── LocalRatingSystemPreference.kt │ │ │ │ │ │ ├── LocalSfwFilterPreference.kt │ │ │ │ │ │ ├── LocalTitleLanguagePreference.kt │ │ │ │ │ │ └── LocalUser.kt │ │ │ │ │ └── network/ │ │ │ │ │ ├── BasePagingDataSource.kt │ │ │ │ │ ├── PageData.kt │ │ │ │ │ ├── algolia/ │ │ │ │ │ │ ├── AlgoliaKeyNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── AlgoliaKeyApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── NetworkAlgoliaKey.kt │ │ │ │ │ │ ├── NetworkAlgoliaKeyCollection.kt │ │ │ │ │ │ └── search/ │ │ │ │ │ │ ├── AlgoliaCharacterSearchResult.kt │ │ │ │ │ │ ├── AlgoliaImage.kt │ │ │ │ │ │ ├── AlgoliaMediaSearchKind.kt │ │ │ │ │ │ └── AlgoliaMediaSearchResult.kt │ │ │ │ │ ├── appupdate/ │ │ │ │ │ │ ├── AppReleaseNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── GitHubApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── NetworkGitHubRelease.kt │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── AccessTokenNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── AuthenticationApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── NetworkAccessToken.kt │ │ │ │ │ │ ├── ObtainAccessToken.kt │ │ │ │ │ │ └── RefreshAccessToken.kt │ │ │ │ │ ├── character/ │ │ │ │ │ │ ├── CharacterNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── CharacterApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── NetworkCharacter.kt │ │ │ │ │ │ ├── NetworkMediaCharacter.kt │ │ │ │ │ │ └── NetworkMediaCharacterRole.kt │ │ │ │ │ ├── library/ │ │ │ │ │ │ ├── LibraryEntryPagingDataSource.kt │ │ │ │ │ │ ├── LibraryNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── LibraryEntryApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── NetworkLibraryEntry.kt │ │ │ │ │ │ ├── NetworkLibraryStatus.kt │ │ │ │ │ │ └── NetworkReactionSkip.kt │ │ │ │ │ ├── mapping/ │ │ │ │ │ │ ├── MappingNetworkDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── MappingApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── NetworkMapping.kt │ │ │ │ │ ├── media/ │ │ │ │ │ │ ├── AnimeNetworkDataSource.kt │ │ │ │ │ │ ├── AnimePagingDataSource.kt │ │ │ │ │ │ ├── CastingNetworkDataSource.kt │ │ │ │ │ │ ├── CastingPagingDataSource.kt │ │ │ │ │ │ ├── CategoryNetworkDataSource.kt │ │ │ │ │ │ ├── ChapterNetworkDataSource.kt │ │ │ │ │ │ ├── ChapterPagingDataSource.kt │ │ │ │ │ │ ├── EpisodeNetworkDataSource.kt │ │ │ │ │ │ ├── EpisodePagingDataSource.kt │ │ │ │ │ │ ├── MangaNetworkDataSource.kt │ │ │ │ │ │ ├── MangaPagingDataSource.kt │ │ │ │ │ │ ├── TrendingAnimePagingDataSource.kt │ │ │ │ │ │ ├── TrendingMangaPagingDataSource.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ ├── AnimeApi.kt │ │ │ │ │ │ │ ├── CastingApi.kt │ │ │ │ │ │ │ ├── CategoryApi.kt │ │ │ │ │ │ │ ├── ChapterApi.kt │ │ │ │ │ │ │ ├── EpisodeApi.kt │ │ │ │ │ │ │ └── MangaApi.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── NetworkAnime.kt │ │ │ │ │ │ ├── NetworkAnimeSubtype.kt │ │ │ │ │ │ ├── NetworkManga.kt │ │ │ │ │ │ ├── NetworkMangaSubtype.kt │ │ │ │ │ │ ├── NetworkMedia.kt │ │ │ │ │ │ ├── NetworkRatingFrequencies.kt │ │ │ │ │ │ ├── NetworkReleaseStatus.kt │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ └── NetworkCategory.kt │ │ │ │ │ │ ├── production/ │ │ │ │ │ │ │ ├── NetworkAnimeProduction.kt │ │ │ │ │ │ │ ├── NetworkAnimeProductionRole.kt │ │ │ │ │ │ │ ├── NetworkCasting.kt │ │ │ │ │ │ │ ├── NetworkPerson.kt │ │ │ │ │ │ │ └── NetworkProducer.kt │ │ │ │ │ │ ├── relationship/ │ │ │ │ │ │ │ ├── NetworkMediaRelationship.kt │ │ │ │ │ │ │ └── NetworkMediaRelationshipRole.kt │ │ │ │ │ │ ├── streamer/ │ │ │ │ │ │ │ ├── NetworkStreamer.kt │ │ │ │ │ │ │ └── NetworkStreamingLink.kt │ │ │ │ │ │ └── unit/ │ │ │ │ │ │ ├── NetworkChapter.kt │ │ │ │ │ │ ├── NetworkEpisode.kt │ │ │ │ │ │ └── NetworkMediaUnit.kt │ │ │ │ │ └── user/ │ │ │ │ │ ├── FavoriteNetworkDataSource.kt │ │ │ │ │ ├── ProfileLinkNetworkDataSource.kt │ │ │ │ │ ├── UserNetworkDataSource.kt │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── FavoriteApi.kt │ │ │ │ │ │ ├── ProfileLinkApi.kt │ │ │ │ │ │ ├── UserApi.kt │ │ │ │ │ │ └── UserImageUploadApi.kt │ │ │ │ │ └── model/ │ │ │ │ │ ├── NetworkFavorite.kt │ │ │ │ │ ├── NetworkRatingSystemPreference.kt │ │ │ │ │ ├── NetworkSfwFilterPreference.kt │ │ │ │ │ ├── NetworkTitleLanguagePreference.kt │ │ │ │ │ ├── NetworkUser.kt │ │ │ │ │ ├── NetworkUserImageUpload.kt │ │ │ │ │ ├── profilelinks/ │ │ │ │ │ │ ├── NetworkProfileLink.kt │ │ │ │ │ │ └── NetworkProfileLinkSite.kt │ │ │ │ │ └── stats/ │ │ │ │ │ ├── NetworkAmountConsumedPercentiles.kt │ │ │ │ │ ├── NetworkUserStats.kt │ │ │ │ │ ├── NetworkUserStatsData.kt │ │ │ │ │ └── NetworkUserStatsKind.kt │ │ │ │ └── utils/ │ │ │ │ └── InvalidatingPagingSourceFactory.kt │ │ │ ├── di/ │ │ │ │ ├── AppModule.kt │ │ │ │ ├── DataModule.kt │ │ │ │ ├── DatabaseModule.kt │ │ │ │ ├── DomainModule.kt │ │ │ │ ├── NetworkModule.kt │ │ │ │ └── ViewModelModule.kt │ │ │ ├── domain/ │ │ │ │ ├── algolia/ │ │ │ │ │ ├── FilterCollection.kt │ │ │ │ │ └── SearchProvider.kt │ │ │ │ ├── auth/ │ │ │ │ │ ├── IsUserLoggedInUseCase.kt │ │ │ │ │ ├── LogInUserUseCase.kt │ │ │ │ │ ├── LogOutUserUseCase.kt │ │ │ │ │ ├── LoginResult.kt │ │ │ │ │ ├── RefreshAccessTokenIfExpiredUseCase.kt │ │ │ │ │ ├── RefreshAccessTokenUseCase.kt │ │ │ │ │ └── RefreshResult.kt │ │ │ │ ├── library/ │ │ │ │ │ ├── FetchLibraryEntriesForWidgetUseCase.kt │ │ │ │ │ ├── GetLibraryEntriesWithModificationsPagerUseCase.kt │ │ │ │ │ ├── LibraryEntryUpdateResult.kt │ │ │ │ │ ├── SearchLibraryEntriesWithLocalModificationsPagerUseCase.kt │ │ │ │ │ ├── SynchronizeLocalLibraryModificationsUseCase.kt │ │ │ │ │ ├── UpdateLibraryEntryProgressUseCase.kt │ │ │ │ │ ├── UpdateLibraryEntryRatingUseCase.kt │ │ │ │ │ └── UpdateLibraryEntryUseCase.kt │ │ │ │ ├── user/ │ │ │ │ │ ├── GetLocalUserIdUseCase.kt │ │ │ │ │ └── UpdateLocalUserUseCase.kt │ │ │ │ └── work/ │ │ │ │ └── UpdateLibraryWidgetUseCase.kt │ │ │ ├── notification/ │ │ │ │ ├── NotificationChannels.kt │ │ │ │ └── Notifications.kt │ │ │ ├── preference/ │ │ │ │ ├── CategoryPrefWrapper.kt │ │ │ │ ├── KitsunePref.kt │ │ │ │ └── StartPagePref.kt │ │ │ ├── ui/ │ │ │ │ ├── adapter/ │ │ │ │ │ ├── AbstractMediaRecyclerViewAdapter.kt │ │ │ │ │ ├── CharacterAdapter.kt │ │ │ │ │ ├── MediaCharacterAdapter.kt │ │ │ │ │ ├── MediaMappingsAdapter.kt │ │ │ │ │ ├── MediaRecyclerViewAdapter.kt │ │ │ │ │ ├── MediaRelationshipRecyclerViewAdapter.kt │ │ │ │ │ ├── MediaRelationshipViewHolder.kt │ │ │ │ │ ├── MediaViewHolder.kt │ │ │ │ │ ├── OnItemClickListener.kt │ │ │ │ │ ├── StreamingLinkAdapter.kt │ │ │ │ │ └── paging/ │ │ │ │ │ ├── AnimeAdapter.kt │ │ │ │ │ ├── CharacterPagingAdapter.kt │ │ │ │ │ ├── LibraryEntriesAdapter.kt │ │ │ │ │ ├── MangaAdapter.kt │ │ │ │ │ ├── MediaPagingAdapter.kt │ │ │ │ │ ├── MediaSearchPagingAdapter.kt │ │ │ │ │ ├── MediaUnitPagingAdapter.kt │ │ │ │ │ └── ResourceLoadStateAdapter.kt │ │ │ │ ├── authentication/ │ │ │ │ │ ├── AuthenticationActivity.kt │ │ │ │ │ ├── LoggedInUserView.kt │ │ │ │ │ ├── LoginFormState.kt │ │ │ │ │ ├── LoginResultUi.kt │ │ │ │ │ └── LoginViewModel.kt │ │ │ │ ├── base/ │ │ │ │ │ ├── BaseActivity.kt │ │ │ │ │ ├── BaseDialogFragment.kt │ │ │ │ │ ├── BaseFragment.kt │ │ │ │ │ └── BasePreferenceFragment.kt │ │ │ │ ├── component/ │ │ │ │ │ ├── CustomNumberSpinner.kt │ │ │ │ │ ├── ExpandableLayout.kt │ │ │ │ │ ├── ExploreSection.kt │ │ │ │ │ ├── LayoutResourceLoadingLoadState.kt │ │ │ │ │ ├── LoadStateSpanSizeLookup.kt │ │ │ │ │ ├── MediaItemCard.kt │ │ │ │ │ ├── NestedScrollableHost.kt │ │ │ │ │ ├── PhotoViewNestedScrollView.kt │ │ │ │ │ ├── ResponsiveGridLayoutManager.kt │ │ │ │ │ ├── UniqueStateRecyclerView.kt │ │ │ │ │ ├── algolia/ │ │ │ │ │ │ ├── SeasonListPresenter.kt │ │ │ │ │ │ └── range/ │ │ │ │ │ │ ├── CustomFilterRangeConnectionFilterState.kt │ │ │ │ │ │ ├── CustomFilterRangeConnector.kt │ │ │ │ │ │ ├── CustomNumberRangeConnectionView.kt │ │ │ │ │ │ ├── CustomNumberRangeView.kt │ │ │ │ │ │ └── IntNumberRangeView.kt │ │ │ │ │ └── chart/ │ │ │ │ │ ├── BarChartStyle.kt │ │ │ │ │ ├── BaseChartStyle.kt │ │ │ │ │ ├── CustomPercentFormatter.kt │ │ │ │ │ ├── NonZeroLargeValueFormatter.kt │ │ │ │ │ ├── PieChartStyle.kt │ │ │ │ │ └── StepAxisValueFormatter.kt │ │ │ │ ├── details/ │ │ │ │ │ ├── DetailsFragment.kt │ │ │ │ │ ├── DetailsViewModel.kt │ │ │ │ │ ├── ManageLibraryBottomSheet.kt │ │ │ │ │ ├── MediaMappingsBottomSheet.kt │ │ │ │ │ ├── characters/ │ │ │ │ │ │ ├── CharacterDetailsBottomSheet.kt │ │ │ │ │ │ ├── CharacterDetailsViewModel.kt │ │ │ │ │ │ ├── CharacterFilterAdapter.kt │ │ │ │ │ │ ├── CharactersFragment.kt │ │ │ │ │ │ └── CharactersViewModel.kt │ │ │ │ │ └── episodes/ │ │ │ │ │ ├── EpisodesFragment.kt │ │ │ │ │ ├── EpisodesViewModel.kt │ │ │ │ │ └── MediaUnitDetailsBottomSheet.kt │ │ │ │ ├── library/ │ │ │ │ │ ├── LibraryFragment.kt │ │ │ │ │ ├── LibraryViewModel.kt │ │ │ │ │ ├── RatingBottomSheet.kt │ │ │ │ │ └── editentry/ │ │ │ │ │ ├── LibraryEditEntryFragment.kt │ │ │ │ │ └── LibraryEditEntryViewModel.kt │ │ │ │ ├── main/ │ │ │ │ │ ├── HomeExploreFragment.kt │ │ │ │ │ ├── HomeExploreViewPagerAdapter.kt │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── MainActivityViewModel.kt │ │ │ │ │ ├── MainFragment.kt │ │ │ │ │ └── MainFragmentViewModel.kt │ │ │ │ ├── medialist/ │ │ │ │ │ ├── MediaListFragment.kt │ │ │ │ │ └── MediaListViewModel.kt │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── OnboardingActivity.kt │ │ │ │ │ ├── OnboardingUiState.kt │ │ │ │ │ ├── OnboardingViewModel.kt │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CustomDialog.kt │ │ │ │ │ │ ├── ImagePresenter.kt │ │ │ │ │ │ ├── ImageSlideshow.kt │ │ │ │ │ │ ├── OnboardingNavigationControls.kt │ │ │ │ │ │ └── PreferenceCard.kt │ │ │ │ │ └── pages/ │ │ │ │ │ ├── LoginPage.kt │ │ │ │ │ ├── SetupPage.kt │ │ │ │ │ └── WelcomePage.kt │ │ │ │ ├── permissions/ │ │ │ │ │ └── NotificationPermission.kt │ │ │ │ ├── photoview/ │ │ │ │ │ └── PhotoViewActivity.kt │ │ │ │ ├── profile/ │ │ │ │ │ ├── ProfileFragment.kt │ │ │ │ │ ├── ProfileStatsAdapter.kt │ │ │ │ │ ├── ProfileViewModel.kt │ │ │ │ │ └── editprofile/ │ │ │ │ │ ├── CharacterSearchResultAdapter.kt │ │ │ │ │ ├── EditProfileFragment.kt │ │ │ │ │ ├── EditProfileLinkBottomSheet.kt │ │ │ │ │ ├── EditProfileViewModel.kt │ │ │ │ │ └── SelectProfileLinkSiteBottomSheet.kt │ │ │ │ ├── search/ │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchViewModel.kt │ │ │ │ │ ├── categories/ │ │ │ │ │ │ ├── CategoriesDialogFragment.kt │ │ │ │ │ │ ├── CategoriesViewModel.kt │ │ │ │ │ │ └── CategoryViewHolder.kt │ │ │ │ │ └── filter/ │ │ │ │ │ ├── FacetFragment.kt │ │ │ │ │ └── FilterFacetListViewHolder.kt │ │ │ │ ├── settings/ │ │ │ │ │ ├── AppLogsFragment.kt │ │ │ │ │ ├── AppLogsViewModel.kt │ │ │ │ │ ├── AppearanceFragment.kt │ │ │ │ │ ├── OSLibrariesFragment.kt │ │ │ │ │ ├── SettingsFragment.kt │ │ │ │ │ ├── SettingsViewModel.kt │ │ │ │ │ └── ThemePickerPreference.kt │ │ │ │ ├── theme/ │ │ │ │ │ ├── MdcThemeAdapter.kt │ │ │ │ │ └── Theme.kt │ │ │ │ ├── webview/ │ │ │ │ │ └── WebViewFragment.kt │ │ │ │ └── widget/ │ │ │ │ ├── KitsuneWidgetReceiver.kt │ │ │ │ ├── KitsuneWidgetTheme.kt │ │ │ │ ├── LibraryAppWidget.kt │ │ │ │ └── WidgetUtils.kt │ │ │ ├── util/ │ │ │ │ ├── DataUtil.kt │ │ │ │ ├── DateUtil.kt │ │ │ │ ├── ItemClickListener.kt │ │ │ │ ├── KitsuUrlReplacer.kt │ │ │ │ ├── LogCatReader.kt │ │ │ │ ├── LogUtil.kt │ │ │ │ ├── SaveImage.kt │ │ │ │ ├── TimeUtil.kt │ │ │ │ ├── extensions/ │ │ │ │ │ ├── ActivityExtensions.kt │ │ │ │ │ ├── FragmentExtensions.kt │ │ │ │ │ └── OtherExtensions.kt │ │ │ │ ├── json/ │ │ │ │ │ ├── AlgoliaFacetValueDeserializer.kt │ │ │ │ │ ├── AlgoliaNumericValueDeserializer.kt │ │ │ │ │ ├── IgnoreParcelablePropertyMixin.kt │ │ │ │ │ └── NullableIntSerializer.kt │ │ │ │ ├── network/ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ ├── ResponseData.kt │ │ │ │ │ └── UserAgentInterceptor.kt │ │ │ │ ├── rating/ │ │ │ │ │ ├── RatingFrequenciesUtil.kt │ │ │ │ │ └── RatingSystemUtil.kt │ │ │ │ └── ui/ │ │ │ │ ├── BindingAdapter.kt │ │ │ │ ├── DateValidatorPointBetween.kt │ │ │ │ ├── ProfileSiteLogo.kt │ │ │ │ ├── RoundBitmapDrawable.kt │ │ │ │ ├── SnackbarUtils.kt │ │ │ │ └── WindowInsetsUtil.kt │ │ │ └── work/ │ │ │ ├── SyncLibraryEntriesForWidgetWorker.kt │ │ │ └── UpdateLibraryWidgetWorker.kt │ │ └── res/ │ │ ├── anim/ │ │ │ ├── slide_down.xml │ │ │ └── slide_up.xml │ │ ├── animator/ │ │ │ ├── scale_enter_anim.xml │ │ │ ├── scale_exit_anim.xml │ │ │ ├── scale_pop_enter_anim.xml │ │ │ └── scale_pop_exit_anim.xml │ │ ├── color/ │ │ │ ├── subtype_badge_background.xml │ │ │ ├── translucent_overlay.xml │ │ │ └── translucent_status_bar.xml │ │ ├── drawable/ │ │ │ ├── animated_favorite.xml │ │ │ ├── badge_background.xml │ │ │ ├── bottom_edge_fade.xml │ │ │ ├── bottom_edge_fade_surface.xml │ │ │ ├── cover_placeholder.xml │ │ │ ├── explore_section_divider.xml │ │ │ ├── ic_add_24.xml │ │ │ ├── ic_add_a_photo_24.xml │ │ │ ├── ic_amazon.xml │ │ │ ├── ic_animelab.xml │ │ │ ├── ic_arrow_back_24.xml │ │ │ ├── ic_arrow_drop_down_24.xml │ │ │ ├── ic_arrow_forward_24.xml │ │ │ ├── ic_bar_chart_16.xml │ │ │ ├── ic_battle_net.xml │ │ │ ├── ic_bookmark_added_24.xml │ │ │ ├── ic_cake_24.xml │ │ │ ├── ic_calendar_24.xml │ │ │ ├── ic_calendar_month_24.xml │ │ │ ├── ic_cancel_presentation_24.xml │ │ │ ├── ic_check_24.xml │ │ │ ├── ic_close_24.xml │ │ │ ├── ic_cloud_off_16.xml │ │ │ ├── ic_code_24.xml │ │ │ ├── ic_contv.xml │ │ │ ├── ic_crunchyroll.xml │ │ │ ├── ic_dailymotion.xml │ │ │ ├── ic_delete_24.xml │ │ │ ├── ic_deviantart.xml │ │ │ ├── ic_discord.xml │ │ │ ├── ic_done_24.xml │ │ │ ├── ic_dribbble.xml │ │ │ ├── ic_edit_24.xml │ │ │ ├── ic_emoji_events_24.xml │ │ │ ├── ic_facebook.xml │ │ │ ├── ic_favorite_24.xml │ │ │ ├── ic_favorite_border_24.xml │ │ │ ├── ic_filter_24.xml │ │ │ ├── ic_funimation.xml │ │ │ ├── ic_github.xml │ │ │ ├── ic_google_plus.xml │ │ │ ├── ic_heart_broken_24.xml │ │ │ ├── ic_hidive.xml │ │ │ ├── ic_home_24.xml │ │ │ ├── ic_hulu.xml │ │ │ ├── ic_imdb.xml │ │ │ ├── ic_incomplete_circle_24.xml │ │ │ ├── ic_insert_photo_48.xml │ │ │ ├── ic_instagram.xml │ │ │ ├── ic_keyboard_arrow_down_24.xml │ │ │ ├── ic_kickstarter.xml │ │ │ ├── ic_lastfm.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ ├── ic_letterboxd.xml │ │ │ ├── ic_location_24.xml │ │ │ ├── ic_medium.xml │ │ │ ├── ic_mobcrush.xml │ │ │ ├── ic_more_vert.xml │ │ │ ├── ic_netflix.xml │ │ │ ├── ic_notification_icon.xml │ │ │ ├── ic_open_in_browser_24.xml │ │ │ ├── ic_open_in_new_24.xml │ │ │ ├── ic_osu.xml │ │ │ ├── ic_outline_bookmarks_24.xml │ │ │ ├── ic_outline_explore_24.xml │ │ │ ├── ic_outline_home_24.xml │ │ │ ├── ic_outline_info_24.xml │ │ │ ├── ic_outline_person_24.xml │ │ │ ├── ic_outline_view_list_24.xml │ │ │ ├── ic_patreon.xml │ │ │ ├── ic_person_24.xml │ │ │ ├── ic_player_me.xml │ │ │ ├── ic_raptr.xml │ │ │ ├── ic_reddit.xml │ │ │ ├── ic_remove_24.xml │ │ │ ├── ic_restore_24.xml │ │ │ ├── ic_save_24.xml │ │ │ ├── ic_save_alt_24.xml │ │ │ ├── ic_schedule_24.xml │ │ │ ├── ic_search_24.xml │ │ │ ├── ic_settings_24.xml │ │ │ ├── ic_share_24.xml │ │ │ ├── ic_shortcut_library_24.xml │ │ │ ├── ic_shortcut_search_24.xml │ │ │ ├── ic_shortcut_settings_24.xml │ │ │ ├── ic_soundcloud.xml │ │ │ ├── ic_splashscreen.xml │ │ │ ├── ic_star_24.xml │ │ │ ├── ic_star_outline_24.xml │ │ │ ├── ic_steam.xml │ │ │ ├── ic_sync_24.xml │ │ │ ├── ic_trakt.xml │ │ │ ├── ic_tubitv.xml │ │ │ ├── ic_tumblr.xml │ │ │ ├── ic_twitch.xml │ │ │ ├── ic_twitter.xml │ │ │ ├── ic_view_list_24.xml │ │ │ ├── ic_vimeo.xml │ │ │ ├── ic_vrv.xml │ │ │ ├── ic_watch_later_24.xml │ │ │ ├── ic_website.xml │ │ │ ├── ic_youtube.xml │ │ │ ├── onboarding_login_logo.xml │ │ │ ├── profile_picture_placeholder.xml │ │ │ ├── progress_horizontal.xml │ │ │ ├── radial_edge_fade.xml │ │ │ ├── rectangle_background.xml │ │ │ ├── selectable_item_background.xml │ │ │ ├── selector_home.xml │ │ │ ├── selector_library.xml │ │ │ ├── selector_profile.xml │ │ │ ├── selector_search.xml │ │ │ ├── top_edge_fade.xml │ │ │ ├── top_edge_fade_surface.xml │ │ │ ├── translucent_background.xml │ │ │ └── widget_rounded_rect.xml │ │ ├── drawable-night/ │ │ │ └── progress_horizontal.xml │ │ ├── layout/ │ │ │ ├── activity_authentication.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_photo_view.xml │ │ │ ├── custom_edit_text_preference.xml │ │ │ ├── custom_number_spinner.xml │ │ │ ├── custom_preference_switch.xml │ │ │ ├── fragment_app_logs.xml │ │ │ ├── fragment_categories.xml │ │ │ ├── fragment_characters.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_edit_library_entry.xml │ │ │ ├── fragment_edit_profile.xml │ │ │ ├── fragment_filter_facet.xml │ │ │ ├── fragment_home_explore.xml │ │ │ ├── fragment_library.xml │ │ │ ├── fragment_main.xml │ │ │ ├── fragment_media_list.xml │ │ │ ├── fragment_os_libraries.xml │ │ │ ├── fragment_preference.xml │ │ │ ├── fragment_profile.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_web_view.xml │ │ │ ├── item_category_node.xml │ │ │ ├── item_character.xml │ │ │ ├── item_character_filter.xml │ │ │ ├── item_character_search_result.xml │ │ │ ├── item_details_info_row.xml │ │ │ ├── item_dropdown.xml │ │ │ ├── item_episode.xml │ │ │ ├── item_facet.xml │ │ │ ├── item_library_entry.xml │ │ │ ├── item_library_status_separator.xml │ │ │ ├── item_list_option.xml │ │ │ ├── item_media.xml │ │ │ ├── item_media_mapping.xml │ │ │ ├── item_network_state.xml │ │ │ ├── item_profile_site_chip.xml │ │ │ ├── item_profile_stats.xml │ │ │ ├── item_single_character.xml │ │ │ ├── item_streamer.xml │ │ │ ├── item_theme_option.xml │ │ │ ├── layout_resource_loading.xml │ │ │ ├── layout_search_provider_loading.xml │ │ │ ├── layout_theme_picker_preference.xml │ │ │ ├── section_details_description.xml │ │ │ ├── section_details_info.xml │ │ │ ├── section_details_stats.xml │ │ │ ├── section_details_trailer.xml │ │ │ ├── section_main_explore.xml │ │ │ ├── sheet_character_details.xml │ │ │ ├── sheet_edit_profile_link.xml │ │ │ ├── sheet_library_rating.xml │ │ │ ├── sheet_manage_library.xml │ │ │ ├── sheet_media_mappings.xml │ │ │ ├── sheet_media_unit_details.xml │ │ │ └── sheet_select_profile_link_site.xml │ │ ├── layout-w600dp/ │ │ │ └── activity_main.xml │ │ ├── menu/ │ │ │ ├── category_dialog_menu.xml │ │ │ ├── details_menu.xml │ │ │ ├── filter_facet_menu.xml │ │ │ ├── library_menu.xml │ │ │ ├── logs_menu.xml │ │ │ ├── main_nav_menu.xml │ │ │ ├── profile_menu.xml │ │ │ └── webview_menu.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── navigation/ │ │ │ ├── main_nav_graph.xml │ │ │ └── settings_nav_graph.xml │ │ ├── resources.properties │ │ ├── values/ │ │ │ ├── MdcThemeAdapter.xml │ │ │ ├── arrays.xml │ │ │ ├── attr.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── integers.xml │ │ │ ├── preference_keys.xml │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ └── themes.xml │ │ ├── values-af/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-es/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-land/ │ │ │ └── dimens.xml │ │ ├── values-night/ │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-pt-rBR/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-ta/ │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ └── strings.xml │ │ ├── values-v31/ │ │ │ └── styles.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-w1240dp/ │ │ │ └── dimens.xml │ │ ├── values-zh-rCN/ │ │ │ └── strings.xml │ │ ├── xml/ │ │ │ ├── app_preferences.xml │ │ │ ├── appearance_preferences.xml │ │ │ ├── backup_rules.xml │ │ │ ├── backup_rules_sdk31.xml │ │ │ ├── filepaths.xml │ │ │ └── library_widget_info.xml │ │ └── xml-v25/ │ │ └── shortcuts.xml │ └── test/ │ ├── java/ │ │ └── io/ │ │ └── github/ │ │ └── drumber/ │ │ └── kitsune/ │ │ ├── archunit/ │ │ │ └── ArchUnitTest.kt │ │ ├── data/ │ │ │ ├── mapper/ │ │ │ │ ├── AuthMapperTest.kt │ │ │ │ ├── CharacterMapperTest.kt │ │ │ │ ├── MediaMapperTest.kt │ │ │ │ └── UserMapperTest.kt │ │ │ ├── presentation/ │ │ │ │ └── model/ │ │ │ │ ├── library/ │ │ │ │ │ ├── LibraryEntryModificationTest.kt │ │ │ │ │ └── LibraryEntryWithModificationTest.kt │ │ │ │ └── media/ │ │ │ │ └── MediaTest.kt │ │ │ ├── repository/ │ │ │ │ ├── AccessTokenRepositoryTest.kt │ │ │ │ ├── AlgoliaKeyRepositoryTest.kt │ │ │ │ ├── AppUpdateRepositoryTest.kt │ │ │ │ ├── LibraryRepositoryTest.kt │ │ │ │ └── UserRepositoryTest.kt │ │ │ └── source/ │ │ │ ├── local/ │ │ │ │ ├── auth/ │ │ │ │ │ └── LocalAccessTokenTest.kt │ │ │ │ └── library/ │ │ │ │ └── model/ │ │ │ │ └── LocalLibraryEntryModificationTest.kt │ │ │ └── network/ │ │ │ └── PageDataTest.kt │ │ ├── domain/ │ │ │ ├── auth/ │ │ │ │ ├── LogInUserUseCaseTest.kt │ │ │ │ ├── LogOutUserUseCaseTest.kt │ │ │ │ ├── RefreshAccessTokenIfExpiredUseCaseTest.kt │ │ │ │ └── RefreshAccessTokenUseCaseTest.kt │ │ │ ├── library/ │ │ │ │ └── SynchronizeLocalLibraryModificationsUseCaseTest.kt │ │ │ └── user/ │ │ │ └── UpdateLocalUserUseCaseTest.kt │ │ ├── testutils/ │ │ │ ├── AndroidLoggerMock.kt │ │ │ ├── FakeCharacter.kt │ │ │ ├── FakeImage.kt │ │ │ ├── FakeLibraryEntry.kt │ │ │ ├── FakeLibraryEntryModification.kt │ │ │ ├── FakeMedia.kt │ │ │ ├── FakeUser.kt │ │ │ ├── KoinTestModules.kt │ │ │ ├── SuspendFunctionHelper.kt │ │ │ └── network/ │ │ │ ├── FakeHttpException.kt │ │ │ └── NoOpAuthenticationInterceptor.kt │ │ └── util/ │ │ ├── DateUtilTest.kt │ │ └── rating/ │ │ └── RatingFrequenciesUtilTest.kt │ └── resources/ │ └── mockito-extensions/ │ └── org.mockito.plugins.MockMaker ├── build.gradle.kts ├── docs/ │ └── hidden-actions.md ├── fastlane/ │ ├── Appfile │ ├── Fastfile │ ├── README.md │ ├── Workflow.md │ └── metadata/ │ └── android/ │ ├── en-US/ │ │ ├── changelogs/ │ │ │ ├── 25.txt │ │ │ ├── 26.txt │ │ │ ├── 27.txt │ │ │ ├── 28.txt │ │ │ ├── 29.txt │ │ │ ├── 30.txt │ │ │ ├── 31.txt │ │ │ ├── 32.txt │ │ │ ├── 33.txt │ │ │ ├── 34.txt │ │ │ ├── 35.txt │ │ │ ├── 36.txt │ │ │ ├── 37.txt │ │ │ ├── 38.txt │ │ │ └── 39.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ ├── title.txt │ │ └── video.txt │ └── zh-CN/ │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── plugin/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── settings.gradle.kts │ └── src/ │ └── main/ │ └── java/ │ └── io/ │ └── github/ │ └── drumber/ │ └── plugin/ │ ├── CustomPlugin.kt │ ├── ExtractLocalesTask.kt │ └── ReplaceShortcutsPackageTask.kt └── settings.gradle.kts