{"id":30294430,"url":"https://github.com/linkedin/shaky-android","last_synced_at":"2026-04-02T13:25:10.392Z","repository":{"id":10191598,"uuid":"64419051","full_name":"linkedin/shaky-android","owner":"linkedin","description":"Shake to send feedback for Android.","archived":false,"fork":false,"pushed_at":"2025-07-31T08:04:47.000Z","size":519,"stargazers_count":160,"open_issues_count":14,"forks_count":54,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-07-31T09:51:58.341Z","etag":null,"topics":["android","android-library","feedback","linkedin"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linkedin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-07-28T18:32:31.000Z","updated_at":"2025-07-31T08:02:47.000Z","dependencies_parsed_at":"2025-03-11T07:26:37.168Z","dependency_job_id":"216376fb-7894-4f62-a382-8bfb421fa324","html_url":"https://github.com/linkedin/shaky-android","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/linkedin/shaky-android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linkedin%2Fshaky-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linkedin%2Fshaky-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linkedin%2Fshaky-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linkedin%2Fshaky-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linkedin","download_url":"https://codeload.github.com/linkedin/shaky-android/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linkedin%2Fshaky-android/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270796216,"owners_count":24647319,"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","status":"online","status_checked_at":"2025-08-16T02:00:11.002Z","response_time":91,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["android","android-library","feedback","linkedin"],"created_at":"2025-08-17T01:34:53.998Z","updated_at":"2026-04-02T13:25:10.387Z","avatar_url":"https://github.com/linkedin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shaky\n[![Build Status](https://img.shields.io/github/workflow/status/linkedin/shaky-android/Merge%20checks)](https://img.shields.io/github/workflow/status/linkedin/shaky-android/Merge%20checks)\n\nShake-to-feedback plugin for Android.\n\n\u003cimg src=\"./screenshot.png\" width=\"240\" height=\"240\" alt=\"Shaky dialog prompt\"\u003e\n\nInspired by Google Maps' Shake to feedback and based on Square's\n[seismic](https://github.com/square/seismic).\n\n## Download\n\nDownload the latest .aar via Maven:\n```xml\n\t\u003cdependency\u003e\n\t  \u003cgroupId\u003ecom.linkedin.shaky\u003c/groupId\u003e\n\t  \u003cartifactId\u003eshaky\u003c/artifactId\u003e\n\t  \u003cversion\u003e4.0.3\u003c/version\u003e\n\t\u003c/dependency\u003e\n```\n\nor Gradle:\n```\n\timplementation 'com.linkedin.shaky:shaky:4.0.3'\n```\n\n## Getting Started\n\nAdd the following to your `AndroidManifest.xml` application tag:\n\n```xml\n    \u003cprovider\n        android:name=\"android.support.v4.content.FileProvider\"\n        android:authorities=\"${applicationId}.fileprovider\"\n        android:exported=\"false\"\n        android:grantUriPermissions=\"true\"\u003e\n        \u003cmeta-data\n            android:name=\"android.support.FILE_PROVIDER_PATHS\"\n            android:resource=\"@xml/filepaths\"/\u003e\n    \u003c/provider\u003e\n```\n\nCreate the corresponding `res/xml/filepaths.xml` resource:\n\n```xml\n\u003cpaths\u003e\n    \u003cfiles-path name=\"files\" path=\".\"/\u003e\n\u003c/paths\u003e\n```\nThis allows files captured by Shaky to be shared with external apps. In this case, whatever app\npicks up the email Intent. Note: you only need these xml permissions to share files with external apps. For more information see\n[FileProvider](https://developer.android.com/reference/android/support/v4/content/FileProvider.html).\n\nIn your `Application` subclass:\n\n```java\n    public class ShakyApplication extends Application {\n        @Override\n        public void onCreate() {\n            super.onCreate();\n            Shaky.with(this, new EmailShakeDelegate(\"hello@world.com\"));\n        }\n    }\n```\n\nFor a complete example, see the [demo app](shaky-sample/src/main).\n\n## Advanced Usage\n\nYour app can define custom behavior by subclassing\n[`ShakeDelegate`](shaky/src/main/java/com/linkedin/android/shaky/ShakeDelegate.java)\nand implementing the\n[`void submit(Activity, FeedbackResult)`](shaky/src/main/java/com/linkedin/android/shaky/ShakeDelegate.java#L49)\nmethod (e.g. to send the data to a custom server endpoint).\n\n\nIn addition, you can implement the\n[`Bundle collectData()`](shaky/src/main/java/com/linkedin/android/shaky/ShakeDelegate.java#L42)\nto collect extra app data including device logs, user data, etc. You will also need to handle how to send the extra data collected in your `submit` method.\n\nIf you want to programmatically trigger the feedback collection flow, rather than listening for shake events, you can call `Shaky#startFeedbackFlow()` on the\nobject returned by `Shaky.with()`. See the demo app for a full example of how to do this.\n\n## Snapshots\n\nYou can use snapshot builds to test the latest unreleased changes. A new snapshot is published\nafter every merge to the main branch by the [Deploy Snapshot Github Action workflow](.github/workflows/deploy-snapshot.yml).\n\nJust add the Sonatype snapshot repository to your Gradle scripts:\n```gradle\nrepositories {\n    maven {\n        url \"https://oss.sonatype.org/content/repositories/snapshots/\"\n    }\n}\n```\n\nYou can find the latest snapshot version to use in the [gradle.properties](gradle.properties) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinkedin%2Fshaky-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinkedin%2Fshaky-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinkedin%2Fshaky-android/lists"}