{"id":19162352,"url":"https://github.com/agilie/dribbble-android-sdk","last_synced_at":"2025-06-25T06:32:57.592Z","repository":{"id":35628782,"uuid":"39902733","full_name":"agilie/dribbble-android-sdk","owner":"agilie","description":"Dribbble Android SDK is an unofficial wrapper for Dribbble API v1. (Designer, Shot, Comment, User Story, Like, Follow)","archived":false,"fork":false,"pushed_at":"2017-07-11T09:23:40.000Z","size":1035,"stargazers_count":31,"open_issues_count":2,"forks_count":5,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-05-07T10:50:52.278Z","etag":null,"topics":["dribbble","dribbble-android-sdk","dribbble-api","java","oauth2","oauth2-client","retrofit2","rxjava2","sdk"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/agilie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-07-29T16:00:23.000Z","updated_at":"2020-02-28T09:52:21.000Z","dependencies_parsed_at":"2022-08-29T18:41:41.022Z","dependency_job_id":null,"html_url":"https://github.com/agilie/dribbble-android-sdk","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/agilie/dribbble-android-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agilie%2Fdribbble-android-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agilie%2Fdribbble-android-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agilie%2Fdribbble-android-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agilie%2Fdribbble-android-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/agilie","download_url":"https://codeload.github.com/agilie/dribbble-android-sdk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agilie%2Fdribbble-android-sdk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261819221,"owners_count":23214457,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dribbble","dribbble-android-sdk","dribbble-api","java","oauth2","oauth2-client","retrofit2","rxjava2","sdk"],"created_at":"2024-11-09T09:10:24.820Z","updated_at":"2025-06-25T06:32:57.567Z","avatar_url":"https://github.com/agilie.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dribbble API SDK\n\n[ ![Download](https://api.bintray.com/packages/agilie/maven/Dribbble/images/download.svg) ](https://bintray.com/agilie/maven/Dribbble/_latestVersion)\n\nDribbble Android SDK is an unofficial wrapper for [Dribbble API v1](http://developer.dribbble.com/v1/).\n\n## Link to iOS repo\n\nCheck out our [Dribbble iOS SDK](https://github.com/agilie/dribbble-ios-sdk)\n\n## Download\n\n- \u003cb\u003eAndroid Studio\u003c/b\u003e\n\n    To use Dribbble API SDK as source code, clone the project and import [sdk-library/](sdk-sample) module into your project.\n\n- \u003cb\u003eMaven\u003c/b\u003e\n\nAdd rependency in your `.pom` file:\n````xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.agilie\u003c/groupId\u003e\n  \u003cartifactId\u003edribbble-sdk-library\u003c/artifactId\u003e\n  \u003cversion\u003e1.1\u003c/version\u003e\n  \u003ctype\u003epom\u003c/type\u003e\n\u003c/dependency\u003e\n````\n\n- \u003cb\u003eGradle\u003c/b\u003e\n\nAdd dependency in your `build.gradle` file:\n````gradle\ncompile 'com.agilie:dribbble-sdk-library:1.1'\n````\n\n\n## Requirements\n\nAndroid 4.4+ (API level 19+)\n\n\n## Quick Start\n\nThe reason why min SDK level is so high is because Dribbble stopped supporting protocols lower than [TLS1.2](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.2). As per [provided table](https://en.wikipedia.org/wiki/Transport_Layer_Security#Web_browsers), it is supported since API level 16 and enabled automatically since API 20+. So, [the handshake](https://www.ssllabs.com/ssltest/analyze.html?d=dribbble.com) with [Dribbble](https://dribbble.com) fails for Android versions lower than 4.4.2 (this site does not even work in devices' browsers). \n\n[Here](sdk-sample/src/main/java/com/agilie/dribbblesdk/sample/activity/DribbbleSdkSampleApplication.java) you can find the workaround how to enable TLS 1.2 support for Android OS lower than 5.0. __don't forget__ to add this in your project:\n\n```java\n// http://stackoverflow.com/questions/29249630/android-enable-tlsv1-2-in-okhttp\n    private void checkTls() {\n        if (android.os.Build.VERSION.SDK_INT \u003c Build.VERSION_CODES.LOLLIPOP) {\n            try {\n                ProviderInstaller.installIfNeededAsync(this, new ProviderInstaller.ProviderInstallListener() {\n                    @Override\n                    public void onProviderInstalled() {\n                        // successfully enabled\n                    }\n\n                    @Override\n                    public void onProviderInstallFailed(int i, Intent intent) {\n                        // no Google Play Services provided?\n                    }\n                });\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n    }\n```\n\nPlease follow sdk usage [example](sdk-sample/). It demonstrates how to login, logout and call API methods provided by SDK.\n__Don't forget__ to fill the credentials to use Dribbble API:\n```java\nprivate static final String DRIBBBLE_CLIENT_ID = \"\u003cYOUR CLIENT ID HERE\u003e\";\nprivate static final String DRIBBBLE_CLIENT_SECRET = \"\u003cYOUR CLIENT SECRET HERE\u003e\";\nprivate static final String DRIBBBLE_CLIENT_ACCESS_TOKEN = \"\u003cYOUR CLIENT ACCESS TOKEN HERE\u003e\";\nprivate static final String DRIBBBLE_CLIENT_REDIRECT_URL = \"\u003cYOUR REDIRECT URL HERE\u003e\";\n```\nAuthorization isn't required, you can use non-authorized access for some methods. In this case, API client uses default access token provided by Dribbble. You can get the app access token, client id and secret keys on your Dribbble app page, check out the next links: \n\n- Register your app on https://dribbble.com/account/applications/new\n\n- Documentation: http://developer.dribbble.com/v1/\n\n## API usage\n\nUse DribbbleAuthHelper.java class for authorization:\n- Log into your Dribbble's account using startOauthDialog method:\n```java\nDribbbleAuthHelper.startOauthDialog(ExampleActivity.this, credentials, new DribbbleAuthHelper.AuthListener() {\n\n            @Override\n            public void onSuccess(final Credential credential) {\n                String authToken = credential.getAccessToken();\n                \n                // TODO: Handle success login event\n            }\n\n            @Override\n            public void onError(Exception ex) {\n                ex.printStackTrace();\n                \n                // TODO: Handle error here\n            }\n        });\n```\n\n- Logout is also easy:\n```java\nAuthCredentials credentials = AuthCredentials.newBuilder(\n                DRIBBBLE_CLIENT_ID,\n                DRIBBBLE_CLIENT_SECRET,\n                DRIBBBLE_CLIENT_ACCESS_TOKEN,\n                DRIBBBLE_CLIENT_REDIRECT_URL)\n                .build();\n\nDribbbleAuthHelper.logout(YourActivity.this, credentials);\n```\n\nAll Dribbble's API methods are mapped through Retrofit interfaces:\n- DribbbleBucketsService.java\n```java\n@GET(\"buckets/{id}\")\nCall\u003cBucket\u003e getBucket(@Path(\"id\") long bucketId);\n\n@POST(\"buckets\")\nCall\u003cBucket\u003e createBucket(@Body Bucket bucket);\n\n@PUT(\"buckets/{id}\")\nCall\u003cBucket\u003e updateBucket(@Path(\"id\") long bucketId, @Body Bucket bucket);\n\n@DELETE(\"buckets/{id}\")\nCall\u003cVoid\u003e deleteBucket(@Path(\"id\") long bucketId);\n\n@GET(\"buckets/{id}/shots\")\nCall\u003cList\u003cShot\u003e\u003e getShotsForBucket(@Path(\"id\") long bucketId);\n\n@PUT(\"buckets/{id}/shots\")\nCall\u003cVoid\u003e addShotToBucket(@Path(\"id\") long bucketId, @Query(\"shot_id\") long shotId);\n\n@DELETE(\"buckets/{id}/shots\")\nCall\u003cVoid\u003e removeShotFromBucket(@Path(\"id\") long bucketId, @Query(\"shot_id\") long shotId);\n```\n\n- DribbbleProjectsService.java\n```java\n@GET(\"projects/{id}\")\nCall\u003cProject\u003e getProject(@Path(\"id\") long projectId);\n\n@GET(\"projects/{id}/shots\")\nCall\u003cList\u003cShot\u003e\u003e getShotsForProject(@Path(\"id\") long projectId);\n```\n\n- DribbbleShotsService.java\n```java\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"page\") int page);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"page\") int page, @Query(\"per_page\") int perPage, @Query(\"list\") String list, @Query(\"sort\") String sort);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"page\") int page, @Query(\"per_page\") int perPage, @Query(\"list\") String list, @Query(\"sort\") String sort, @Query(\"date\") String date, @Query(\"timeframe\") String timeframe);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"page\") int page, @Query(\"list\") String list, @Query(\"sort\") String sort, @Query(\"date\") String date, @Query(\"timeframe\") String timeframe);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@Query(\"list\") String list);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchShots(@QueryMap Map\u003cString, Object\u003e parameters);\n\n@GET(\"shots\")\nCall\u003cList\u003cShot\u003e\u003e fetchSortedShots(@Query(\"sort\") String sort);\n\n@GET(\"shots/{id}\")\nCall\u003cShot\u003e getShot(@Path(\"id\") long shotId);\n\n@Multipart\n@POST(\"shots\")\nCall\u003cVoid\u003e createShot(@Part(\"title\") String title, @Part MultipartBody.Part image, @Part(\"description\") String description,\n                          @Part(\"tags\") String[] tags, @Part(\"team_id\") int teamId, @Part(\"rebound_source_id\") int reboundSourceId);\n@Multipart\n@POST(\"shots\")\nCall\u003cVoid\u003e createShot(@Part(\"title\") String title, @Part MultipartBody.Part image, @Part(\"description\") String description,\n                          @Part(\"tags\") String[] tags);\n@Multipart\n@POST(\"shots\")\nCall\u003cVoid\u003e createShot(@Part(\"title\") String title, @Part MultipartBody.Part image);\n\n@Multipart\n@POST(\"shots\")Call\u003cVoid\u003e createShot(@PartMap Map\u003cString, Object\u003e partMap);\n\n@Multipart\n@PUT(\"shots/{id}\")\nCall\u003cShot\u003e updateShot(@Path(\"id\") long shotId, @Part(\"title\") String title, @Part(\"description\") String description,\n                          @Part(\"team_id\") int teamId, @Part(\"tags\") String[] tags);\n                          \n@DELETE(\"shots/{id}\")\nCall\u003cVoid\u003e deleteShot(@Path(\"id\") long shotId);\n\n@GET(\"shots/{id}/attachments\")\nCall\u003cList\u003cAttachment\u003e\u003e getShotAttachments(@Path(\"id\") long shotId);\n\n@POST(\"shots/{shot}/attachments\")\nCall\u003cVoid\u003e createShotAttachment(@Path(\"shot\") long shotId, @Part(\"file\") RequestBody file);\n\n@GET(\"shots/{shot}/attachments/{id}\")\nCall\u003cAttachment\u003e getShotAttachment(@Path(\"shot\") long shotId, @Path(\"id\") long attachmentId);\n\n@DELETE(\"shots/{shot}/attachments/{id}\")\nCall\u003cVoid\u003e deleteShotAttachment(@Path(\"shot\") long shotId, @Path(\"id\") long attachmentId);\n\n@GET(\"shots/{id}/buckets\")\nCall\u003cList\u003cBucket\u003e\u003e getShotBuckets(@Path(\"id\") long shotId);\n\n@GET(\"shots/{shot}/comments\")\nCall\u003cList\u003cComment\u003e\u003e getShotComments(@Path(\"shot\") long shotId);\n\n@GET(\"shots/{shot}/comments/{id}/likes\")\nCall\u003cList\u003cLike\u003e\u003e getCommentLikes(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@POST(\"shots/{shot}/comments\")\nCall\u003cComment\u003e createComment(@Path(\"shot\") long shotId, @Body Comment body);\n\n@GET(\"shots/{shot}/comments/{id}\")\nCall\u003cComment\u003e getShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@PUT(\"shots/{shot}/comments/{id}\")\nCall\u003cComment\u003e updateShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId, @Body Comment comment);\n\n@DELETE(\"shots/{shot}/comments/{id}\")\nCall\u003cVoid\u003e deleteShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@GET(\"shots/{shot}/comments/{id}/like\")\nCall\u003cLike\u003e checkIsLikedShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@POST(\"shots/{shot}/comments/{id}/like\")\nCall\u003cLike\u003e likeShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@DELETE(\"shots/{shot}/comments/{id}/like\")\nCall\u003cVoid\u003e unlikeShotComment(@Path(\"shot\") long shotId, @Path(\"id\") long commentId);\n\n@GET(\"shots/{id}/likes\")\nCall\u003cList\u003cLike\u003e\u003e getShotLikes(@Path(\"id\") long shotId);\n\n@GET(\"shots/{id}/like\")\nCall\u003cLike\u003e checkShotIsLiked(@Path(\"id\") long shotId);\n\n@POST(\"shots/{id}/like\")\nCall\u003cLike\u003e likeShot(@Path(\"id\") long shotId);\n\n@DELETE(\"shots/{id}/like\")\nCall\u003cVoid\u003e unlikeShot(@Path(\"id\") long shotId);\n\n@GET(\"shots/{id}/projects\")\nCall\u003cList\u003cProject\u003e\u003e getShotProjectsList(@Path(\"id\") long shotId);\n\n@GET(\"shots/{id}/rebounds\")\nCall\u003cList\u003cRebound\u003e\u003e getShotReboundsList(@Path(\"id\") long shotId);\n```\n\n- DribbbleTeamsService.java\n```java\n@GET(\"teams/{team}/members\")\nCall\u003cList\u003cUser\u003e\u003e getTeamMembersList(@Path(\"team\") long teamId);\n\n@GET(\"teams/{team}/shots\")\nCall\u003cList\u003cShot\u003e\u003e getTeamShotsList(@Path(\"team\") long teamId);\n```\n\n- DribbbleUserService.java\n```java\n@GET(\"users/{user}\")\nCall\u003cUser\u003e getSingleUser(@Path(\"user\") long userId);\n\n@GET(\"user\")\nCall\u003cUser\u003e fetchAuthenticatedUser();\n\n@GET(\"users/{user}/buckets\")\nCall\u003cList\u003cBucket\u003e\u003e getUsersBuckets(@Path(\"user\") long userId);\n\n@GET(\"user/buckets\")\nCall\u003cList\u003cBucket\u003e\u003e getAuthenticatedUsersBuckets();\n\n@GET(\"users/{user}/followers\")\nCall\u003cList\u003cFollower\u003e\u003e getUsersFollowers(@Path(\"user\") long userId, @Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"user/followers\")\nCall\u003cList\u003cFollower\u003e\u003e getAuthenticatedUsersFollowers(@Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"users/{user}/following\")\nCall\u003cList\u003cFollowee\u003e\u003e getFollowingByUser(@Path(\"user\") long userId);\n\n@GET(\"users/{user}/following\")\nCall\u003cList\u003cFollowee\u003e\u003e getFollowingByUser(@Path(\"user\") long userId, @Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"user/following\")\nCall\u003cList\u003cFollowee\u003e\u003e getFollowingByCurrentUser();\n\n@GET(\"user/following/shots\")\nCall\u003cList\u003cShot\u003e\u003e shotsForUserFollowedByUser();\n\n@GET(\"user/following/{user}\")\nCall\u003cVoid\u003e checkUserIsFollowed(@Path(\"user\") long userId);\n\n@GET(\"users/{user}/following/{target_user}\")\nCall\u003cVoid\u003e checkUserIsFollowingAnother(@Path(\"user\") long userId, @Path(\"target_user\") long targetUserId);\n\n@PUT(\"users/{id}/follow\")\nCall\u003cVoid\u003e followUser(@Path(\"id\") long userId);\n\n@DELETE(\"users/{id}/follow\")\nCall\u003cVoid\u003e unfollowUser(@Path(\"id\") long userId);\n\n@GET(\"users/{user}/likes\")\nCall\u003cList\u003cLike\u003e\u003e getUsersLikes(@Path(\"user\") long userId);\n\n@GET(\"users/{user}/likes\")\nCall\u003cList\u003cLike\u003e\u003e getUsersLikes(@Path(\"user\") long userId, @Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"user/likes\")\nCall\u003cList\u003cLike\u003e\u003e getAuthenticatedUsersLikes();\n\n@GET(\"users/{user}/projects\")\nCall\u003cList\u003cProject\u003e\u003e getUsersProjects(@Path(\"user\") long userId);\n\n@GET(\"user/projects\")\nCall\u003cList\u003cProject\u003e\u003e getAuthenticatedUsersProjects();\n\n@GET(\"users/{user}/shots\")\nCall\u003cList\u003cShot\u003e\u003e getUsersShots(@Path(\"user\") long userId);\n\n@GET(\"users/{user}/shots\")\nCall\u003cList\u003cShot\u003e\u003e getUsersShots(@Path(\"user\") long userId, @Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"user/shots\")\nCall\u003cList\u003cShot\u003e\u003e getAuthenticatedUsersShots(@Query(\"page\") int page, @Query(\"per_page\") int perPage);\n\n@GET(\"users/{user}/teams\")\nCall\u003cList\u003cTeam\u003e\u003e getUsersTeams(@Path(\"user\") long userId);\n\n@GET(\"user/teams\")\nCall\u003cList\u003cTeam\u003e\u003e getAuthenticatedUsersTeams(@Query(\"page\") int page);\n```\n\n## Dependencies\n\n- [Retrofit](https://github.com/square/retrofit)\n- [Android OAuth Client](https://github.com/wuman/android-oauth-client)\n\n## Troubleshooting\n\nProblems? Check the [Issues](https://github.com/agilie/dribbble-android-sdk/issues) block\nto find the solution or create an new issue that we will fix asap. \n\n## Author\n\nThis library is open-sourced by  [Agilie Team](https://www.agilie.com?utm_source=github\u0026utm_medium=referral\u0026utm_campaign=Git_Android_Java\u0026utm_term=DribbbleSDK) \u003cinfo@agilie.com\u003e\n\n## Contributors\n\n- [Alexander Kotsuba](https://github.com/akotsuba)\n\n## Contact us\nIf you have any questions, suggestions or just need a help with web or mobile development, please email us at\u003cbr/\u003e \u003candroid@agilie.com\u003e\u003cbr/\u003e\nYou can ask us anything from basic to complex questions. \u003cbr/\u003e\nWe will continue publishing new open-source projects. Stay with us, more updates will follow!\u003cbr/\u003e\n\n## License\n\nThe [MIT](LICENSE.md) License (MIT) Copyright © 2017 [Agilie Team](https://www.agilie.com?utm_source=github\u0026utm_medium=referral\u0026utm_campaign=Git_Android_Java\u0026utm_term=DribbbleSDK)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagilie%2Fdribbble-android-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagilie%2Fdribbble-android-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagilie%2Fdribbble-android-sdk/lists"}