├── .gitignore ├── LICENSE.md ├── README.md ├── app ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── functionalkotlin │ │ │ └── bandhookkotlin │ │ │ ├── App.kt │ │ │ ├── data │ │ │ ├── CloudAlbumDataSet.kt │ │ │ ├── CloudArtistDataSet.kt │ │ │ ├── Util.kt │ │ │ ├── lastfm │ │ │ │ ├── LastFmRequestInterceptor.kt │ │ │ │ ├── LastFmService.kt │ │ │ │ └── model │ │ │ │ │ ├── LastFmAlbum.kt │ │ │ │ │ ├── LastFmAlbumDetail.kt │ │ │ │ │ ├── LastFmArtist.kt │ │ │ │ │ ├── LastFmArtistList.kt │ │ │ │ │ ├── LastFmArtistMatches.kt │ │ │ │ │ ├── LastFmBio.kt │ │ │ │ │ ├── LastFmImage.kt │ │ │ │ │ ├── LastFmImageType.kt │ │ │ │ │ ├── LastFmResponse.kt │ │ │ │ │ ├── LastFmResult.kt │ │ │ │ │ ├── LastFmSimilar.kt │ │ │ │ │ ├── LastFmTopAlbums.kt │ │ │ │ │ ├── LastFmTrack.kt │ │ │ │ │ └── LastFmTracklist.kt │ │ │ └── mapper │ │ │ │ ├── album │ │ │ │ └── AlbumMapper.kt │ │ │ │ ├── artist │ │ │ │ └── ArtistMapper.kt │ │ │ │ ├── image │ │ │ │ └── ImageMapper.kt │ │ │ │ └── track │ │ │ │ └── TrackMapper.kt │ │ │ ├── di │ │ │ ├── ActivityModule.kt │ │ │ ├── ApplicationComponent.kt │ │ │ ├── ApplicationModule.kt │ │ │ ├── DataModule.kt │ │ │ ├── DomainModule.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── qualifier │ │ │ │ ├── ApiKey.kt │ │ │ │ ├── ApplicationQualifier.kt │ │ │ │ ├── CacheDuration.kt │ │ │ │ └── LanguageSelection.kt │ │ │ ├── scope │ │ │ │ └── ActivityScope.kt │ │ │ └── subcomponent │ │ │ │ ├── album │ │ │ │ ├── AlbumActivityComponent.kt │ │ │ │ └── AlbumActivityModule.kt │ │ │ │ ├── detail │ │ │ │ ├── ArtistActivityComponent.kt │ │ │ │ └── ArtistActivityModule.kt │ │ │ │ └── main │ │ │ │ ├── MainActivityComponent.kt │ │ │ │ └── MainActivityModule.kt │ │ │ ├── domain │ │ │ ├── entity │ │ │ │ ├── Album.kt │ │ │ │ ├── Artist.kt │ │ │ │ ├── Exceptions.kt │ │ │ │ └── Track.kt │ │ │ ├── interactor │ │ │ │ ├── GetAlbumDetailInteractor.kt │ │ │ │ ├── GetArtistDetailInteractor.kt │ │ │ │ ├── GetRecommendedArtistsInteractor.kt │ │ │ │ └── GetTopAlbumsInteractor.kt │ │ │ └── repository │ │ │ │ ├── AlbumRepository.kt │ │ │ │ └── ArtistRepository.kt │ │ │ ├── functional │ │ │ ├── AsyncResult.kt │ │ │ ├── Future.kt │ │ │ ├── List.kt │ │ │ ├── Option.kt │ │ │ └── Result.kt │ │ │ ├── repository │ │ │ ├── AlbumRepositoryImpl.kt │ │ │ ├── ArtistRepositoryImpl.kt │ │ │ └── dataset │ │ │ │ ├── AlbumDataSet.kt │ │ │ │ └── ArtistDataSet.kt │ │ │ └── ui │ │ │ ├── activity │ │ │ ├── ActivityAnkoComponent.kt │ │ │ ├── BaseActivity.kt │ │ │ └── ViewGroupComponent.kt │ │ │ ├── adapter │ │ │ ├── ArtistDetailPagerAdapter.kt │ │ │ ├── BaseAdapter.kt │ │ │ ├── ImageTitleAdapter.kt │ │ │ ├── SingleClickListener.kt │ │ │ └── TracksAdapter.kt │ │ │ ├── custom │ │ │ ├── AutofitRecyclerView.kt │ │ │ ├── PaddingItemDecoration.kt │ │ │ └── SquareImageView.kt │ │ │ ├── entity │ │ │ ├── AlbumDetail.kt │ │ │ ├── ArtistDetail.kt │ │ │ ├── ImageTitle.kt │ │ │ ├── TrackDetail.kt │ │ │ └── mapper │ │ │ │ ├── album │ │ │ │ └── detail │ │ │ │ │ └── AlbumDetailDataMapper.kt │ │ │ │ ├── artist │ │ │ │ └── detail │ │ │ │ │ └── ArtistDetailDataMapper.kt │ │ │ │ ├── image │ │ │ │ └── title │ │ │ │ │ └── ImageTitleDataMapper.kt │ │ │ │ └── track │ │ │ │ └── TrackDataMapper.kt │ │ │ ├── fragment │ │ │ └── AlbumsFragmentContainer.kt │ │ │ ├── presenter │ │ │ ├── AlbumPresenter.kt │ │ │ ├── ArtistPresenter.kt │ │ │ ├── MainPresenter.kt │ │ │ └── base │ │ │ │ ├── AlbumsPresenter.kt │ │ │ │ └── Presenter.kt │ │ │ ├── screens │ │ │ ├── Styles.kt │ │ │ ├── album │ │ │ │ ├── AlbumActivity.kt │ │ │ │ └── AlbumLayout.kt │ │ │ ├── detail │ │ │ │ ├── AlbumsFragment.kt │ │ │ │ ├── ArtistActivity.kt │ │ │ │ ├── ArtistLayout.kt │ │ │ │ └── BiographyFragment.kt │ │ │ └── main │ │ │ │ ├── MainActivity.kt │ │ │ │ └── MainLayout.kt │ │ │ ├── util │ │ │ ├── ContextExtensions.kt │ │ │ ├── PicassoExtensions.kt │ │ │ ├── VersionsSupport.kt │ │ │ └── ViewExtensions.kt │ │ │ └── view │ │ │ ├── AlbumView.kt │ │ │ ├── ArtistView.kt │ │ │ ├── MainView.kt │ │ │ └── PresentationView.kt │ └── res │ │ ├── drawable │ │ └── gradient_shadow.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── values-sw720dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── config.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ ├── java │ └── com │ │ └── functionalkotlin │ │ └── bandhookkotlin │ │ ├── data │ │ ├── CloudAlbumDataSetTest.kt │ │ ├── CloudArtistDataSetTest.kt │ │ ├── Constants.kt │ │ ├── mapper │ │ │ ├── album │ │ │ │ └── AlbumMapperTest.kt │ │ │ ├── artist │ │ │ │ └── ArtistMapperTest.kt │ │ │ ├── image │ │ │ │ └── ImageMapperTest.kt │ │ │ └── track │ │ │ │ └── TrackMapperTest.kt │ │ └── mock │ │ │ └── FakeCall.kt │ │ ├── domain │ │ └── interactor │ │ │ ├── Constants.kt │ │ │ ├── GetAlbumDetailInteractorTest.kt │ │ │ └── GetTopAlbumsInteractorTest.kt │ │ ├── repository │ │ ├── AlbumRepositoryImplTest.kt │ │ └── Constants.kt │ │ ├── ui │ │ ├── entity │ │ │ ├── ImageTitleTest.kt │ │ │ └── mapper │ │ │ │ ├── AlbumDetailDataMapperTest.kt │ │ │ │ ├── ArtistDetailDataMapperTest.kt │ │ │ │ ├── ImageTitleDataMapperTest.kt │ │ │ │ └── TrackDataMapperTest.kt │ │ └── presenter │ │ │ ├── ArtistPresenterTest.kt │ │ │ └── Constants.kt │ │ └── util │ │ └── Functional.kt │ └── resources │ └── mockito-extensions │ └── org.mockito.plugins.MockMaker ├── art ├── bandhook.gif └── logo.png ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts └── src │ └── main │ └── java │ └── ProjectConfiguration.kt ├── detekt.yml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated files 2 | bin/ 3 | gen/ 4 | 5 | # Gradle files 6 | .gradle/ 7 | build/ 8 | 9 | # Local configuration file (sdk path, etc) 10 | local.properties 11 | 12 | # Intellij project files 13 | *.iws 14 | .idea/tasks.xml 15 | .idea 16 | *.iml 17 | 18 | # OS 19 | .DS_Store 20 | 21 | # Api key 22 | app/src/main/res/values/api_key.xml -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright © FunctionalKotlin.com 2017. All rights reserved. 2 | 3 | It is strictly prohibited to copy, play, transmit, publish or modify any material included in the website FunctionalKotlin.com or in any other related platform except with express written permission of the authors. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
4 | 5 | # Final App: Bandhook 6 | 7 | ## How to use this project 8 | 9 | You can use Android Studio or Intellij to work with this repository. 10 | 11 | First thing you will need to compile this project is to get an [API Key from Last.fm](http://www.lastfm.es/api). It will be used to connect to the service that will provide artists info. Then create a resource file `app/src/main/res/values/api_key.xml` (this path is ignored by git) with the following content: 12 | 13 | ```xml 14 |
28 |
29 |