gitextract_jwuhl568/ ├── .editorconfig ├── .github/ │ ├── stale.yml │ └── workflows/ │ ├── auto-approve.yml │ ├── check.yml │ ├── claude-code-review.yml │ └── claude.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DeveloperReadme.md ├── README.md ├── app/ │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── debug/ │ │ ├── AndroidManifest.xml │ │ └── res/ │ │ └── xml/ │ │ └── network_security_config.xml │ └── main/ │ ├── AndroidManifest.xml │ ├── kotlin/ │ │ └── com/ │ │ └── igorwojda/ │ │ └── showcase/ │ │ └── app/ │ │ ├── AppKoinModule.kt │ │ ├── ShowcaseApplication.kt │ │ ├── data/ │ │ │ └── api/ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ └── UserAgentInterceptor.kt │ │ └── presentation/ │ │ ├── BottomNavigationBar.kt │ │ ├── MainShowcaseActivity.kt │ │ ├── MainShowcaseScreen.kt │ │ ├── NavigationRoute.kt │ │ └── util/ │ │ └── NavigationDestinationLogger.kt │ └── res/ │ ├── drawable/ │ │ ├── ic_favorite.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_launcher_foreground_themed.xml │ │ ├── ic_music_library.xml │ │ └── ic_settings.xml │ ├── mipmap-anydpi/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── mipmap-anydpi-v33/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── xml/ │ └── data_extraction_rules.xml ├── build-logic/ │ ├── build.gradle.kts │ ├── settings.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ └── com/ │ └── igorwojda/ │ └── showcase/ │ └── buildlogic/ │ ├── AboutLibrariesConventionPlugin.kt │ ├── ApplicationConventionPlugin.kt │ ├── DetektConventionPlugin.kt │ ├── EasyLauncherConventionPlugin.kt │ ├── FeatureConventionPlugin.kt │ ├── KotlinConventionPlugin.kt │ ├── LibraryConventionPlugin.kt │ ├── SpotlessConventionPlugin.kt │ ├── TestConventionLibraryPlugin.kt │ ├── TestConventionPlugin.kt │ ├── config/ │ │ └── JavaBuildConfig.kt │ └── ext/ │ ├── BuildConfigExt.kt │ ├── DependencyHandlerExt.kt │ ├── PackagingExt.kt │ └── ProjectExt.kt ├── build.gradle.kts ├── detekt.yml ├── feature/ │ ├── album/ │ │ ├── build.gradle.kts │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── igorwojda/ │ │ │ │ └── showcase/ │ │ │ │ └── feature/ │ │ │ │ └── album/ │ │ │ │ ├── AlbumKoinModule.kt │ │ │ │ ├── data/ │ │ │ │ │ ├── DataModule.kt │ │ │ │ │ ├── datasource/ │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ ├── AlbumApiModel.kt │ │ │ │ │ │ │ │ ├── AlbumListApiModel.kt │ │ │ │ │ │ │ │ ├── ImageApiModel.kt │ │ │ │ │ │ │ │ ├── ImageSizeApiModel.kt │ │ │ │ │ │ │ │ ├── SearchAlbumResultsApiModel.kt │ │ │ │ │ │ │ │ ├── TagApiModel.kt │ │ │ │ │ │ │ │ ├── TagListApiModel.kt │ │ │ │ │ │ │ │ ├── TrackApiModel.kt │ │ │ │ │ │ │ │ └── TrackListApiModel.kt │ │ │ │ │ │ │ ├── response/ │ │ │ │ │ │ │ │ ├── GetAlbumInfoResponse.kt │ │ │ │ │ │ │ │ └── SearchAlbumResponse.kt │ │ │ │ │ │ │ └── service/ │ │ │ │ │ │ │ └── AlbumRetrofitService.kt │ │ │ │ │ │ └── database/ │ │ │ │ │ │ ├── AlbumDao.kt │ │ │ │ │ │ ├── AlbumDatabase.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── AlbumRoomModel.kt │ │ │ │ │ │ ├── ImageRoomModel.kt │ │ │ │ │ │ ├── ImageSizeRoomModel.kt │ │ │ │ │ │ ├── TagRoomModel.kt │ │ │ │ │ │ └── TrackRoomModel.kt │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ ├── AlbumMapper.kt │ │ │ │ │ │ ├── ImageMapper.kt │ │ │ │ │ │ ├── ImageSizeMapper.kt │ │ │ │ │ │ ├── TagMapper.kt │ │ │ │ │ │ └── TrackMapper.kt │ │ │ │ │ └── repository/ │ │ │ │ │ └── AlbumRepositoryImpl.kt │ │ │ │ ├── domain/ │ │ │ │ │ ├── DomainModule.kt │ │ │ │ │ ├── enum/ │ │ │ │ │ │ └── ImageSize.kt │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── Album.kt │ │ │ │ │ │ ├── Image.kt │ │ │ │ │ │ ├── Tag.kt │ │ │ │ │ │ └── Track.kt │ │ │ │ │ ├── repository/ │ │ │ │ │ │ └── AlbumRepository.kt │ │ │ │ │ └── usecase/ │ │ │ │ │ ├── GetAlbumListUseCase.kt │ │ │ │ │ └── GetAlbumUseCase.kt │ │ │ │ └── presentation/ │ │ │ │ ├── PresentationModule.kt │ │ │ │ ├── composable/ │ │ │ │ │ └── SearchBarComposable.kt │ │ │ │ ├── screen/ │ │ │ │ │ ├── albumdetail/ │ │ │ │ │ │ ├── AlbumDetailAction.kt │ │ │ │ │ │ ├── AlbumDetailScreen.kt │ │ │ │ │ │ ├── AlbumDetailUiState.kt │ │ │ │ │ │ └── AlbumDetailViewModel.kt │ │ │ │ │ └── albumlist/ │ │ │ │ │ ├── AlbumListAction.kt │ │ │ │ │ ├── AlbumListScreen.kt │ │ │ │ │ ├── AlbumListUiState.kt │ │ │ │ │ └── AlbumListViewModel.kt │ │ │ │ └── util/ │ │ │ │ └── TimeUtil.kt │ │ │ └── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ └── test/ │ │ └── kotlin/ │ │ └── com/ │ │ └── igorwojda/ │ │ └── showcase/ │ │ └── feature/ │ │ └── album/ │ │ ├── data/ │ │ │ ├── DataFixtures.kt │ │ │ ├── datasource/ │ │ │ │ └── api/ │ │ │ │ └── model/ │ │ │ │ ├── AlbumApiModelTest.kt │ │ │ │ ├── ImageApiModelTest.kt │ │ │ │ └── ImageSizeApiModelTest.kt │ │ │ ├── mapper/ │ │ │ │ ├── AlbumMapperTest.kt │ │ │ │ ├── ImageMapperTest.kt │ │ │ │ ├── ImageSizeMapperTest.kt │ │ │ │ ├── TagMapperTest.kt │ │ │ │ └── TrackMapperTest.kt │ │ │ └── repository/ │ │ │ └── AlbumRepositoryImplTest.kt │ │ ├── domain/ │ │ │ ├── DomainFixtures.kt │ │ │ ├── model/ │ │ │ │ └── AlbumTest.kt │ │ │ └── usecase/ │ │ │ ├── GetAlbumListUseCaseTest.kt │ │ │ └── GetAlbumUseCaseTest.kt │ │ └── presentation/ │ │ └── screen/ │ │ ├── albumdetail/ │ │ │ └── AlbumDetailViewModelTest.kt │ │ └── albumlist/ │ │ └── AlbumListViewModelTest.kt │ ├── base/ │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── igorwojda/ │ │ │ └── showcase/ │ │ │ └── feature/ │ │ │ └── base/ │ │ │ ├── common/ │ │ │ │ ├── delegate/ │ │ │ │ │ └── Observer.kt │ │ │ │ └── res/ │ │ │ │ └── Dimen.kt │ │ │ ├── data/ │ │ │ │ └── retrofit/ │ │ │ │ ├── ApiResult.kt │ │ │ │ ├── ApiResultAdapterFactory.kt │ │ │ │ ├── ApiResultCall.kt │ │ │ │ └── ApiResultCallAdapter.kt │ │ │ ├── domain/ │ │ │ │ └── result/ │ │ │ │ ├── Result.kt │ │ │ │ └── ResultExt.kt │ │ │ ├── presentation/ │ │ │ │ ├── compose/ │ │ │ │ │ └── composable/ │ │ │ │ │ ├── ErrorAnim.kt │ │ │ │ │ ├── Loading.kt │ │ │ │ │ ├── Lottie.kt │ │ │ │ │ ├── PlaceholderImage.kt │ │ │ │ │ ├── TextTitleLarge.kt │ │ │ │ │ ├── TextTitleMedium.kt │ │ │ │ │ └── UnderConstructionAnim.kt │ │ │ │ └── viewmodel/ │ │ │ │ ├── BaseAction.kt │ │ │ │ ├── BaseState.kt │ │ │ │ ├── BaseViewModel.kt │ │ │ │ └── StateTimeTravelDebugger.kt │ │ │ └── util/ │ │ │ └── TimberLogTags.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── ic_search.xml │ │ │ ├── image_placeholder_1.xml │ │ │ ├── image_placeholder_2.xml │ │ │ └── image_placeholder_3.xml │ │ ├── raw/ │ │ │ ├── lottie_building_screen.json │ │ │ └── lottie_error_screen.json │ │ └── values/ │ │ ├── color_palete.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── favourite/ │ │ ├── build.gradle.kts │ │ ├── proguard-rules.pro │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── igorwojda/ │ │ └── showcase/ │ │ └── feature/ │ │ └── favourite/ │ │ ├── FavouriteKoinModule.kt │ │ ├── data/ │ │ │ └── DataModule.kt │ │ ├── domain/ │ │ │ └── DomainModule.kt │ │ └── presentation/ │ │ ├── PresentationModule.kt │ │ └── screen/ │ │ └── favourite/ │ │ └── FavouriteScreen.kt │ └── settings/ │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── igorwojda/ │ │ │ └── showcase/ │ │ │ └── feature/ │ │ │ └── settings/ │ │ │ ├── SettingsKoinModule.kt │ │ │ ├── data/ │ │ │ │ └── DataModule.kt │ │ │ ├── domain/ │ │ │ │ └── DomainModule.kt │ │ │ └── presentation/ │ │ │ ├── PresentationModule.kt │ │ │ └── screen/ │ │ │ ├── aboutlibraries/ │ │ │ │ ├── AboutLibrariesAction.kt │ │ │ │ ├── AboutLibrariesScreen.kt │ │ │ │ ├── AboutLibrariesUiState.kt │ │ │ │ └── AboutLibrariesViewModel.kt │ │ │ └── settings/ │ │ │ ├── SettingsAction.kt │ │ │ ├── SettingsScreen.kt │ │ │ ├── SettingsUiState.kt │ │ │ └── SettingsViewModel.kt │ │ └── res/ │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── kotlin/ │ └── com/ │ └── igorwojda/ │ └── showcase/ │ └── feature/ │ └── settings/ │ └── presentation/ │ └── screen/ │ ├── aboutlibraries/ │ │ └── AboutLibrariesViewModelTest.kt │ └── settings/ │ └── SettingsViewModelTest.kt ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── konsist-test/ │ ├── build.gradle.kts │ └── src/ │ └── test/ │ └── kotlin/ │ └── com/ │ └── igorwojda/ │ └── showcase/ │ └── konsisttest/ │ ├── AndroidKonsistTest.kt │ ├── CleanArchitectureKonsistTest.kt │ ├── GeneralKonsistTest.kt │ ├── ModuleKonsistTest.kt │ ├── TestKonsistTest.kt │ ├── UseCaseKonsistTest.kt │ └── ViewModelKonsistTest.kt ├── library/ │ └── test-utils/ │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── kotlin/ │ └── com/ │ └── igorwojda/ │ └── showcase/ │ └── library/ │ └── testutils/ │ ├── CoroutinesTestDispatcherExtension.kt │ └── InstantTaskExecutorExtension.kt ├── renovate.json └── settings.gradle.kts