├── sample-search ├── .gitignore ├── libs │ └── spotify-auth-1.0.0-beta12.aar ├── src │ └── main │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ ├── values-w820dp │ │ │ └── dimens.xml │ │ └── layout │ │ │ ├── activity_login.xml │ │ │ ├── activity_main.xml │ │ │ └── list_item.xml │ │ ├── java │ │ └── kaaes │ │ │ └── spotify │ │ │ └── webapi │ │ │ └── samplesearch │ │ │ ├── Player.java │ │ │ ├── Search.java │ │ │ ├── PlayerService.java │ │ │ ├── ResultListScrollListener.java │ │ │ ├── CredentialsHandler.java │ │ │ ├── SearchPager.java │ │ │ ├── PreviewPlayer.java │ │ │ ├── SearchResultsAdapter.java │ │ │ ├── LoginActivity.java │ │ │ ├── MainActivity.java │ │ │ └── SearchPresenter.java │ │ └── AndroidManifest.xml └── build.gradle ├── settings.gradle ├── spotify-api ├── src │ ├── test │ │ ├── resources │ │ │ ├── fixtures │ │ │ │ ├── follow_is_following_artists.json │ │ │ │ ├── follow_is_following_users.json │ │ │ │ ├── playlist-followers-contains.json │ │ │ │ ├── albums-none-found.json │ │ │ │ ├── error_id-not-found.json │ │ │ │ ├── error_bad-field.json │ │ │ │ ├── snapshot-response.json │ │ │ │ ├── auth-invalid-client.json │ │ │ │ ├── error-cannot-add-tracks.json │ │ │ │ ├── error-unauthorized.json │ │ │ │ ├── application-authentication-token.json │ │ │ │ ├── user.json │ │ │ │ ├── auth-refreshtoken.json │ │ │ │ ├── category.json │ │ │ │ ├── auth-tokens.json │ │ │ │ ├── current-user.json │ │ │ │ ├── created-playlist.json │ │ │ │ ├── artist.json │ │ │ │ ├── get-categories.json │ │ │ │ ├── search-artist.json │ │ │ │ ├── search-album.json │ │ │ │ ├── artists.json │ │ │ │ ├── search-playlist.json │ │ │ │ ├── category-playlist.json │ │ │ │ ├── track.json │ │ │ │ ├── artist-album.json │ │ │ │ ├── featured-playlists.json │ │ │ │ ├── new-releases.json │ │ │ │ ├── tracks.json │ │ │ │ └── user-playlists.json │ │ │ └── robolectric.properties │ │ └── java │ │ │ └── kaaes │ │ │ └── spotify │ │ │ └── webapi │ │ │ └── android │ │ │ ├── ModelAssert.java │ │ │ ├── TestUtils.java │ │ │ ├── ModelPopulator.java │ │ │ └── ParcelableModelsTest.java │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── kaaes │ │ │ └── spotify │ │ │ └── webapi │ │ │ └── android │ │ │ ├── annotations │ │ │ └── DELETEWITHBODY.java │ │ │ ├── models │ │ │ ├── Result.java │ │ │ ├── SnapshotId.java │ │ │ ├── TrackToRemove.java │ │ │ ├── Albums.java │ │ │ ├── Tracks.java │ │ │ ├── Artists.java │ │ │ ├── Cursor.java │ │ │ ├── TracksPager.java │ │ │ ├── NewReleases.java │ │ │ ├── AlbumsPager.java │ │ │ ├── ArtistsPager.java │ │ │ ├── SeedsGenres.java │ │ │ ├── ErrorResponse.java │ │ │ ├── PlaylistsPager.java │ │ │ ├── CategoriesPager.java │ │ │ ├── ArtistsCursorPager.java │ │ │ ├── TracksToRemove.java │ │ │ ├── Followers.java │ │ │ ├── AudioFeaturesTracks.java │ │ │ ├── Copyright.java │ │ │ ├── PlaylistTracksInformation.java │ │ │ ├── FeaturedPlaylists.java │ │ │ ├── PlaylistFollowPrivacy.java │ │ │ ├── ErrorDetails.java │ │ │ ├── Recommendations.java │ │ │ ├── Category.java │ │ │ ├── PlaylistSimple.java │ │ │ ├── SavedAlbum.java │ │ │ ├── SavedTrack.java │ │ │ ├── TracksToRemoveWithPosition.java │ │ │ ├── Image.java │ │ │ ├── TrackToRemoveWithPosition.java │ │ │ ├── Track.java │ │ │ ├── UserPrivate.java │ │ │ ├── Playlist.java │ │ │ ├── Seed.java │ │ │ ├── LinkedTrack.java │ │ │ ├── Artist.java │ │ │ ├── ArtistSimple.java │ │ │ ├── PlaylistTrack.java │ │ │ ├── Pager.java │ │ │ ├── CursorPager.java │ │ │ ├── UserPublic.java │ │ │ ├── AlbumSimple.java │ │ │ ├── Album.java │ │ │ ├── PlaylistBase.java │ │ │ ├── TrackSimple.java │ │ │ └── AudioFeaturesTrack.java │ │ │ ├── SpotifyCallback.java │ │ │ ├── SpotifyError.java │ │ │ └── SpotifyApi.java │ └── androidTest │ │ └── AndroidManifest.xml └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── .travis.yml ├── .utility └── publish-javadoc.sh ├── LICENSE ├── release.gradle ├── gradlew.bat ├── README.md └── gradlew /sample-search/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':spotify-api', ':sample-search' 2 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/follow_is_following_artists.json: -------------------------------------------------------------------------------- 1 | [ true ] 2 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/follow_is_following_users.json: -------------------------------------------------------------------------------- 1 | [true, false] 2 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/playlist-followers-contains.json: -------------------------------------------------------------------------------- 1 | [true,false,true] -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/albums-none-found.json: -------------------------------------------------------------------------------- 1 | { 2 | "albums" : [ null ] 3 | } -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/error_id-not-found.json: -------------------------------------------------------------------------------- 1 | {"error":{"type":"not_found","description":"non existing id"}} -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .*.swp 3 | build/* 4 | build 5 | 6 | .gradle 7 | .idea 8 | *.ipr 9 | *.iws 10 | *.iml 11 | local.properties -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/error_bad-field.json: -------------------------------------------------------------------------------- 1 | {"error":{"type":"bad_field","description":"wrong id: 2KrxsD86ARO5beq7Q0Drfqx"}} -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/snapshot-response.json: -------------------------------------------------------------------------------- 1 | { "snapshot_id" : "JbtmHBDBAYu3/bt8BOXKjzKx3i0b6LCa/wVjyl6qQ2Yf6nFXkbmzuEa+ZI/U1yF+" } -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/auth-invalid-client.json: -------------------------------------------------------------------------------- 1 | { 2 | "error": "invalid_client", 3 | "error_description": "Invalid client" 4 | } -------------------------------------------------------------------------------- /spotify-api/src/test/resources/robolectric.properties: -------------------------------------------------------------------------------- 1 | sdk=21 2 | constants= com.spotify.webapi.android.BuildConfig 3 | manifest=src/main/AndroidManifest.xml -------------------------------------------------------------------------------- /sample-search/libs/spotify-auth-1.0.0-beta12.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/libs/spotify-auth-1.0.0-beta12.aar -------------------------------------------------------------------------------- /sample-search/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample-search/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/error-cannot-add-tracks.json: -------------------------------------------------------------------------------- 1 | {"error":{"type":"forbidden","description":"You cannot add tracks to a playlist you don\u0027t own."}} -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/error-unauthorized.json: -------------------------------------------------------------------------------- 1 | { 2 | "error": { 3 | "status": 401, 4 | "message": "The access token expired" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /sample-search/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample-search/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /sample-search/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaaes/spotify-web-api-android/HEAD/sample-search/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /spotify-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/application-authentication-token.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "BQAh_5C4JzOMLuF0W-UVTtaOhZaX0bjgJ5B8giFun_i7AJRKTpZ-VB1mFd3hWLLWRsZNihc_fG1xUlnW9sLBjQ", 3 | "token_type": "Bearer", 4 | "expires_in": 3600 5 | } -------------------------------------------------------------------------------- /sample-search/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /sample-search/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Jun 15 22:15:36 CEST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip 7 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/user.json: -------------------------------------------------------------------------------- 1 | { 2 | "external_urls": { 3 | "spotify": "https://open.spotify.com/user/wizzler" 4 | }, 5 | "href": "https://api.spotify.com/v1/users/wizzler", 6 | "id": "wizzler", 7 | "type": "user", 8 | "uri": "spotify:user:wizzler" 9 | } -------------------------------------------------------------------------------- /sample-search/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Search Example 3 | Login to Spotify 4 | Search 5 | Cover art 6 | Search tracks 7 | 8 | -------------------------------------------------------------------------------- /spotify-api/src/androidTest/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/auth-refreshtoken.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "BQCPbH9PaTEFMqFRq5CNxKq5uDKKY15nWe5yWbbu64qCloJb6bpWJlOiLdoJSBBwnCKLhKkG_Rlzo9_9ZnIFfVv4FV0HJ3Yu0eUlZg9-rn232pGs4mhSqp-NNuhyEKfi8h1aChi_W1_ckVhPd97V7Qtio2dgm0obsylpCslX2awWfD_IW0nQh7vuGUDeISGDNiK8Yrt5GVHtKXggS7I_syS3RowkbqeY", 3 | "token_type": "Bearer", 4 | "expires_in": 3600 5 | } -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/category.json: -------------------------------------------------------------------------------- 1 | { 2 | "href" : "https://api.spotify.com/v1/browse/categories/mood", 3 | "icons" : [ { 4 | "height" : 274, 5 | "url" : "https://datsnxq1rwndn.cloudfront.net/media/original/mood-274x274_976986a31ac8c49794cbdc7246fd5ad7_274x274.jpg", 6 | "width" : 274 7 | } ], 8 | "id" : "mood", 9 | "name" : "Humör" 10 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.daemon=true 2 | 3 | BASE_NAME=spotify-web-api-android 4 | VERSION_NAME=0.4.1 5 | GROUP=com.spotify.android 6 | 7 | # Deps for gradle 8 | ANDROID_GRADLE_PLUGIN_VERSION=1.3.0 9 | SDKMANAGER_GRADLE_PLUGIN_VERSION=0.12.+ 10 | 11 | # Deps for libraries 12 | FEST_ASSERT_CORE_VERSION=2.0M10 13 | GUAVA_VERSION=18.0 14 | JUNIT_VERSION=4.12 15 | MOCKITO_CORE_VERSION=1.+ 16 | ROBOLECTRIC_VERSION=3.0 -------------------------------------------------------------------------------- /sample-search/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /sample-search/src/main/java/kaaes/spotify/webapi/samplesearch/Player.java: -------------------------------------------------------------------------------- 1 | package kaaes.spotify.webapi.samplesearch; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | public interface Player { 6 | 7 | void play(String url); 8 | 9 | void pause(); 10 | 11 | void resume(); 12 | 13 | boolean isPlaying(); 14 | 15 | @Nullable 16 | String getCurrentTrack(); 17 | 18 | void release(); 19 | } 20 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/auth-tokens.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "BQBY2M94xNVE_7p7x1MhNd2I1UNs62cv-CVDXkDwh5YqSiKJceKRXwJfUrLmJFKO7GfiCZKTh8oEEj3b84bZx1Qy52qwGYCVhX6yHPJY4VDday-hC1YMPOWyIt9Bp05UuJb673btr6T1YOd0DliheWDyqQ", 3 | "token_type": "Bearer", 4 | "expires_in": 3600, 5 | "refresh_token": "AQAZ54v-sV7LO_R64q76KtDMKeQcPkBIPAuKFqYr1kSAeaU8_S8ZxbnqcNizeQiSJr5DhMsJvCdgS7_KUrHd7rw1z7h_FJkL5OVOnthZrNFdO5NL7gUvNJRF6hdbIkAnEHM" 6 | } -------------------------------------------------------------------------------- /sample-search/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - tools 5 | - build-tools-23.0.2 6 | - android-23 7 | - extra-android-m2repository 8 | 9 | env: 10 | global: 11 | secure: QpUtfmGzlk2j90qBzSFo35ALFwqjS4phh94JJonIb0KyF3JfpN5z8i915/M6mFhCIiVvCJR7zJYjS5C60OL0RL+HkLkXXZ2WP5VPB6wUzzvIVax5Q+7z+VvhDkPHQwpYG8KkXq6eHqgJGSD/R9cRbc/KhQEhrxxrqQD5fw/Gpkc= 12 | 13 | script: "./gradlew clean assemble check generateReleaseJavadoc --info --stacktrace" 14 | 15 | after_success: 16 | - .utility/publish-javadoc.sh 17 | 18 | sudo: false 19 | -------------------------------------------------------------------------------- /spotify-api/src/test/resources/fixtures/current-user.json: -------------------------------------------------------------------------------- 1 | { 2 | "display_name": null, 3 | "email": "thelinmichael@gmail.com", 4 | "external_urls": { 5 | "spotify": "https://open.spotify.com/user/thelinmichael" 6 | }, 7 | "href": "https://api.spotify.com/v1/users/thelinmichael", 8 | "id": "thelinmichael", 9 | "images": [ 10 | { 11 | "height": null, 12 | "url": "http://media.giphy.com/media/Aab07O5PYOmQ/giphy.gif", 13 | "width": null 14 | } 15 | ], 16 | "product": "premium", 17 | "type": "user", 18 | "uri": "spotify:user:thelinmichael" 19 | } -------------------------------------------------------------------------------- /spotify-api/src/main/java/kaaes/spotify/webapi/android/annotations/DELETEWITHBODY.java: -------------------------------------------------------------------------------- 1 | package kaaes.spotify.webapi.android.annotations; 2 | 3 | /* @see https://github.com/square/retrofit/issues/458 */ 4 | 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | import retrofit.http.RestMethod; 10 | 11 | import static java.lang.annotation.ElementType.METHOD; 12 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 13 | 14 | @Documented 15 | @Target(METHOD) 16 | @Retention(RUNTIME) 17 | @RestMethod(value = "DELETE", hasBody = true) 18 | public @interface DELETEWITHBODY { 19 | String value(); 20 | } 21 | -------------------------------------------------------------------------------- /sample-search/src/main/java/kaaes/spotify/webapi/samplesearch/Search.java: -------------------------------------------------------------------------------- 1 | package kaaes.spotify.webapi.samplesearch; 2 | 3 | import java.util.List; 4 | 5 | import kaaes.spotify.webapi.android.models.Track; 6 | 7 | public class Search { 8 | 9 | public interface View { 10 | void reset(); 11 | 12 | void addData(List items); 13 | } 14 | 15 | public interface ActionListener { 16 | 17 | void init(String token); 18 | 19 | String getCurrentQuery(); 20 | 21 | void search(String searchQuery); 22 | 23 | void loadMoreResults(); 24 | 25 | void selectTrack(Track item); 26 | 27 | void resume(); 28 | 29 | void pause(); 30 | 31 | void destroy(); 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /spotify-api/src/main/java/kaaes/spotify/webapi/android/models/Result.java: -------------------------------------------------------------------------------- 1 | package kaaes.spotify.webapi.android.models; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | 6 | public class Result implements Parcelable { 7 | 8 | @Override 9 | public int describeContents() { 10 | return 0; 11 | } 12 | 13 | @Override 14 | public void writeToParcel(Parcel dest, int flags) { 15 | } 16 | 17 | public Result() { 18 | } 19 | 20 | protected Result(Parcel in) { 21 | } 22 | 23 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 24 | public Result createFromParcel(Parcel source) { 25 | return new Result(source); 26 | } 27 | 28 | public Result[] newArray(int size) { 29 | return new Result[size]; 30 | } 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /.utility/publish-javadoc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$TRAVIS_REPO_SLUG" == "kaaes/spotify-web-api-android" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_BRANCH" == "master" ]; then 4 | 5 | echo -e "Merged new code into master branch. Publishing Javadoc to GH Pages...\n" 6 | 7 | cp -R spotify-api/build/docs $HOME/javadoc-latest 8 | 9 | cd $HOME 10 | git config --global user.email "travis@travis-ci.org" 11 | git config --global user.name "travis-ci" 12 | git clone --quiet --branch=gh-pages https://${GH_TOKEN}@github.com/kaaes/spotify-web-api-android gh-pages > /dev/null 13 | 14 | cd gh-pages 15 | git rm -rf ./javadoc 16 | cp -Rf $HOME/javadoc-latest ./javadoc 17 | git add -f . 18 | git commit -m "Lastest javadoc on successful travis build $TRAVIS_BUILD_NUMBER auto-pushed to gh-pages" 19 | git push -fq origin gh-pages > /dev/null 20 | 21 | echo -e "Published Javadoc to gh-pages.\n" 22 | 23 | fi -------------------------------------------------------------------------------- /sample-search/src/main/res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 |