├── .github ├── assets │ ├── Screenshot_1.jpg │ ├── Screenshot_2.jpg │ ├── Screenshot_3.jpg │ ├── Screenshot_4.jpg │ ├── Screenshot_5.jpg │ ├── Screenshot_6.jpg │ ├── favorites.jpg │ ├── home.jpg │ ├── manage_accounts.jpg │ ├── more_info.jpg │ ├── search.jpg │ └── viewer.jpg └── user_deactivation │ ├── INSTRUCTION.md │ └── deactivation.jpg ├── .gitignore ├── LICENSE ├── PRIVACY_POLICY.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ ├── MainActivity.kt │ │ ├── MikanseiApp.kt │ │ ├── MikanseiEnvironment.kt │ │ ├── MikanseiModule.kt │ │ └── ui │ │ ├── MainScreen.kt │ │ ├── MainViewModel.kt │ │ ├── appbars │ │ ├── MainBottomNavigationBar.kt │ │ ├── MainNavigationItems.kt │ │ └── MainNavigationRail.kt │ │ ├── content │ │ ├── MainContentCompact.kt │ │ ├── MainContentMediumWide.kt │ │ └── MainContentResponsive.kt │ │ ├── core │ │ └── ShareDownloadDialog.kt │ │ └── navgraphs │ │ ├── BottomNavGraph.kt │ │ └── MainNavGraph.kt │ └── res │ ├── drawable │ ├── ic_launcher_foreground.xml │ └── ic_launcher_monochrome.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── values-night │ └── themes.xml │ ├── values-v23 │ └── themes.xml │ ├── values-v27 │ └── themes.xml │ ├── values │ ├── ic_launcher_background.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ ├── data_extraction_rules.xml │ └── provider_paths.xml ├── build.gradle ├── core ├── danbooru │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── danbooru │ │ ├── DanbooruApi.kt │ │ ├── DanbooruModule.kt │ │ ├── DanbooruRepositoryImpl.kt │ │ ├── annotation │ │ ├── NoAuth.kt │ │ └── NoSafeHost.kt │ │ ├── interceptor │ │ ├── DanbooruAuthInterceptor.kt │ │ ├── DanbooruHostInterceptor.kt │ │ ├── ForceCacheResponseInterceptor.kt │ │ ├── ForceLoadFromCacheInterceptor.kt │ │ ├── ForceRefreshInterceptor.kt │ │ └── UserDelegationInterceptor.kt │ │ └── model │ │ ├── favorite │ │ ├── DanbooruFavorite.kt │ │ ├── DanbooruFavoriteGroup.kt │ │ └── FavoriteMapper.kt │ │ ├── post │ │ ├── DanbooruMediaAsset.kt │ │ ├── DanbooruPost.kt │ │ ├── DanbooruVariant.kt │ │ ├── PostMapper.kt │ │ ├── PostVoteMapper.kt │ │ └── vote │ │ │ └── DanbooruPostVote.kt │ │ ├── profile │ │ ├── DanbooruProfile.kt │ │ └── ProfileMapper.kt │ │ ├── saved_search │ │ ├── DanbooruSavedSearch.kt │ │ └── SavedSearchMapper.kt │ │ ├── tag │ │ ├── DanbooruTag.kt │ │ ├── DanbooruTagAutoComplete.kt │ │ ├── DanbooruTagPayload.kt │ │ └── TagMapper.kt │ │ └── user │ │ ├── DanbooruUser.kt │ │ ├── UserMapper.kt │ │ └── field │ │ ├── DanbooruUserField.kt │ │ └── DanbooruUserFieldData.kt ├── database │ ├── .gitignore │ ├── build.gradle │ ├── schemas │ │ └── com.uragiristereo.mikansei.core.database.MikanseiDatabase │ │ │ ├── 1.json │ │ │ └── 2.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── database │ │ ├── DatabaseConverters.kt │ │ ├── DatabaseModule.kt │ │ ├── MikanseiDatabase.kt │ │ ├── migration │ │ └── From1To2MigrationSpec.kt │ │ ├── post │ │ ├── PostDao.kt │ │ ├── PostMapper.kt │ │ ├── PostRepositoryImpl.kt │ │ └── PostRow.kt │ │ ├── search_history │ │ ├── SearchHistoryDao.kt │ │ └── SearchHistoryRow.kt │ │ ├── session │ │ ├── SessionDao.kt │ │ ├── SessionMapper.kt │ │ ├── SessionRepositoryImpl.kt │ │ └── SessionRow.kt │ │ ├── session_post │ │ ├── SessionPostDao.kt │ │ └── SessionPostRow.kt │ │ ├── tag_category │ │ ├── TagCategoryDao.kt │ │ ├── TagCategoryRepositoryImpl.kt │ │ └── TagCategoryRow.kt │ │ ├── user │ │ ├── UserDao.kt │ │ ├── UserMapper.kt │ │ ├── UserRepositoryImpl.kt │ │ └── UserRow.kt │ │ └── user_delegation │ │ ├── UserDelegationDao.kt │ │ ├── UserDelegationRepositoryImpl.kt │ │ └── UserDelegationRow.kt ├── domain │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── domain │ │ ├── DomainModule.kt │ │ ├── module │ │ ├── danbooru │ │ │ ├── DanbooruRepository.kt │ │ │ └── entity │ │ │ │ ├── Favorite.kt │ │ │ │ ├── FavoriteResult.kt │ │ │ │ ├── PostVote.kt │ │ │ │ ├── PostsResult.kt │ │ │ │ ├── Profile.kt │ │ │ │ ├── ProfileSettingsField.kt │ │ │ │ ├── SavedSearch.kt │ │ │ │ ├── Tag.kt │ │ │ │ └── User.kt │ │ ├── database │ │ │ ├── PostRepository.kt │ │ │ ├── SessionRepository.kt │ │ │ ├── TagCategoryRepository.kt │ │ │ ├── UserDelegationRepository.kt │ │ │ ├── UserRepository.kt │ │ │ └── entity │ │ │ │ └── Session.kt │ │ ├── network │ │ │ ├── DownloadBroadcastReceiver.kt │ │ │ ├── DownloadRepository.kt │ │ │ ├── NetworkRepository.kt │ │ │ └── entity │ │ │ │ ├── DownloadInfo.kt │ │ │ │ ├── DownloadInstance.kt │ │ │ │ └── DownloadResource.kt │ │ └── search │ │ │ ├── BrowseChipType.kt │ │ │ └── TagType.kt │ │ └── usecase │ │ ├── ConvertFileSizeUseCase.kt │ │ ├── DeactivateAccountUseCase.kt │ │ ├── DownloadPostUseCase.kt │ │ ├── DownloadPostWithNotificationUseCase.kt │ │ ├── FilterPostsUseCase.kt │ │ ├── GenerateChipsFromTagsUseCase.kt │ │ ├── GetCachedFavoriteGroupsUseCase.kt │ │ ├── GetFavoriteGroupsUseCase.kt │ │ ├── GetFavoritesAndFavoriteGroupsUseCase.kt │ │ ├── GetFavoritesUseCase.kt │ │ ├── GetPostsUseCase.kt │ │ ├── GetTagsAutoCompleteUseCase.kt │ │ ├── GetTagsUseCase.kt │ │ ├── PerformLoginUseCase.kt │ │ ├── SyncUserSettingsUseCase.kt │ │ └── UpdateUserSettingsUseCase.kt ├── model │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── model │ │ ├── CacheUtil.kt │ │ ├── Constants.kt │ │ ├── Environment.kt │ │ ├── FileUtil.kt │ │ ├── UnitConverter.kt │ │ ├── danbooru │ │ ├── DanbooruDateSerializer.kt │ │ ├── DanbooruHost.kt │ │ ├── Post.kt │ │ ├── Rating.kt │ │ └── ShareOption.kt │ │ ├── preferences │ │ ├── base │ │ │ ├── Preference.kt │ │ │ ├── PreferenceString.kt │ │ │ └── PreferenceStringRes.kt │ │ └── user │ │ │ ├── DetailSizePreference.kt │ │ │ └── RatingPreference.kt │ │ └── result │ │ ├── FailedResponseFormatter.kt │ │ └── Result.kt ├── network │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── network │ │ ├── DownloadRepositoryImpl.kt │ │ ├── MikanseiApi.kt │ │ ├── NetworkModule.kt │ │ └── NetworkRepositoryImpl.kt ├── preferences │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── preferences │ │ ├── PreferencesRepository.kt │ │ ├── PreferencesRepositoryImpl.kt │ │ ├── PreferencesSerializer.kt │ │ └── model │ │ ├── LanguagePreference.kt │ │ ├── Preferences.kt │ │ ├── ThemePreference.kt │ │ └── danbooru │ │ ├── DanbooruHostPreference.kt │ │ └── DanbooruHostPreferenceItem.kt ├── product │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── product │ │ ├── ProductModule.kt │ │ ├── component │ │ ├── ProductAlertDialog.kt │ │ ├── ProductDialog.kt │ │ ├── ProductPostPlaceholder.kt │ │ ├── ProductPullRefreshIndicator.kt │ │ ├── ProductSetSystemBarsColor.kt │ │ ├── ProductSystemBarsSpacer.kt │ │ └── ProductTopAppBar.kt │ │ ├── preference │ │ ├── BottomSheetPreference.kt │ │ ├── DropDownPreference.kt │ │ ├── LocalIconPadding.kt │ │ ├── PreferenceCategory.kt │ │ ├── PreferenceContainer.kt │ │ ├── RadioPreference.kt │ │ ├── RegularPreference.kt │ │ └── SwitchPreference.kt │ │ ├── shared │ │ ├── downloadshare │ │ │ ├── DownloadShareViewModel.kt │ │ │ ├── DownloadShareViewModelImpl.kt │ │ │ └── core │ │ │ │ └── DownloadState.kt │ │ └── postfavoritevote │ │ │ ├── PostFavoriteVote.kt │ │ │ ├── PostFavoriteVoteImpl.kt │ │ │ └── core │ │ │ ├── ScoreChips.kt │ │ │ └── ScoreState.kt │ │ └── theme │ │ ├── Color.kt │ │ ├── Shapes.kt │ │ ├── Theme.kt │ │ └── Type.kt ├── resources │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── res │ │ ├── drawable │ │ ├── add.xml │ │ ├── add_to_photos.xml │ │ ├── android.xml │ │ ├── api.xml │ │ ├── arrow_back.xml │ │ ├── aspect_ratio.xml │ │ ├── cached.xml │ │ ├── check_box.xml │ │ ├── check_box_outline_blank.xml │ │ ├── circle_fill.xml │ │ ├── close.xml │ │ ├── collections_bookmark.xml │ │ ├── collections_bookmark_fill.xml │ │ ├── construction.xml │ │ ├── content_copy.xml │ │ ├── contrast.xml │ │ ├── danbooru.png │ │ ├── danbooru_logo.webp │ │ ├── dark_mode.xml │ │ ├── dark_mode_fill.xml │ │ ├── delete.xml │ │ ├── description.xml │ │ ├── discord_icon.xml │ │ ├── done.xml │ │ ├── download.xml │ │ ├── download_done.xml │ │ ├── edit.xml │ │ ├── error.xml │ │ ├── expand_less.xml │ │ ├── expand_more.xml │ │ ├── explore.xml │ │ ├── explore_fill.xml │ │ ├── favorite.xml │ │ ├── favorite_fill.xml │ │ ├── filter_list.xml │ │ ├── format_color_fill.xml │ │ ├── github_icon.xml │ │ ├── history.xml │ │ ├── home.xml │ │ ├── home_fill.xml │ │ ├── image_not_supported.xml │ │ ├── info.xml │ │ ├── label_off.xml │ │ ├── light_mode.xml │ │ ├── light_mode_fill.xml │ │ ├── lightbulb.xml │ │ ├── link.xml │ │ ├── login.xml │ │ ├── menu.xml │ │ ├── mikansei_logo.xml │ │ ├── mop.xml │ │ ├── more_horiz.xml │ │ ├── more_vert.xml │ │ ├── no_sound.xml │ │ ├── north_west.xml │ │ ├── open_in_browser.xml │ │ ├── open_in_full.xml │ │ ├── pause_fill.xml │ │ ├── photo_library.xml │ │ ├── photo_library_fill.xml │ │ ├── play_arrow_fill.xml │ │ ├── public_globe.xml │ │ ├── search.xml │ │ ├── sell.xml │ │ ├── settings.xml │ │ ├── settings_account_box.xml │ │ ├── share.xml │ │ ├── translate.xml │ │ ├── undo.xml │ │ ├── update.xml │ │ ├── variable_add.xml │ │ ├── variable_insert.xml │ │ ├── variable_remove.xml │ │ ├── visibility_fill.xml │ │ ├── visibility_off.xml │ │ ├── visibility_off_fill.xml │ │ ├── volume_off.xml │ │ ├── volume_up.xml │ │ └── vpn_lock.xml │ │ ├── raw │ │ └── unsafe_tags.gz │ │ └── values │ │ └── strings.xml └── ui │ ├── .gitignore │ ├── build.gradle │ ├── navigation-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── core │ │ └── ui │ │ ├── CompositionLocals.kt │ │ ├── WindowSize.kt │ │ ├── animation │ │ ├── Hold.kt │ │ └── Translate.kt │ │ ├── composable │ │ ├── Banner.kt │ │ ├── Chips.kt │ │ ├── ClickableSection.kt │ │ ├── DimensionSubcomposeLayout.kt │ │ ├── DragHandle.kt │ │ ├── NavigationBarSpacer.kt │ │ ├── NavigationRail.kt │ │ ├── OverlappingLayout.kt │ │ ├── OverlineTitle.kt │ │ ├── PostHeader.kt │ │ ├── RailScaffold.kt │ │ ├── Scaffold2.kt │ │ ├── SectionTitle.kt │ │ ├── SetSystemBarsColors.kt │ │ ├── SettingTip.kt │ │ ├── SettingToggle.kt │ │ └── SidesGradient.kt │ │ ├── database │ │ └── SavedSearchItem.kt │ │ ├── entity │ │ ├── ImmutableList.kt │ │ └── ImmutableWrapper.kt │ │ ├── extension │ │ ├── Channel.kt │ │ ├── Color.kt │ │ ├── Context.kt │ │ ├── Modifier.kt │ │ ├── NavController.kt │ │ ├── PaddingValues.kt │ │ ├── String.kt │ │ ├── Window.kt │ │ └── WindowInsets.kt │ │ ├── modalbottomsheet │ │ ├── Constants.kt │ │ ├── ModalBottomSheet3.android.kt │ │ ├── ModalBottomSheet3.kt │ │ ├── SheetDefaults.kt │ │ ├── internal │ │ │ ├── AnchoredDraggable.kt │ │ │ ├── DragGestureDetectorCopy.kt │ │ │ ├── InternalMutatorMutex.android.kt │ │ │ ├── InternalMutatorMutex.kt │ │ │ ├── MutablePaddingValues.kt │ │ │ ├── PlatformOptimizedCancellationException.android.kt │ │ │ └── PredictiveBack.kt │ │ └── navigator │ │ │ ├── BottomSheetNavigator.kt │ │ │ └── BottomSheetNavigatorProvider.kt │ │ ├── navigation │ │ ├── HomeRoute.kt │ │ ├── MainRoute.kt │ │ ├── NavRoute.kt │ │ ├── NavTypeMapOf.kt │ │ ├── SavedSearchesRoute.kt │ │ ├── SettingsRoute.kt │ │ └── UserRoute.kt │ │ ├── shared │ │ └── SharedViewModel.kt │ │ └── view │ │ └── SelectionAwareEditText.kt │ └── res │ └── values │ └── styles.xml ├── feature ├── about │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── about │ │ ├── AboutModule.kt │ │ ├── AboutScreen.kt │ │ ├── AboutViewModel.kt │ │ ├── contibutor │ │ └── ContributorItem.kt │ │ ├── data │ │ ├── AboutRepositoryImpl.kt │ │ ├── GitHubApi.kt │ │ └── model │ │ │ └── contributor │ │ │ ├── GitHubContributorMapper.kt │ │ │ └── GitHubContributorResponse.kt │ │ └── domain │ │ ├── AboutRepository.kt │ │ └── entity │ │ └── GitHubContributor.kt ├── filters │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── filters │ │ ├── FiltersScreen.kt │ │ ├── FiltersViewModel.kt │ │ ├── appbars │ │ └── FiltersTopAppBar.kt │ │ ├── column │ │ ├── FilterItem.kt │ │ ├── FiltersColumn.kt │ │ └── FiltersColumnItem.kt │ │ └── core │ │ ├── FiltersAddTagsDialog.kt │ │ ├── FiltersFab.kt │ │ ├── FiltersModalBottomSheet.kt │ │ └── FiltersNavigation.kt ├── home │ ├── .gitignore │ ├── build.gradle │ ├── favorites │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── home │ │ │ └── favorites │ │ │ ├── FavoritesModule.kt │ │ │ ├── FavoritesScreen.kt │ │ │ ├── FavoritesViewModel.kt │ │ │ ├── core │ │ │ ├── FavoritesTopAppBar.kt │ │ │ ├── LoadingIndicator.kt │ │ │ └── LoadingState.kt │ │ │ ├── favgroup │ │ │ ├── addto │ │ │ │ ├── AddToFavGroupContent.kt │ │ │ │ ├── AddToFavGroupViewModel.kt │ │ │ │ ├── column │ │ │ │ │ ├── FavoriteGroupItem.kt │ │ │ │ │ └── FavoriteGroupsColumn.kt │ │ │ │ └── core │ │ │ │ │ ├── CreateNewFavGroupButton.kt │ │ │ │ │ └── FavoriteGroup.kt │ │ │ ├── delete │ │ │ │ └── DeleteFavGroupContent.kt │ │ │ ├── edit │ │ │ │ ├── EditFavGroupScreen.kt │ │ │ │ ├── EditFavGroupViewModel.kt │ │ │ │ └── core │ │ │ │ │ ├── EditFavGroupTopAppBar.kt │ │ │ │ │ └── UnsavedConfirmationDialog.kt │ │ │ ├── more │ │ │ │ ├── FavGroupMoreContent.kt │ │ │ │ └── FavGroupMoreViewModel.kt │ │ │ └── new │ │ │ │ ├── NewFavGroupScreen.kt │ │ │ │ ├── NewFavGroupViewModel.kt │ │ │ │ └── core │ │ │ │ ├── FabState.kt │ │ │ │ ├── LoadingFab.kt │ │ │ │ ├── NewFavGroupFab.kt │ │ │ │ ├── NewFavGroupTopAppBar.kt │ │ │ │ └── SubmitFab.kt │ │ │ └── grid │ │ │ ├── FavoriteItem.kt │ │ │ └── FavoritesGrid.kt │ ├── more │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── home │ │ │ └── more │ │ │ ├── MoreScreen.kt │ │ │ ├── MoreViewModel.kt │ │ │ └── core │ │ │ ├── MoreNavigation.kt │ │ │ ├── MoreTopAppBar.kt │ │ │ ├── NavigationItem.kt │ │ │ └── UserHeader.kt │ ├── posts │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── home │ │ │ └── posts │ │ │ ├── PostsScreen.kt │ │ │ ├── PostsViewModel.kt │ │ │ ├── core │ │ │ ├── PostsNavigation.kt │ │ │ └── PostsTopAppBar.kt │ │ │ ├── grid │ │ │ ├── PostBorder.kt │ │ │ ├── PostItem.kt │ │ │ ├── PostLabel.kt │ │ │ ├── PostPlaceholder.kt │ │ │ └── PostsGrid.kt │ │ │ ├── more │ │ │ ├── PostMoreContent.kt │ │ │ ├── PostMoreViewModel.kt │ │ │ └── core │ │ │ │ ├── FavoriteSection.kt │ │ │ │ └── ScoreSection.kt │ │ │ ├── share │ │ │ ├── ShareContent.kt │ │ │ └── ShareViewModel.kt │ │ │ └── state │ │ │ ├── PostsContentState.kt │ │ │ ├── PostsEmpty.kt │ │ │ ├── PostsError.kt │ │ │ ├── PostsLoadingState.kt │ │ │ └── PostsProgress.kt │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── home │ │ ├── HomeModule.kt │ │ └── HomeNavigation.kt ├── image │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── image │ │ ├── ImageModule.kt │ │ ├── ImageScreen.kt │ │ ├── ViewerViewModel.kt │ │ ├── core │ │ ├── DownloadShareRow.kt │ │ ├── ImageNavigation.kt │ │ ├── ModifierExt.kt │ │ └── ViewerTopAppBar.kt │ │ ├── image │ │ ├── ImagePost.kt │ │ ├── ImageViewModel.kt │ │ ├── ImageViewer.kt │ │ ├── UnsupportedPost.kt │ │ ├── appbars │ │ │ ├── ImageBottomAppBar.kt │ │ │ └── ImageTopAppBar.kt │ │ └── core │ │ │ └── ImageLoadingState.kt │ │ ├── more │ │ ├── MoreBottomSheet.kt │ │ ├── MoreBottomSheetViewModel.kt │ │ ├── core │ │ │ ├── MoreActionsRow.kt │ │ │ ├── MoreCloseButton.kt │ │ │ ├── MoreDate.kt │ │ │ ├── MoreSource.kt │ │ │ └── MoreTagsButton.kt │ │ ├── info │ │ │ ├── MoreInfo.kt │ │ │ ├── MoreInfoButton.kt │ │ │ └── MoreInfoColumn.kt │ │ └── tags │ │ │ ├── MoreTagItem.kt │ │ │ ├── MoreTagsRow.kt │ │ │ └── TagActionsBottomSheet.kt │ │ └── video │ │ ├── VideoPlayer.kt │ │ ├── VideoPost.kt │ │ ├── VideoTopAppBar.kt │ │ ├── VideoViewModel.kt │ │ └── controls │ │ ├── ControlSlider.kt │ │ ├── PlayPauseButton.kt │ │ ├── SoundButton.kt │ │ ├── TimeInfo.kt │ │ └── VideoControls.kt ├── saved_searches │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── saved_searches │ │ ├── SavedSearchesModule.kt │ │ ├── SavedSearchesScreen.kt │ │ ├── SavedSearchesViewModel.kt │ │ ├── core │ │ └── SavedSearchesTopAppBar.kt │ │ ├── delete │ │ └── DeleteSavedSearchContent.kt │ │ ├── list │ │ ├── SavedSearchesList.kt │ │ ├── SavedSearchesListItem.kt │ │ └── SavedSearchesListItemActions.kt │ │ └── new_or_edit │ │ ├── NewOrEditSavedSearchScreen.kt │ │ ├── NewOrEditSavedSearchViewModel.kt │ │ └── core │ │ ├── FabState.kt │ │ ├── LoadingFab.kt │ │ ├── NewOrEditSavedSearchFab.kt │ │ ├── NewOrEditSavedSearchTopAppBar.kt │ │ ├── SubmitFab.kt │ │ └── UnsavedConfirmationDialog.kt ├── search │ ├── .gitignore │ ├── build.gradle │ ├── mock │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── search │ │ │ └── mock │ │ │ └── BrowseChipsMock.kt │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── search │ │ │ └── BrowseChipsPreview.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── uragiristereo │ │ │ └── mikansei │ │ │ └── feature │ │ │ └── search │ │ │ ├── SearchScreen.kt │ │ │ ├── SearchViewModel.kt │ │ │ ├── browse_chips │ │ │ └── BrowseChips.kt │ │ │ ├── core │ │ │ ├── SearchBar.kt │ │ │ └── SearchNavigation.kt │ │ │ ├── quick_shortcut_bar │ │ │ ├── SearchQuickShortcutBar.kt │ │ │ └── SearchQuickShortcutBarItem.kt │ │ │ ├── result │ │ │ └── SearchResultItem.kt │ │ │ └── state │ │ │ └── SearchWordIndex.kt │ │ └── test │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── search │ │ └── BrowseChipsTest.kt ├── settings │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── settings │ │ ├── SettingsColumn.kt │ │ ├── SettingsScreen.kt │ │ ├── SettingsViewModel.kt │ │ └── core │ │ ├── SettingsNavigation.kt │ │ └── SettingsTopAppBar.kt └── user │ ├── .gitignore │ ├── build.gradle │ ├── deactivation │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── user │ │ └── deactivation │ │ ├── UserDeactivationScreen.kt │ │ ├── UserDeactivationViewModel.kt │ │ ├── agreement │ │ └── UserDeactivationAgreementScreen.kt │ │ ├── core │ │ ├── UserDeactivationNavigation.kt │ │ └── UserDeactivationTopAppBar.kt │ │ ├── in_app │ │ ├── UserDeactivationInAppConfirmationDialog.kt │ │ └── UserDeactivationInAppScreen.kt │ │ ├── in_web │ │ └── UserDeactivationInWebScreen.kt │ │ ├── methods │ │ └── UserDeactivationMethodsScreen.kt │ │ └── navigation │ │ ├── UserDeactivationNavGraph.kt │ │ └── UserDeactivationRoute.kt │ ├── delegation │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── user │ │ └── delegation │ │ ├── UserDelegationSettingsScreen.kt │ │ ├── UserDelegationSettingsViewModel.kt │ │ ├── core │ │ ├── UserDelegationSettingsNavigation.kt │ │ └── UserDelegationTopAppBar.kt │ │ └── list │ │ ├── UserDelegation.kt │ │ ├── UserDelegationList.kt │ │ └── UserDelegationListItem.kt │ ├── login │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── user │ │ └── login │ │ ├── LoginScreen.kt │ │ ├── LoginViewModel.kt │ │ ├── core │ │ ├── DanbooruLogo.kt │ │ └── LoginNavigation.kt │ │ └── dialog │ │ ├── LoginDialog.kt │ │ └── LoginState.kt │ ├── manage │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── user │ │ └── manage │ │ ├── ManageUserScreen.kt │ │ ├── ManageUserViewModel.kt │ │ ├── core │ │ ├── ManageNavigation.kt │ │ ├── ProfileDropDownMenu.kt │ │ ├── ProfileItem.kt │ │ └── UsersState.kt │ │ └── switch_account │ │ ├── SwitchAccountContent.kt │ │ └── SwitchAccountProfileItem.kt │ ├── settings │ ├── .gitignore │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── uragiristereo │ │ └── mikansei │ │ └── feature │ │ └── user │ │ └── settings │ │ ├── UserSettingsScreen.kt │ │ ├── UserSettingsViewModel.kt │ │ └── core │ │ ├── UserSettingsNavigation.kt │ │ └── UserSettingsTopAppBar.kt │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── uragiristereo │ └── mikansei │ └── feature │ └── user │ ├── UserModule.kt │ └── UserNavigation.kt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.github/assets/Screenshot_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_1.jpg -------------------------------------------------------------------------------- /.github/assets/Screenshot_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_2.jpg -------------------------------------------------------------------------------- /.github/assets/Screenshot_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_3.jpg -------------------------------------------------------------------------------- /.github/assets/Screenshot_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_4.jpg -------------------------------------------------------------------------------- /.github/assets/Screenshot_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_5.jpg -------------------------------------------------------------------------------- /.github/assets/Screenshot_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/Screenshot_6.jpg -------------------------------------------------------------------------------- /.github/assets/favorites.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/favorites.jpg -------------------------------------------------------------------------------- /.github/assets/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/home.jpg -------------------------------------------------------------------------------- /.github/assets/manage_accounts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/manage_accounts.jpg -------------------------------------------------------------------------------- /.github/assets/more_info.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/more_info.jpg -------------------------------------------------------------------------------- /.github/assets/search.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/search.jpg -------------------------------------------------------------------------------- /.github/assets/viewer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/assets/viewer.jpg -------------------------------------------------------------------------------- /.github/user_deactivation/deactivation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/.github/user_deactivation/deactivation.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | *.log 4 | /local.properties 5 | /.idea/caches 6 | /.idea/libraries 7 | /.idea/modules.xml 8 | /.idea/workspace.xml 9 | /.idea/navEditor.xml 10 | /.idea/assetWizardSettings.xml 11 | .DS_Store 12 | /build 13 | /captures 14 | .externalNativeBuild 15 | .cxx 16 | local.properties 17 | /signing.properties 18 | /.idea/ 19 | /.kotlin/ 20 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release/ 3 | /debug/ 4 | google-services.json 5 | /oss/ 6 | /play/ 7 | -------------------------------------------------------------------------------- /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 22 | 23 | #-keepnames class ** 24 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/uragiristereo/mikansei/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.uragiristereo.mikansei 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen 7 | import androidx.core.view.WindowCompat 8 | import com.uragiristereo.mikansei.ui.MainScreen 9 | import org.koin.compose.KoinContext 10 | 11 | 12 | class MainActivity : ComponentActivity() { 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | 16 | installSplashScreen() 17 | 18 | WindowCompat.setDecorFitsSystemWindows(window, false) 19 | 20 | setContent { 21 | KoinContext { 22 | MainScreen() 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/uragiristereo/mikansei/MikanseiEnvironment.kt: -------------------------------------------------------------------------------- 1 | package com.uragiristereo.mikansei 2 | 3 | import com.uragiristereo.mikansei.core.model.Environment 4 | 5 | class MikanseiEnvironment : Environment { 6 | private val safeFlavors = listOf( 7 | Environment.Flavor.PLAY, 8 | ) 9 | 10 | override val debug = BuildConfig.DEBUG 11 | override val flavor = Environment.Flavor.getByName(BuildConfig.FLAVOR) 12 | override val safeMode = flavor in safeFlavors 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/uragiristereo/mikansei/ui/navgraphs/BottomNavGraph.kt: -------------------------------------------------------------------------------- 1 | package com.uragiristereo.mikansei.ui.navgraphs 2 | 3 | import androidx.navigation.NavGraphBuilder 4 | import androidx.navigation.NavHostController 5 | import com.uragiristereo.mikansei.feature.home.favorites.favoritesBottomRoute 6 | import com.uragiristereo.mikansei.feature.home.posts.core.postsBottomRoute 7 | import com.uragiristereo.mikansei.feature.image.core.imageBottomRoute 8 | import com.uragiristereo.mikansei.feature.saved_searches.savedSearchesBottomRoute 9 | import com.uragiristereo.mikansei.feature.user.manage.core.manageBottomRoute 10 | 11 | fun NavGraphBuilder.bottomNavGraph( 12 | mainNavController: NavHostController, 13 | ) { 14 | postsBottomRoute(mainNavController) 15 | 16 | manageBottomRoute(mainNavController) 17 | 18 | favoritesBottomRoute(mainNavController) 19 | 20 | savedSearchesBottomRoute(mainNavController) 21 | 22 | imageBottomRoute(mainNavController) 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uragiristereo/Mikansei/5a7308c1da542bd8822213350a7520838cf75479/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-v27/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 |