├── .gitignore ├── 01-introduction ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ └── .keep │ └── starter │ └── .keep ├── 02-starting-from-the-beginning ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ └── .keep │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── .keep │ │ │ │ └── presentation │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ └── .keep │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── .keep │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ └── .keep │ │ │ │ └── presentation │ │ │ │ └── SearchFragment.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 03-domain-layer ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ └── search │ │ │ │ │ └── presentation │ │ │ │ │ └── SearchFragment.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── .keep │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragment.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── .keep │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 04-data-layer-network ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── ExampleInstrumentedTest.kt │ │ │ │ └── common │ │ │ │ └── data │ │ │ │ ├── api │ │ │ │ └── utils │ │ │ │ │ └── FakeServer.kt │ │ │ │ └── preferences │ │ │ │ └── FakePreferences.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── assets │ │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ └── search │ │ │ │ │ └── presentation │ │ │ │ │ └── SearchFragment.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── ExampleInstrumentedTest.kt │ │ │ └── common │ │ │ └── data │ │ │ ├── api │ │ │ └── utils │ │ │ │ └── FakeServer.kt │ │ │ └── preferences │ │ │ └── FakePreferences.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── assets │ │ │ └── networkresponses │ │ │ ├── animals.json │ │ │ └── validToken.json │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragment.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── common │ │ ├── data │ │ └── api │ │ │ └── utils │ │ │ └── JsonReader.kt │ │ └── domain │ │ └── model │ │ └── animal │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 05-data-layer-caching ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── HiltTestRunner.kt │ │ │ │ └── common │ │ │ │ └── data │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ ├── api │ │ │ │ └── utils │ │ │ │ │ └── FakeServer.kt │ │ │ │ └── preferences │ │ │ │ └── FakePreferences.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── assets │ │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ └── search │ │ │ │ │ └── presentation │ │ │ │ │ └── SearchFragment.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── ExampleInstrumentedTest.kt │ │ │ └── common │ │ │ └── data │ │ │ ├── api │ │ │ └── utils │ │ │ │ └── FakeServer.kt │ │ │ └── preferences │ │ │ └── FakePreferences.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── assets │ │ │ └── networkresponses │ │ │ ├── animals.json │ │ │ └── validToken.json │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ └── AnimalsNearYouFragment.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragment.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── common │ │ ├── data │ │ └── api │ │ │ ├── interceptors │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ └── utils │ │ │ └── JsonReader.kt │ │ └── domain │ │ └── model │ │ └── animal │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 06-building-features-animals-near-you ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── .idea │ │ │ ├── gradle.xml │ │ │ ├── misc.xml │ │ │ ├── modules.xml │ │ │ └── workspace.xml │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── ExampleInstrumentedTest.kt │ │ │ │ ├── HiltTestRunner.kt │ │ │ │ └── common │ │ │ │ └── data │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ ├── api │ │ │ │ └── utils │ │ │ │ │ └── FakeServer.kt │ │ │ │ └── preferences │ │ │ │ └── FakePreferences.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── assets │ │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ └── search │ │ │ │ │ └── presentation │ │ │ │ │ └── SearchFragment.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── .idea │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── workspace.xml │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── ExampleInstrumentedTest.kt │ │ │ ├── HiltTestRunner.kt │ │ │ └── common │ │ │ └── data │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ ├── api │ │ │ └── utils │ │ │ │ └── FakeServer.kt │ │ │ └── preferences │ │ │ └── FakePreferences.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── assets │ │ │ └── networkresponses │ │ │ ├── animals.json │ │ │ └── validToken.json │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragment.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── common │ │ ├── data │ │ └── api │ │ │ ├── interceptors │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ └── utils │ │ │ └── JsonReader.kt │ │ └── domain │ │ └── model │ │ └── animal │ │ └── PhotoTests.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 07-building-features-search ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── .idea │ │ │ ├── gradle.xml │ │ │ ├── misc.xml │ │ │ ├── modules.xml │ │ │ └── workspace.xml │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── HiltTestRunner.kt │ │ │ │ ├── common │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ │ ├── api │ │ │ │ │ │ └── utils │ │ │ │ │ │ │ └── FakeServer.kt │ │ │ │ │ ├── di │ │ │ │ │ │ └── TestCacheModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ └── FakePreferences.kt │ │ │ │ └── di │ │ │ │ │ └── TestActivityRetainedModule.kt │ │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragmentTest.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── networkresponses │ │ │ │ │ ├── animals.json │ │ │ │ │ └── validToken.json │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── HiltTestActivity.kt │ │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ │ ├── TestCoroutineRule.kt │ │ │ │ └── common │ │ │ │ └── data │ │ │ │ └── FakeRepository.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── common │ │ │ ├── data │ │ │ │ └── api │ │ │ │ │ ├── interceptors │ │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ │ └── utils │ │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ │ └── model │ │ │ │ └── animal │ │ │ │ └── PhotoTests.kt │ │ │ └── search │ │ │ └── presentation │ │ │ └── SearchFragmentViewModelTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── .idea │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── workspace.xml │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── HiltTestRunner.kt │ │ │ ├── common │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ ├── api │ │ │ │ │ └── utils │ │ │ │ │ │ └── FakeServer.kt │ │ │ │ ├── di │ │ │ │ │ └── TestCacheModule.kt │ │ │ │ └── preferences │ │ │ │ │ └── FakePreferences.kt │ │ │ └── di │ │ │ │ └── TestActivityRetainedModule.kt │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ └── search │ │ │ └── presentation │ │ │ └── SearchFragmentTest.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── HiltTestActivity.kt │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ ├── TestCoroutineRule.kt │ │ │ └── common │ │ │ └── data │ │ │ └── FakeRepository.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ └── .keep │ │ │ │ └── usecases │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ ├── common │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ │ └── search │ │ └── presentation │ │ └── SearchFragmentViewModelTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 08-multi-module-apps ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── android-library.gradle │ ├── app │ │ ├── .gitignore │ │ ├── .idea │ │ │ ├── gradle.xml │ │ │ ├── misc.xml │ │ │ ├── modules.xml │ │ │ └── workspace.xml │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ └── main │ │ │ │ ├── domain │ │ │ │ └── usecases │ │ │ │ │ └── OnboardingIsComplete.kt │ │ │ │ └── presentation │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainActivityEvent.kt │ │ │ │ ├── MainActivityViewEffect.kt │ │ │ │ └── MainActivityViewModel.kt │ │ │ └── res │ │ │ ├── drawable │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── menu │ │ │ └── menu_bottom_nav.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── common │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ ├── api │ │ │ │ │ └── utils │ │ │ │ │ │ └── FakeServer.kt │ │ │ │ ├── di │ │ │ │ │ ├── TestCacheModule.kt │ │ │ │ │ └── TestPreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ └── FakePreferences.kt │ │ │ │ ├── di │ │ │ │ └── TestActivityRetainedModule.kt │ │ │ │ └── testrunners │ │ │ │ └── HiltTestRunner.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── networkresponses │ │ │ │ │ ├── animals.json │ │ │ │ │ └── validToken.json │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── HiltTestActivity.kt │ │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ │ ├── TestCoroutineRule.kt │ │ │ │ └── data │ │ │ │ └── FakeRepository.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── common │ │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── search │ │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── dog_placeholder.png │ │ │ │ ├── layout │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── configs │ │ └── rwcodestyle.xml │ ├── features │ │ ├── animalsnearyou │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── animalsnearyou │ │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── realworld │ │ │ │ │ │ └── android │ │ │ │ │ │ └── petsave │ │ │ │ │ │ └── animalsnearyou │ │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ └── res │ │ │ │ │ ├── layout │ │ │ │ │ └── fragment_animals_near_you.xml │ │ │ │ │ ├── navigation │ │ │ │ │ └── nav_animalsnearyou.xml │ │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── animalsnearyou │ │ │ │ └── ExampleUnitTest.kt │ │ ├── onboarding │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── onboarding │ │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── realworld │ │ │ │ │ │ └── android │ │ │ │ │ │ └── petsave │ │ │ │ │ │ └── onboarding │ │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── StoreOnboardingData.kt │ │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── OnboardingEvent.kt │ │ │ │ │ │ ├── OnboardingFragment.kt │ │ │ │ │ │ ├── OnboardingFragmentViewModel.kt │ │ │ │ │ │ ├── OnboardingViewEffect.kt │ │ │ │ │ │ └── OnboardingViewState.kt │ │ │ │ └── res │ │ │ │ │ ├── layout │ │ │ │ │ └── fragment_onboarding.xml │ │ │ │ │ ├── navigation │ │ │ │ │ └── nav_onboarding.xml │ │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── onboarding │ │ │ │ └── ExampleUnitTest.kt │ │ └── search │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── search │ │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ │ └── presentation │ │ │ │ └── SearchFragmentTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ └── no_results_pug.png │ │ │ │ ├── layout │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ └── fragment_search.xml │ │ │ │ ├── menu │ │ │ │ └── menu_search.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_search.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── search │ │ │ └── presentation │ │ │ └── SearchFragmentViewModelTest.kt │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── android-library.gradle │ ├── app │ ├── .gitignore │ ├── .idea │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── workspace.xml │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── PetSaveApplication.kt │ │ │ ├── main │ │ │ ├── domain │ │ │ │ └── usecases │ │ │ │ │ └── OnboardingIsComplete.kt │ │ │ └── presentation │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainActivityEvent.kt │ │ │ │ ├── MainActivityViewEffect.kt │ │ │ │ └── MainActivityViewModel.kt │ │ │ └── onboarding │ │ │ ├── domain │ │ │ └── usecases │ │ │ │ └── StoreOnboardingData.kt │ │ │ └── presentation │ │ │ ├── OnboardingEvent.kt │ │ │ ├── OnboardingFragment.kt │ │ │ ├── OnboardingFragmentViewModel.kt │ │ │ ├── OnboardingViewEffect.kt │ │ │ └── OnboardingViewState.kt │ │ └── res │ │ ├── drawable │ │ ├── ic_animals_near_you_24dp.xml │ │ ├── ic_close_24dp.xml │ │ └── splash_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── fragment_onboarding.xml │ │ ├── menu │ │ └── menu_bottom_nav.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── common │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ ├── api │ │ │ │ └── utils │ │ │ │ │ └── FakeServer.kt │ │ │ ├── di │ │ │ │ ├── TestCacheModule.kt │ │ │ │ └── TestPreferencesModule.kt │ │ │ └── preferences │ │ │ │ └── FakePreferences.kt │ │ │ ├── di │ │ │ └── TestActivityRetainedModule.kt │ │ │ └── testrunners │ │ │ └── HiltTestRunner.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── HiltTestActivity.kt │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ ├── TestCoroutineRule.kt │ │ │ └── data │ │ │ └── FakeRepository.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ ├── api │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ ├── interceptors │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ └── MappingException.kt │ │ │ │ ├── cache │ │ │ │ │ ├── Cache.kt │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ ├── daos │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── animal │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ └── details │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ ├── organization │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ ├── pagination │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── search │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── repositories │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ ├── Event.kt │ │ │ │ └── model │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ └── mappers │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ └── Extensions.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── dog_placeholder.png │ │ │ ├── layout │ │ │ └── recycler_view_animal_item.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── common │ │ ├── data │ │ └── api │ │ │ ├── interceptors │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ └── utils │ │ │ └── JsonReader.kt │ │ └── domain │ │ └── model │ │ └── animal │ │ └── PhotoTests.kt │ ├── configs │ └── rwcodestyle.xml │ ├── features │ ├── animalsnearyou │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── animalsnearyou │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ └── res │ │ │ │ ├── layout │ │ │ │ └── fragment_animals_near_you.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_animalsnearyou.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── animalsnearyou │ │ │ └── ExampleUnitTest.kt │ └── search │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── search │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ └── presentation │ │ │ └── SearchFragmentTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── ic_search_24dp.xml │ │ │ └── no_results_pug.png │ │ │ ├── layout │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ └── fragment_search.xml │ │ │ ├── menu │ │ │ └── menu_search.xml │ │ │ ├── navigation │ │ │ └── nav_search.xml │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── search │ │ └── presentation │ │ └── SearchFragmentViewModelTest.kt │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 09-dynamic-features-theory ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ └── .keep │ └── starter │ └── .keep ├── 10-building-a-dynamic-feature ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ ├── compiler.xml │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── android-library.gradle │ ├── app │ │ ├── .gitignore │ │ ├── .idea │ │ │ ├── gradle.xml │ │ │ ├── misc.xml │ │ │ ├── modules.xml │ │ │ └── workspace.xml │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── di │ │ │ │ └── SharingModuleDependencies.kt │ │ │ │ └── main │ │ │ │ ├── domain │ │ │ │ └── usecases │ │ │ │ │ └── OnboardingIsComplete.kt │ │ │ │ └── presentation │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── MainActivityEvent.kt │ │ │ │ ├── MainActivityViewEffect.kt │ │ │ │ └── MainActivityViewModel.kt │ │ │ └── res │ │ │ ├── drawable │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── menu │ │ │ └── menu_bottom_nav.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── common │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ │ ├── api │ │ │ │ │ └── utils │ │ │ │ │ │ └── FakeServer.kt │ │ │ │ ├── di │ │ │ │ │ ├── TestCacheModule.kt │ │ │ │ │ └── TestPreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ └── FakePreferences.kt │ │ │ │ ├── di │ │ │ │ └── TestActivityRetainedModule.kt │ │ │ │ └── testrunners │ │ │ │ └── HiltTestRunner.kt │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── networkresponses │ │ │ │ │ ├── animals.json │ │ │ │ │ └── validToken.json │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── HiltTestActivity.kt │ │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ │ ├── TestCoroutineRule.kt │ │ │ │ └── data │ │ │ │ └── FakeRepository.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── common │ │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── search │ │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ └── GetAnimalDetails.kt │ │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── dog_placeholder.png │ │ │ │ └── ic_share_24.xml │ │ │ │ ├── layout │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ └── api │ │ │ │ ├── interceptors │ │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ │ └── utils │ │ │ │ └── JsonReader.kt │ │ │ └── domain │ │ │ └── model │ │ │ └── animal │ │ │ └── PhotoTests.kt │ ├── configs │ │ └── rwcodestyle.xml │ ├── features │ │ ├── animalsnearyou │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── animalsnearyou │ │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── realworld │ │ │ │ │ │ └── android │ │ │ │ │ │ └── petsave │ │ │ │ │ │ └── animalsnearyou │ │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── animaldetails │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalDetailsViewState.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ └── UiAnimalDetailsMapper.kt │ │ │ │ │ │ └── main │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ └── res │ │ │ │ │ ├── drawable │ │ │ │ │ └── ic_call_24dp.xml │ │ │ │ │ ├── layout │ │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ │ └── fragment_details.xml │ │ │ │ │ ├── menu │ │ │ │ │ └── menu_share.xml │ │ │ │ │ ├── navigation │ │ │ │ │ └── nav_animalsnearyou.xml │ │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── animalsnearyou │ │ │ │ └── ExampleUnitTest.kt │ │ ├── onboarding │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── onboarding │ │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── realworld │ │ │ │ │ │ └── android │ │ │ │ │ │ └── petsave │ │ │ │ │ │ └── onboarding │ │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── StoreOnboardingData.kt │ │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── OnboardingEvent.kt │ │ │ │ │ │ ├── OnboardingFragment.kt │ │ │ │ │ │ ├── OnboardingFragmentViewModel.kt │ │ │ │ │ │ ├── OnboardingViewEffect.kt │ │ │ │ │ │ └── OnboardingViewState.kt │ │ │ │ └── res │ │ │ │ │ ├── layout │ │ │ │ │ └── fragment_onboarding.xml │ │ │ │ │ ├── navigation │ │ │ │ │ └── nav_onboarding.xml │ │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── onboarding │ │ │ │ └── ExampleUnitTest.kt │ │ ├── search │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ │ ├── androidTest │ │ │ │ └── java │ │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── search │ │ │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ │ │ └── presentation │ │ │ │ │ └── SearchFragmentTest.kt │ │ │ │ ├── main │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── realworld │ │ │ │ │ │ └── android │ │ │ │ │ │ └── petsave │ │ │ │ │ │ └── search │ │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ │ └── SearchViewState.kt │ │ │ │ └── res │ │ │ │ │ ├── drawable │ │ │ │ │ ├── card_view_border.xml │ │ │ │ │ ├── cat_derp.png │ │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ │ └── no_results_pug.png │ │ │ │ │ ├── layout │ │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ │ └── fragment_search.xml │ │ │ │ │ ├── menu │ │ │ │ │ └── menu_search.xml │ │ │ │ │ ├── navigation │ │ │ │ │ └── nav_search.xml │ │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── search │ │ │ │ └── presentation │ │ │ │ └── SearchFragmentViewModelTest.kt │ │ └── sharing │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── consumer-rules.pro │ │ │ ├── proguard-rules.pro │ │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── sharing │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── sharing │ │ │ │ │ ├── di │ │ │ │ │ ├── SharingComponent.kt │ │ │ │ │ ├── SharingModule.kt │ │ │ │ │ ├── ViewModelFactory.kt │ │ │ │ │ └── ViewModelKey.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SharingEvent.kt │ │ │ │ │ ├── SharingFragment.kt │ │ │ │ │ ├── SharingFragmentViewModel.kt │ │ │ │ │ ├── SharingViewState.kt │ │ │ │ │ └── model │ │ │ │ │ ├── UIAnimalToShare.kt │ │ │ │ │ └── mappers │ │ │ │ │ └── UiAnimalToShareMapper.kt │ │ │ └── res │ │ │ │ ├── layout │ │ │ │ └── fragment_sharing.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_sharing.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── sharing │ │ │ └── ExampleUnitTest.kt │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ ├── compiler.xml │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── android-library.gradle │ ├── app │ ├── .gitignore │ ├── .idea │ │ ├── gradle.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ └── workspace.xml │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── PetSaveApplication.kt │ │ │ └── main │ │ │ ├── domain │ │ │ └── usecases │ │ │ │ └── OnboardingIsComplete.kt │ │ │ └── presentation │ │ │ ├── MainActivity.kt │ │ │ ├── MainActivityEvent.kt │ │ │ ├── MainActivityViewEffect.kt │ │ │ └── MainActivityViewModel.kt │ │ └── res │ │ ├── drawable │ │ ├── ic_animals_near_you_24dp.xml │ │ ├── ic_close_24dp.xml │ │ └── splash_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── menu │ │ └── menu_bottom_nav.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── common │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── data │ │ │ ├── PetFinderAnimalRepositoryTest.kt │ │ │ ├── api │ │ │ │ └── utils │ │ │ │ │ └── FakeServer.kt │ │ │ ├── di │ │ │ │ ├── TestCacheModule.kt │ │ │ │ └── TestPreferencesModule.kt │ │ │ └── preferences │ │ │ │ └── FakePreferences.kt │ │ │ ├── di │ │ │ └── TestActivityRetainedModule.kt │ │ │ └── testrunners │ │ │ └── HiltTestRunner.kt │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── networkresponses │ │ │ │ ├── animals.json │ │ │ │ └── validToken.json │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── common │ │ │ ├── HiltTestActivity.kt │ │ │ ├── RxImmediateSchedulerRule.kt │ │ │ ├── TestCoroutineRule.kt │ │ │ └── data │ │ │ └── FakeRepository.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── common │ │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ ├── api │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ ├── ConnectionManager.kt │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ ├── interceptors │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ ├── LoggingInterceptor.kt │ │ │ │ │ │ └── NetworkStatusInterceptor.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ └── MappingException.kt │ │ │ │ ├── cache │ │ │ │ │ ├── Cache.kt │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ ├── daos │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ └── CachedOrganization.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ └── ActivityRetainedModule.kt │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── animal │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ └── details │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ ├── organization │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ ├── pagination │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── search │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ ├── repositories │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ └── usecases │ │ │ │ │ └── GetAnimalDetails.kt │ │ │ │ ├── presentation │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ ├── Event.kt │ │ │ │ └── model │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ └── mappers │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ └── Extensions.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── dog_placeholder.png │ │ │ └── ic_share_24.xml │ │ │ ├── layout │ │ │ └── recycler_view_animal_item.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── common │ │ ├── data │ │ └── api │ │ │ ├── interceptors │ │ │ └── AuthenticationInterceptorTest.kt │ │ │ └── utils │ │ │ └── JsonReader.kt │ │ └── domain │ │ └── model │ │ └── animal │ │ └── PhotoTests.kt │ ├── configs │ └── rwcodestyle.xml │ ├── features │ ├── animalsnearyou │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── animalsnearyou │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── animaldetails │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsFragmentViewModel.kt │ │ │ │ │ ├── AnimalDetailsViewState.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ └── UiAnimalDetailsMapper.kt │ │ │ │ │ └── main │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── ic_call_24dp.xml │ │ │ │ ├── layout │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ └── fragment_details.xml │ │ │ │ ├── menu │ │ │ │ └── menu_share.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_animalsnearyou.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── animalsnearyou │ │ │ └── ExampleUnitTest.kt │ ├── onboarding │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── onboarding │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── onboarding │ │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── StoreOnboardingData.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── OnboardingEvent.kt │ │ │ │ │ ├── OnboardingFragment.kt │ │ │ │ │ ├── OnboardingFragmentViewModel.kt │ │ │ │ │ ├── OnboardingViewEffect.kt │ │ │ │ │ └── OnboardingViewState.kt │ │ │ └── res │ │ │ │ ├── layout │ │ │ │ └── fragment_onboarding.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_onboarding.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── onboarding │ │ │ └── ExampleUnitTest.kt │ ├── search │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── search │ │ │ │ ├── launchFragmentInHiltContainer.kt │ │ │ │ └── presentation │ │ │ │ └── SearchFragmentTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ └── no_results_pug.png │ │ │ │ ├── layout │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ └── fragment_search.xml │ │ │ │ ├── menu │ │ │ │ └── menu_search.xml │ │ │ │ ├── navigation │ │ │ │ └── nav_search.xml │ │ │ │ └── values │ │ │ │ └── strings.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── search │ │ │ └── presentation │ │ │ └── SearchFragmentViewModelTest.kt │ └── sharing │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── sharing │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── sharing │ │ │ │ └── presentation │ │ │ │ ├── SharingEvent.kt │ │ │ │ ├── SharingFragment.kt │ │ │ │ ├── SharingFragmentViewModel.kt │ │ │ │ ├── SharingViewState.kt │ │ │ │ └── model │ │ │ │ ├── UIAnimalToShare.kt │ │ │ │ └── mappers │ │ │ │ └── UiAnimalToShareMapper.kt │ │ └── res │ │ │ ├── layout │ │ │ └── fragment_sharing.xml │ │ │ ├── navigation │ │ │ └── nav_sharing.xml │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── sharing │ │ └── ExampleUnitTest.kt │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 11-animations ├── assets │ └── .keep └── projects │ ├── final │ ├── .gitignore │ ├── .keep │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── core │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ ├── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 12-motionlayout-and-motion-editor ├── assets │ └── .keep └── projects │ ├── final │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── fragment_details_scene.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── animator │ │ │ ├── animator_alpha.xml │ │ │ └── animator_heart_fillup.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── heart_fill_animation.xml │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_heart_unfilled.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 13-custom-views ├── assets │ └── .keep └── projects │ ├── final │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ ├── values │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── fragment_details_scene.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── animator │ │ │ ├── animator_alpha.xml │ │ │ └── animator_heart_fillup.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── heart_fill_animation.xml │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_heart_unfilled.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── fragment_details_scene.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 14-style-and-theme ├── assets │ └── .keep └── projects │ ├── final │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── font │ │ │ │ ├── roboto_family.xml │ │ │ │ └── roboto_regular.ttf │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ ├── layout_pet_stat.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ ├── menu_search.xml │ │ │ │ └── theme_options.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ │ ├── values │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── fragment_details_scene.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── animator │ │ │ ├── animator_alpha.xml │ │ │ └── animator_heart_fillup.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── heart_fill_animation.xml │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_heart_unfilled.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── font │ │ │ ├── roboto_family.xml │ │ │ └── roboto_regular.ttf │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ ├── layout_pet_stat.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── fragment_details_scene.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 15-user-privacy ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ └── users.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ └── FileConstants.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── users.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── PetSaveApplication.kt │ │ │ ├── animalsnearyou │ │ │ └── presentation │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ └── InfiniteScrollListener.kt │ │ │ ├── core │ │ │ ├── MainActivity.kt │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ ├── api │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ ├── interceptors │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ └── MappingException.kt │ │ │ │ ├── cache │ │ │ │ │ ├── Cache.kt │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ ├── daos │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ └── PreferencesConstants.kt │ │ │ ├── di │ │ │ │ ├── ApplicationModule.kt │ │ │ │ └── ViewModelsModule.kt │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── animal │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ └── Media.kt │ │ │ │ │ ├── organization │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ ├── pagination │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── user │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ └── Users.kt │ │ │ │ ├── repositories │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ └── UserRepository.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ ├── presentation │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ ├── Event.kt │ │ │ │ └── model │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ └── mappers │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ └── UiMapper.kt │ │ │ └── utils │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ ├── Encryption.kt │ │ │ │ ├── Extensions.kt │ │ │ │ └── FileConstants.kt │ │ │ ├── report │ │ │ └── presentation │ │ │ │ └── ReportDetailFragment.kt │ │ │ └── search │ │ │ ├── domain │ │ │ ├── Exceptions.kt │ │ │ ├── model │ │ │ │ ├── SearchFilters.kt │ │ │ │ ├── SearchParameters.kt │ │ │ │ └── SearchResults.kt │ │ │ └── usecases │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ ├── SearchAnimals.kt │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ └── presentation │ │ │ ├── SearchEvent.kt │ │ │ ├── SearchFragment.kt │ │ │ ├── SearchFragmentViewModel.kt │ │ │ └── SearchViewState.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── card_view_border.xml │ │ ├── cat_derp.png │ │ ├── dog_placeholder.png │ │ ├── ic_animals_near_you_24dp.xml │ │ ├── ic_close_24dp.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_search_24dp.xml │ │ ├── no_results_pug.png │ │ └── splash_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── dropdown_menu_popup_item.xml │ │ ├── exposed_dropdown_menu.xml │ │ ├── filtered_search_widget.xml │ │ ├── fragment_animals_near_you.xml │ │ ├── fragment_report_detail.xml │ │ ├── fragment_search.xml │ │ └── recycler_view_animal_item.xml │ │ ├── menu │ │ ├── menu_bottom_nav.xml │ │ └── menu_search.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 16-securing-data-at-rest ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ └── codeStyles │ │ │ └── Project.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ └── users.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ └── PreferencesHelper.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── users.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ ├── PetSaveApplication.kt │ │ │ ├── animalsnearyou │ │ │ └── presentation │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ └── InfiniteScrollListener.kt │ │ │ ├── core │ │ │ ├── MainActivity.kt │ │ │ ├── data │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ ├── api │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ ├── interceptors │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ └── MappingException.kt │ │ │ │ ├── cache │ │ │ │ │ ├── Cache.kt │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ ├── daos │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ └── preferences │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ └── PreferencesConstants.kt │ │ │ ├── di │ │ │ │ ├── ApplicationModule.kt │ │ │ │ └── ViewModelsModule.kt │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── animal │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ └── Media.kt │ │ │ │ │ ├── organization │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ ├── pagination │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── user │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ └── Users.kt │ │ │ │ ├── repositories │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ └── UserRepository.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ ├── presentation │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ ├── Event.kt │ │ │ │ └── model │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ └── mappers │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ └── UiMapper.kt │ │ │ └── utils │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ ├── Encryption.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── FileConstants.kt │ │ │ │ └── PreferencesHelper.kt │ │ │ ├── report │ │ │ └── presentation │ │ │ │ └── ReportDetailFragment.kt │ │ │ └── search │ │ │ ├── domain │ │ │ ├── Exceptions.kt │ │ │ ├── model │ │ │ │ ├── SearchFilters.kt │ │ │ │ ├── SearchParameters.kt │ │ │ │ └── SearchResults.kt │ │ │ └── usecases │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ ├── SearchAnimals.kt │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ └── presentation │ │ │ ├── SearchEvent.kt │ │ │ ├── SearchFragment.kt │ │ │ ├── SearchFragmentViewModel.kt │ │ │ └── SearchViewState.kt │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── card_view_border.xml │ │ ├── cat_derp.png │ │ ├── dog_placeholder.png │ │ ├── ic_animals_near_you_24dp.xml │ │ ├── ic_close_24dp.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_search_24dp.xml │ │ ├── no_results_pug.png │ │ └── splash_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── dropdown_menu_popup_item.xml │ │ ├── exposed_dropdown_menu.xml │ │ ├── filtered_search_widget.xml │ │ ├── fragment_animals_near_you.xml │ │ ├── fragment_report_detail.xml │ │ ├── fragment_search.xml │ │ └── recycler_view_animal_item.xml │ │ ├── menu │ │ ├── menu_bottom_nav.xml │ │ └── menu_search.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_background.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── navigation │ │ └── nav_graph.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 17-securing-data-in-transit ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── users.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── core │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ │ └── user │ │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ │ ├── repositories │ │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ │ └── PreferencesHelper.kt │ │ │ │ │ ├── report │ │ │ │ │ └── presentation │ │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_report_detail.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── users.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ └── PreferencesHelper.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 18-app-hardening ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── users.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── core │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ │ └── user │ │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ │ ├── repositories │ │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ │ ├── Timing.kt │ │ │ │ │ │ └── WatchDog.kt │ │ │ │ │ ├── report │ │ │ │ │ └── presentation │ │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_report_detail.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── users.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ ├── Timing.kt │ │ │ │ │ └── WatchDog.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 19-firebase-integration ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── google-services.json │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── font │ │ │ │ ├── roboto_family.xml │ │ │ │ └── roboto_regular.ttf │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ ├── layout_pet_stat.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ ├── menu_search.xml │ │ │ │ └── theme_options.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ │ ├── values │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── fragment_details_scene.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ ├── remoteconfig │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── remoteconfig │ │ │ └── RemoteConfigUtil.kt │ └── settings.gradle │ └── starter │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── animator │ │ │ ├── animator_alpha.xml │ │ │ └── animator_heart_fillup.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── heart_fill_animation.xml │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_heart_unfilled.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── font │ │ │ ├── roboto_family.xml │ │ │ └── roboto_regular.ttf │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ ├── layout_pet_stat.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ ├── menu_search.xml │ │ │ └── theme_options.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ ├── values-night │ │ │ └── colors.xml │ │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── fragment_details_scene.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 20-release-optimizations ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .idea │ │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.ReportDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.ReportDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── users.xml │ │ │ ├── cpp │ │ │ │ ├── include │ │ │ │ │ └── user_processing_jni.h │ │ │ │ └── user_processing_jni.cpp │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── core │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ │ ├── SN.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── ReportDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ ├── OrganizationsDao.kt │ │ │ │ │ │ │ │ └── ReportsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── Report.kt │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ │ └── user │ │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ │ ├── repositories │ │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ │ ├── Timing.kt │ │ │ │ │ │ └── WatchDog.kt │ │ │ │ │ ├── report │ │ │ │ │ └── presentation │ │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_report_detail.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .idea │ └── vcs.xml │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.ReportDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.ReportDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── users.xml │ │ ├── cpp │ │ │ ├── include │ │ │ │ └── user_processing_jni.h │ │ │ └── user_processing_jni.cpp │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ ├── SN.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── ReportDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ ├── OrganizationsDao.kt │ │ │ │ │ │ │ └── ReportsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── Report.kt │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ ├── Timing.kt │ │ │ │ │ └── WatchDog.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── 21-advanced-debugging ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── google-services.json │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── common │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── repositories │ │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ └── Extensions.kt │ │ │ │ │ ├── details │ │ │ │ │ ├── domain │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ │ ├── easteregg │ │ │ │ │ └── SecretFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── animator │ │ │ │ ├── animator_alpha.xml │ │ │ │ └── animator_heart_fillup.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── cute_doggo.webp │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── heart_fill_animation.xml │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_call_24dp.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_heart_unfilled.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── font │ │ │ │ ├── roboto_family.xml │ │ │ │ └── roboto_regular.ttf │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_details.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ ├── fragment_secret.xml │ │ │ │ ├── layout_pet_stat.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ ├── menu_search.xml │ │ │ │ └── theme_options.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── raw │ │ │ │ ├── happy_dog.json │ │ │ │ └── lazy_cat.json │ │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ │ ├── values │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── fragment_details_scene.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── design_mockup.png │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ ├── remoteconfig │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── remoteconfig │ │ │ └── RemoteConfigUtil.kt │ └── settings.gradle │ └── starter │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── google-services.json │ ├── proguard-rules.pro │ ├── schemas │ │ └── com.realworld.android.petsave.common.data.cache.PetSaveDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── common │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ └── OrganizationsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ │ └── details │ │ │ │ │ │ │ │ ├── Age.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── Breed.kt │ │ │ │ │ │ │ │ ├── Coat.kt │ │ │ │ │ │ │ │ ├── Colors.kt │ │ │ │ │ │ │ │ ├── Details.kt │ │ │ │ │ │ │ │ ├── Gender.kt │ │ │ │ │ │ │ │ ├── HabitatAdaptation.kt │ │ │ │ │ │ │ │ ├── HealthDetails.kt │ │ │ │ │ │ │ │ └── Size.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ └── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ └── repositories │ │ │ │ │ │ └── AnimalRepository.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ ├── ProgressButton.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ ├── UIAnimalDetailed.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalDetailsMapper.kt │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ └── Extensions.kt │ │ │ │ ├── details │ │ │ │ ├── domain │ │ │ │ │ └── usecases │ │ │ │ │ │ └── AnimalDetails.kt │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalDetailsEvent.kt │ │ │ │ │ ├── AnimalDetailsFragment.kt │ │ │ │ │ ├── AnimalDetailsViewModel.kt │ │ │ │ │ └── AnimalDetailsViewState.kt │ │ │ │ ├── easteregg │ │ │ │ └── SecretFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── model │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── animator │ │ │ ├── animator_alpha.xml │ │ │ └── animator_heart_fillup.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── cute_doggo.webp │ │ │ ├── dog_placeholder.png │ │ │ ├── heart_fill_animation.xml │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_call_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_heart_unfilled.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── font │ │ │ ├── roboto_family.xml │ │ │ └── roboto_regular.ttf │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_details.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_secret.xml │ │ │ ├── layout_pet_stat.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ ├── menu_search.xml │ │ │ └── theme_options.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── raw │ │ │ ├── happy_dog.json │ │ │ └── lazy_cat.json │ │ │ ├── values-night │ │ │ └── colors.xml │ │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── fragment_details_scene.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── design_mockup.png │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ ├── remoteconfig │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── remoteconfig │ │ └── RemoteConfigUtil.kt │ └── settings.gradle ├── 22-app-analysis ├── assets │ └── .keep └── projects │ ├── challenge │ └── .keep │ ├── final │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ ├── schemas │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.petsave.core.data.cache.ReportDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ ├── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ │ └── 1.json │ │ │ └── com.realworld.android.petsave.core.data.cache.ReportDatabase │ │ │ │ └── 1.json │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ │ └── users.xml │ │ │ ├── cpp │ │ │ │ ├── include │ │ │ │ │ └── user_processing_jni.h │ │ │ │ └── user_processing_jni.cpp │ │ │ ├── ic_launcher-web.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── realworld │ │ │ │ │ └── android │ │ │ │ │ └── petsave │ │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ │ ├── animalsnearyou │ │ │ │ │ └── presentation │ │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ │ ├── core │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── data │ │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ │ ├── SN.kt │ │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ │ ├── cache │ │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ │ ├── ReportDatabase.kt │ │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ │ ├── OrganizationsDao.kt │ │ │ │ │ │ │ │ └── ReportsDao.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ ├── Report.kt │ │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ │ ├── di │ │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ │ └── preferences │ │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── model │ │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ │ └── user │ │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ │ ├── repositories │ │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ │ └── usecases │ │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ │ ├── presentation │ │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ │ ├── Event.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ │ ├── Timing.kt │ │ │ │ │ │ └── WatchDog.kt │ │ │ │ │ ├── report │ │ │ │ │ └── presentation │ │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ │ └── search │ │ │ │ │ ├── domain │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ │ └── SearchResults.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ │ └── presentation │ │ │ │ │ ├── SearchEvent.kt │ │ │ │ │ ├── SearchFragment.kt │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ └── SearchViewState.kt │ │ │ └── res │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── drawable │ │ │ │ ├── card_view_border.xml │ │ │ │ ├── cat_derp.png │ │ │ │ ├── dog_placeholder.png │ │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ │ ├── ic_close_24dp.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── ic_search_24dp.xml │ │ │ │ ├── no_results_pug.png │ │ │ │ └── splash_background.xml │ │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ │ ├── exposed_dropdown_menu.xml │ │ │ │ ├── filtered_search_widget.xml │ │ │ │ ├── fragment_animals_near_you.xml │ │ │ │ ├── fragment_report_detail.xml │ │ │ │ ├── fragment_search.xml │ │ │ │ └── recycler_view_animal_item.xml │ │ │ │ ├── menu │ │ │ │ ├── menu_bottom_nav.xml │ │ │ │ └── menu_search.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── navigation │ │ │ │ └── nav_graph.xml │ │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ │ ├── accept_change.png │ │ ├── modified_default.png │ │ ├── restore_default.png │ │ ├── unmodified_default.png │ │ ├── using_named_code_style.png │ │ └── working_gif.gif │ ├── logging │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── TimberLogging.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── logging │ │ │ │ └── Logger.kt │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── raywenderlich │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ └── settings.gradle │ └── starter │ ├── .gitignore │ ├── .keep │ ├── README.md │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── schemas │ │ ├── com.raywenderlich.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.petsave.core.data.cache.ReportDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.raywenderlich.android.realworldandroidbytutorials.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ ├── com.realworld.android.petsave.core.data.cache.PetSaveDatabase │ │ │ └── 1.json │ │ └── com.realworld.android.petsave.core.data.cache.ReportDatabase │ │ │ └── 1.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── petsave │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── users.xml │ │ ├── cpp │ │ │ ├── include │ │ │ │ └── user_processing_jni.h │ │ │ └── user_processing_jni.cpp │ │ ├── ic_launcher-web.png │ │ ├── java │ │ │ └── com │ │ │ │ └── realworld │ │ │ │ └── android │ │ │ │ └── petsave │ │ │ │ ├── PetSaveApplication.kt │ │ │ │ ├── animalsnearyou │ │ │ │ └── presentation │ │ │ │ │ ├── AnimalsNearYouEvent.kt │ │ │ │ │ ├── AnimalsNearYouFragment.kt │ │ │ │ │ ├── AnimalsNearYouFragmentViewModel.kt │ │ │ │ │ ├── AnimalsNearYouViewState.kt │ │ │ │ │ └── InfiniteScrollListener.kt │ │ │ │ ├── core │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── data │ │ │ │ │ ├── PetFinderAnimalRepository.kt │ │ │ │ │ ├── api │ │ │ │ │ │ ├── ApiConstants.kt │ │ │ │ │ │ ├── Authenticator.kt │ │ │ │ │ │ ├── PetFinderApi.kt │ │ │ │ │ │ ├── ReportManager.kt │ │ │ │ │ │ ├── SN.kt │ │ │ │ │ │ ├── interceptors │ │ │ │ │ │ │ ├── AuthenticationInterceptor.kt │ │ │ │ │ │ │ └── LoggingInterceptor.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── ApiAnimal.kt │ │ │ │ │ │ │ ├── ApiPaginatedAnimals.kt │ │ │ │ │ │ │ ├── ApiToken.kt │ │ │ │ │ │ │ └── mappers │ │ │ │ │ │ │ ├── ApiAddressMapper.kt │ │ │ │ │ │ │ ├── ApiAnimalMapper.kt │ │ │ │ │ │ │ ├── ApiBreedsMapper.kt │ │ │ │ │ │ │ ├── ApiColorsMapper.kt │ │ │ │ │ │ │ ├── ApiContactMapper.kt │ │ │ │ │ │ │ ├── ApiHabitatAdaptationMapper.kt │ │ │ │ │ │ │ ├── ApiHealthDetailsMapper.kt │ │ │ │ │ │ │ ├── ApiMapper.kt │ │ │ │ │ │ │ ├── ApiPaginationMapper.kt │ │ │ │ │ │ │ ├── ApiPhotoMapper.kt │ │ │ │ │ │ │ ├── ApiVideoMapper.kt │ │ │ │ │ │ │ └── MappingException.kt │ │ │ │ │ ├── cache │ │ │ │ │ │ ├── Cache.kt │ │ │ │ │ │ ├── PetSaveDatabase.kt │ │ │ │ │ │ ├── ReportDatabase.kt │ │ │ │ │ │ ├── RoomCache.kt │ │ │ │ │ │ ├── daos │ │ │ │ │ │ │ ├── AnimalsDao.kt │ │ │ │ │ │ │ ├── OrganizationsDao.kt │ │ │ │ │ │ │ └── ReportsDao.kt │ │ │ │ │ │ └── model │ │ │ │ │ │ │ ├── Report.kt │ │ │ │ │ │ │ ├── cachedanimal │ │ │ │ │ │ │ ├── CachedAnimal.kt │ │ │ │ │ │ │ ├── CachedAnimalAggregate.kt │ │ │ │ │ │ │ ├── CachedAnimalTagCrossRef.kt │ │ │ │ │ │ │ ├── CachedAnimalWithDetails.kt │ │ │ │ │ │ │ ├── CachedPhoto.kt │ │ │ │ │ │ │ ├── CachedTag.kt │ │ │ │ │ │ │ └── CachedVideo.kt │ │ │ │ │ │ │ └── cachedorganization │ │ │ │ │ │ │ ├── CachedOrganization.kt │ │ │ │ │ │ │ └── CachedOrganizationWithAnimals.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── ApiModule.kt │ │ │ │ │ │ ├── CacheModule.kt │ │ │ │ │ │ └── PreferencesModule.kt │ │ │ │ │ └── preferences │ │ │ │ │ │ ├── PetSavePreferences.kt │ │ │ │ │ │ ├── Preferences.kt │ │ │ │ │ │ └── PreferencesConstants.kt │ │ │ │ ├── di │ │ │ │ │ ├── ApplicationModule.kt │ │ │ │ │ └── ViewModelsModule.kt │ │ │ │ ├── domain │ │ │ │ │ ├── model │ │ │ │ │ │ ├── Exceptions.kt │ │ │ │ │ │ ├── animal │ │ │ │ │ │ │ ├── AdoptionStatus.kt │ │ │ │ │ │ │ ├── Animal.kt │ │ │ │ │ │ │ ├── AnimalWithDetails.kt │ │ │ │ │ │ │ └── Media.kt │ │ │ │ │ │ ├── organization │ │ │ │ │ │ │ └── Organization.kt │ │ │ │ │ │ ├── pagination │ │ │ │ │ │ │ ├── PaginatedAnimals.kt │ │ │ │ │ │ │ └── Pagination.kt │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ │ └── Users.kt │ │ │ │ │ ├── repositories │ │ │ │ │ │ ├── AnimalRepository.kt │ │ │ │ │ │ └── UserRepository.kt │ │ │ │ │ └── usecases │ │ │ │ │ │ ├── GetAnimals.kt │ │ │ │ │ │ └── RequestNextPageOfAnimals.kt │ │ │ │ ├── presentation │ │ │ │ │ ├── AnimalsAdapter.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ └── model │ │ │ │ │ │ ├── UIAnimal.kt │ │ │ │ │ │ └── mappers │ │ │ │ │ │ ├── UiAnimalMapper.kt │ │ │ │ │ │ └── UiMapper.kt │ │ │ │ └── utils │ │ │ │ │ ├── CoroutineDispatchersProvider.kt │ │ │ │ │ ├── DataValidator.kt │ │ │ │ │ ├── DateTimeUtils.kt │ │ │ │ │ ├── DispatchersProvider.kt │ │ │ │ │ ├── Encryption.kt │ │ │ │ │ ├── Extensions.kt │ │ │ │ │ ├── FileConstants.kt │ │ │ │ │ ├── PreferencesHelper.kt │ │ │ │ │ ├── Timing.kt │ │ │ │ │ └── WatchDog.kt │ │ │ │ ├── report │ │ │ │ └── presentation │ │ │ │ │ └── ReportDetailFragment.kt │ │ │ │ └── search │ │ │ │ ├── domain │ │ │ │ ├── Exceptions.kt │ │ │ │ ├── model │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ ├── SearchParameters.kt │ │ │ │ │ └── SearchResults.kt │ │ │ │ └── usecases │ │ │ │ │ ├── GetSearchFilters.kt │ │ │ │ │ ├── SearchAnimals.kt │ │ │ │ │ └── SearchAnimalsRemotely.kt │ │ │ │ └── presentation │ │ │ │ ├── SearchEvent.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ └── SearchViewState.kt │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── card_view_border.xml │ │ │ ├── cat_derp.png │ │ │ ├── dog_placeholder.png │ │ │ ├── ic_animals_near_you_24dp.xml │ │ │ ├── ic_baseline_report_problem_24.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_search_24dp.xml │ │ │ ├── no_results_pug.png │ │ │ └── splash_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── dropdown_menu_popup_item.xml │ │ │ ├── exposed_dropdown_menu.xml │ │ │ ├── filtered_search_widget.xml │ │ │ ├── fragment_animals_near_you.xml │ │ │ ├── fragment_report_detail.xml │ │ │ ├── fragment_search.xml │ │ │ └── recycler_view_animal_item.xml │ │ │ ├── menu │ │ │ ├── menu_bottom_nav.xml │ │ │ └── menu_search.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── realworld │ │ └── android │ │ └── petsave │ │ └── ExampleUnitTest.kt │ ├── build.gradle │ ├── configs │ └── rwcodestyle.xml │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── img │ ├── accept_change.png │ ├── modified_default.png │ ├── restore_default.png │ ├── unmodified_default.png │ ├── using_named_code_style.png │ └── working_gif.gif │ ├── logging │ ├── .gitignore │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── TimberLogging.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── realworld │ │ │ └── android │ │ │ └── logging │ │ │ └── Logger.kt │ │ └── release │ │ └── java │ │ └── com │ │ └── raywenderlich │ │ └── android │ │ └── logging │ │ └── TimberLogging.kt │ └── settings.gradle ├── LICENSE ├── README.md └── scripts ├── make-codex-branch.sh └── make-codex-subdirectory.sh /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/.gitignore -------------------------------------------------------------------------------- /01-introduction/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01-introduction/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01-introduction/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01-introduction/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/.gitignore -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/README.md -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/app/src/main/java/com/realworld/android/petsave/animalsnearyou/domain/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/app/src/main/java/com/realworld/android/petsave/common/di/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/app/src/main/java/com/realworld/android/petsave/common/domain/repositories/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/app/src/main/java/com/realworld/android/petsave/search/domain/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/build.gradle -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/gradlew -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /02-starting-from-the-beginning/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/02-starting-from-the-beginning/projects/starter/settings.gradle -------------------------------------------------------------------------------- /03-domain-layer/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/.gitignore -------------------------------------------------------------------------------- /03-domain-layer/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/README.md -------------------------------------------------------------------------------- /03-domain-layer/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /03-domain-layer/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/app/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /03-domain-layer/projects/final/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /03-domain-layer/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /03-domain-layer/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/gradle.properties -------------------------------------------------------------------------------- /03-domain-layer/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/gradlew -------------------------------------------------------------------------------- /03-domain-layer/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/gradlew.bat -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/using_named_code_style.png -------------------------------------------------------------------------------- /03-domain-layer/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /03-domain-layer/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /03-domain-layer/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/final/settings.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/.gitignore -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/.idea/compiler.xml -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/README.md -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/app/src/main/java/com/realworld/android/petsave/common/domain/repositories/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/app/src/test/java/com/realworld/android/petsave/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/gradle.properties -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/gradlew -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/using_named_code_style.png -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03-domain-layer/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/03-domain-layer/projects/starter/settings.gradle -------------------------------------------------------------------------------- /04-data-layer-network/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/.gitignore -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/.idea/compiler.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/README.md -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/app/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/gradle.properties -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/gradlew -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/gradlew.bat -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/final/settings.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/.gitignore -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/.idea/compiler.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/README.md -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/gradle.properties -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/gradlew -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /04-data-layer-network/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/04-data-layer-network/projects/starter/settings.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/.gitignore -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/.idea/compiler.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/README.md -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/app/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/gradle.properties -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/gradlew -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/gradlew.bat -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/final/settings.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/.gitignore -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/.idea/compiler.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/README.md -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/gradle.properties -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/gradlew -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /05-data-layer-caching/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/05-data-layer-caching/projects/starter/settings.gradle -------------------------------------------------------------------------------- /06-building-features-animals-near-you/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/06-building-features-animals-near-you/projects/final/.gitignore -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/06-building-features-animals-near-you/projects/final/README.md -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/06-building-features-animals-near-you/projects/final/gradlew -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/06-building-features-animals-near-you/projects/starter/gradlew -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /06-building-features-animals-near-you/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /07-building-features-search/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-building-features-search/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-building-features-search/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/.gitignore -------------------------------------------------------------------------------- /07-building-features-search/projects/final/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/.idea/compiler.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-building-features-search/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/README.md -------------------------------------------------------------------------------- /07-building-features-search/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /07-building-features-search/projects/final/app/.idea/gradle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/app/.idea/gradle.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/final/app/.idea/misc.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/app/.idea/misc.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/app/build.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/build.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/gradle.properties -------------------------------------------------------------------------------- /07-building-features-search/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/gradlew -------------------------------------------------------------------------------- /07-building-features-search/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/gradlew.bat -------------------------------------------------------------------------------- /07-building-features-search/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /07-building-features-search/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /07-building-features-search/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /07-building-features-search/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/final/settings.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/.gitignore -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/.idea/compiler.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/README.md -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/app/.idea/misc.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/app/.idea/misc.xml -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/app/src/main/java/com/realworld/android/petsave/search/domain/model/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/build.gradle -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/gradle.properties -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/gradlew -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /07-building-features-search/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/07-building-features-search/projects/starter/settings.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/.gitignore -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/.idea/compiler.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/README.md -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/android-library.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/android-library.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/.idea/gradle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/.idea/gradle.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/.idea/misc.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/.idea/misc.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/.idea/modules.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/.idea/modules.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/.idea/workspace.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/.idea/workspace.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/common/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/common/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/common/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/common/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/common/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/common/proguard-rules.pro -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/animalsnearyou/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/animalsnearyou/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/onboarding/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/onboarding/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/features/search/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/gradle.properties -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/gradlew -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/gradlew.bat -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/final/settings.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/.gitignore -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/.idea/compiler.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/README.md -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/android-library.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/android-library.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/.idea/gradle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/.idea/gradle.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/.idea/misc.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/.idea/misc.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/.idea/modules.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/.idea/modules.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/.idea/workspace.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/.idea/workspace.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/common/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/common/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/common/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/common/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/common/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/common/proguard-rules.pro -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/features/animalsnearyou/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/features/animalsnearyou/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/features/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/features/search/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/gradle.properties -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/gradlew -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /08-multi-module-apps/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/08-multi-module-apps/projects/starter/settings.gradle -------------------------------------------------------------------------------- /09-dynamic-features-theory/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /09-dynamic-features-theory/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /09-dynamic-features-theory/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /09-dynamic-features-theory/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/.gitignore -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/.idea/compiler.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/.idea/compiler.xml -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/README.md -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/app/.idea/misc.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/app/.idea/misc.xml -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/app/build.gradle -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/build.gradle -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/common/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/common/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/animalsnearyou/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/animalsnearyou/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/onboarding/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/onboarding/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/search/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/sharing/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/features/sharing/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/gradle.properties -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/gradlew -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/gradlew.bat -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/final/settings.gradle -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/.gitignore -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/README.md -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/build.gradle -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/common/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/common/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/animalsnearyou/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/animalsnearyou/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/onboarding/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/onboarding/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/search/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/sharing/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/features/sharing/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/gradlew -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /10-building-a-dynamic-feature/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/10-building-a-dynamic-feature/projects/starter/settings.gradle -------------------------------------------------------------------------------- /11-animations/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11-animations/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/.gitignore -------------------------------------------------------------------------------- /11-animations/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11-animations/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /11-animations/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/res/raw/lazy_cat.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/res/raw/lazy_cat.json -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/res/values/colors.xml -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/res/values/dimens.xml -------------------------------------------------------------------------------- /11-animations/projects/final/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/app/src/main/res/values/styles.xml -------------------------------------------------------------------------------- /11-animations/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /11-animations/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/gradle.properties -------------------------------------------------------------------------------- /11-animations/projects/final/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /11-animations/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/gradlew -------------------------------------------------------------------------------- /11-animations/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/gradlew.bat -------------------------------------------------------------------------------- /11-animations/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /11-animations/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11-animations/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/final/settings.gradle -------------------------------------------------------------------------------- /11-animations/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/.gitignore -------------------------------------------------------------------------------- /11-animations/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11-animations/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /11-animations/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /11-animations/projects/starter/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /11-animations/projects/starter/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /11-animations/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /11-animations/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/gradle.properties -------------------------------------------------------------------------------- /11-animations/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/gradlew -------------------------------------------------------------------------------- /11-animations/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /11-animations/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /11-animations/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /11-animations/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /11-animations/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/11-animations/projects/starter/settings.gradle -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/final/README.md -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/final/build.gradle -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/final/gradlew -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/final/gradlew.bat -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/starter/README.md -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/starter/build.gradle -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/starter/gradlew -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/12-motionlayout-and-motion-editor/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /12-motionlayout-and-motion-editor/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /13-custom-views/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /13-custom-views/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/README.md -------------------------------------------------------------------------------- /13-custom-views/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /13-custom-views/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/app/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /13-custom-views/projects/final/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /13-custom-views/projects/final/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /13-custom-views/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/gradle.properties -------------------------------------------------------------------------------- /13-custom-views/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/gradlew -------------------------------------------------------------------------------- /13-custom-views/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/gradlew.bat -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/using_named_code_style.png -------------------------------------------------------------------------------- /13-custom-views/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /13-custom-views/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /13-custom-views/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /13-custom-views/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/final/settings.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /13-custom-views/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/README.md -------------------------------------------------------------------------------- /13-custom-views/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /13-custom-views/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /13-custom-views/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /13-custom-views/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/gradle.properties -------------------------------------------------------------------------------- /13-custom-views/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/gradlew -------------------------------------------------------------------------------- /13-custom-views/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/using_named_code_style.png -------------------------------------------------------------------------------- /13-custom-views/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /13-custom-views/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /13-custom-views/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /13-custom-views/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /13-custom-views/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/13-custom-views/projects/starter/settings.gradle -------------------------------------------------------------------------------- /14-style-and-theme/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/README.md -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/app/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/gradle.properties -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/gradlew -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/gradlew.bat -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /14-style-and-theme/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/final/settings.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/README.md -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/gradle.properties -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/gradlew -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /14-style-and-theme/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/14-style-and-theme/projects/starter/settings.gradle -------------------------------------------------------------------------------- /15-user-privacy/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/.gitignore -------------------------------------------------------------------------------- /15-user-privacy/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/README.md -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/app/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/src/main/assets/users.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/app/src/main/assets/users.xml -------------------------------------------------------------------------------- /15-user-privacy/projects/final/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /15-user-privacy/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/gradle.properties -------------------------------------------------------------------------------- /15-user-privacy/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/gradlew -------------------------------------------------------------------------------- /15-user-privacy/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/gradlew.bat -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/using_named_code_style.png -------------------------------------------------------------------------------- /15-user-privacy/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /15-user-privacy/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /15-user-privacy/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/final/settings.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/.gitignore -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/README.md -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/app/src/main/assets/users.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/app/src/main/assets/users.xml -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/gradle.properties -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/gradlew -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/using_named_code_style.png -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /15-user-privacy/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/15-user-privacy/projects/starter/settings.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/.gitignore -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/README.md -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/app/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/gradle.properties -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/gradlew -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/gradlew.bat -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/final/settings.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/.gitignore -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/README.md -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/gradle.properties -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/gradlew -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /16-securing-data-at-rest/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/16-securing-data-at-rest/projects/starter/settings.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/.gitignore -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/README.md -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/app/build.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/build.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/gradle.properties -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/gradlew -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/gradlew.bat -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/final/settings.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/.gitignore -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/README.md -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/build.gradle -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/gradle.properties -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/gradlew -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /17-securing-data-in-transit/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/17-securing-data-in-transit/projects/starter/settings.gradle -------------------------------------------------------------------------------- /18-app-hardening/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/.gitignore -------------------------------------------------------------------------------- /18-app-hardening/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/README.md -------------------------------------------------------------------------------- /18-app-hardening/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /18-app-hardening/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/app/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /18-app-hardening/projects/final/app/src/main/assets/users.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/app/src/main/assets/users.xml -------------------------------------------------------------------------------- /18-app-hardening/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /18-app-hardening/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/gradle.properties -------------------------------------------------------------------------------- /18-app-hardening/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/gradlew -------------------------------------------------------------------------------- /18-app-hardening/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/gradlew.bat -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/using_named_code_style.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/using_named_code_style.png -------------------------------------------------------------------------------- /18-app-hardening/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /18-app-hardening/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /18-app-hardening/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/final/settings.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/.gitignore -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/README.md -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/app/src/main/assets/users.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/app/src/main/assets/users.xml -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/gradle.properties -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/gradlew -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /18-app-hardening/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/18-app-hardening/projects/starter/settings.gradle -------------------------------------------------------------------------------- /19-firebase-integration/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/README.md -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/app/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/app/google-services.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/app/google-services.json -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/gradle.properties -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/gradlew -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/gradlew.bat -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/remoteconfig/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/remoteconfig/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/final/settings.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/README.md -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/gradle.properties -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/gradlew -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /19-firebase-integration/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/19-firebase-integration/projects/starter/settings.gradle -------------------------------------------------------------------------------- /20-release-optimizations/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/.gitignore -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/.idea/vcs.xml -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/README.md -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/app/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/gradle.properties -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/gradlew -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/gradlew.bat -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/final/settings.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/.gitignore -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/.idea/vcs.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/.idea/vcs.xml -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/README.md -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/gradle.properties -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/gradlew -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /20-release-optimizations/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/20-release-optimizations/projects/starter/settings.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/README.md -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/app/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/app/google-services.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/app/google-services.json -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/design_mockup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/design_mockup.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/gradle.properties -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/gradlew -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/gradlew.bat -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/remoteconfig/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/remoteconfig/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/remoteconfig/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/remoteconfig/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/final/settings.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/README.md -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/app/google-services.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/app/google-services.json -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/design_mockup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/design_mockup.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/gradle.properties -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/gradlew -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/remoteconfig/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/remoteconfig/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /21-advanced-debugging/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/21-advanced-debugging/projects/starter/settings.gradle -------------------------------------------------------------------------------- /22-app-analysis/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/challenge/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/final/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/.gitignore -------------------------------------------------------------------------------- /22-app-analysis/projects/final/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/final/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/README.md -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/app/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/app/proguard-rules.pro -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/app/src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/src/main/assets/users.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/app/src/main/assets/users.xml -------------------------------------------------------------------------------- /22-app-analysis/projects/final/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /22-app-analysis/projects/final/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/final/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /22-app-analysis/projects/final/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/gradle.properties -------------------------------------------------------------------------------- /22-app-analysis/projects/final/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/gradlew -------------------------------------------------------------------------------- /22-app-analysis/projects/final/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/gradlew.bat -------------------------------------------------------------------------------- /22-app-analysis/projects/final/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/img/accept_change.png -------------------------------------------------------------------------------- /22-app-analysis/projects/final/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/img/modified_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/final/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/img/restore_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/final/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/img/unmodified_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/final/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/img/working_gif.gif -------------------------------------------------------------------------------- /22-app-analysis/projects/final/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /22-app-analysis/projects/final/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/logging/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/final/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/final/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/final/settings.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/.gitignore -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/README.md -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/app/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/app/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/app/proguard-rules.pro -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/configs/rwcodestyle.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/configs/rwcodestyle.xml -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/gradle.properties -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/gradlew: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/gradlew -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/gradlew.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/gradlew.bat -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/img/accept_change.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/img/accept_change.png -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/img/modified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/img/modified_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/img/restore_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/img/restore_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/img/unmodified_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/img/unmodified_default.png -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/img/working_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/img/working_gif.gif -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/logging/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/logging/build.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/logging/build.gradle -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/logging/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /22-app-analysis/projects/starter/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/22-app-analysis/projects/starter/settings.gradle -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/LICENSE -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/README.md -------------------------------------------------------------------------------- /scripts/make-codex-branch.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/scripts/make-codex-branch.sh -------------------------------------------------------------------------------- /scripts/make-codex-subdirectory.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kodecocodes/adva-materials/HEAD/scripts/make-codex-subdirectory.sh --------------------------------------------------------------------------------