{"id":18352390,"url":"https://github.com/cleveroad/musicbobber","last_synced_at":"2026-01-11T17:05:26.873Z","repository":{"id":43039169,"uuid":"53119016","full_name":"Cleveroad/MusicBobber","owner":"Cleveroad","description":"Awesome Audio Widget for any Android Music App","archived":false,"fork":false,"pushed_at":"2021-10-15T12:15:32.000Z","size":17190,"stargazers_count":882,"open_issues_count":4,"forks_count":181,"subscribers_count":43,"default_branch":"master","last_synced_at":"2025-04-12T22:18:06.047Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.cleveroad.com","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/Cleveroad.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-04T08:12:23.000Z","updated_at":"2025-01-23T01:42:41.000Z","dependencies_parsed_at":"2022-09-09T16:00:51.920Z","dependency_job_id":null,"html_url":"https://github.com/Cleveroad/MusicBobber","commit_stats":null,"previous_names":["cleveroad/craudiowidgetoverlay"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cleveroad%2FMusicBobber","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cleveroad%2FMusicBobber/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cleveroad%2FMusicBobber/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cleveroad%2FMusicBobber/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cleveroad","download_url":"https://codeload.github.com/Cleveroad/MusicBobber/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248638014,"owners_count":21137586,"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":[],"created_at":"2024-11-05T21:35:49.509Z","updated_at":"2026-01-11T17:05:26.842Z","avatar_url":"https://github.com/Cleveroad.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Audio Widget Overlay View [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) \u003cimg src=\"https://www.cleveroad.com/public/comercial/label-android.svg\" height=\"19\"\u003e \u003ca href=\"https://www.cleveroad.com/?utm_source=github\u0026utm_medium=label\u0026utm_campaign=contacts\"\u003e\u003cimg src=\"https://www.cleveroad.com/public/comercial/label-cleveroad.svg\" height=\"19\"\u003e\u003c/a\u003e\n![Header image](/images/header_.jpg)\n\n## Meet the Audio Widget Overlay View by Cleveroad\n\nYou know, guys, we have become a bit obsessed with music recently. See yourself by checking our previous work on the Audio Visualization View library. Since we wanted to create a companion to our equalizer and add to the collection of Android widgets, the idea to develop a nice and convenient audio widget was born almost immediately. So if you have already developed a music player and you feel that you want to make it even better, then you’re welcome to use our library and enjoy the results. \n\n![Demo image](/images/demo.gif)\n\n###### Also you can watch the animation of the \u003cstrong\u003e\u003ca target=\"_blank\" href=\"https://youtu.be/4qehnkTR8z8?list=PLi-FH7__aeiydOwY_1q5I8P2EUSseqUCj\"\u003eAudio Widget Overlay on YouTube\u003c/a\u003e\u003c/strong\u003e in HD quality.\n\nOur invention can facilitate the user’s interaction with a music player and nicely decorate his device screen. Moreover, it’s really easy to integrate! Read our \u003cstrong\u003e\u003ca href=\"https://www.cleveroad.com/blog/case-study-audio-widget-overlay-view-by-cleveroad\"\u003eCase Study: Audio Widget Overlay View by Cleveroad\u003c/a\u003e\u003c/strong\u003e to ensure that and find more of useful information.\n\n\n[![Article image](/images/article.jpg)](https://www.cleveroad.com/blog/case-study-audio-widget-overlay-view-by-cleveroad)\n\u003cbr/\u003e\u003cbr/\u003e\n[![Awesome](/images/logo-footer.png)](https://www.cleveroad.com/?utm_source=github\u0026utm_medium=label\u0026utm_campaign=contacts)\n\u003cbr/\u003e\n## Setup and usage\nTo use Audio Widget Overlay first add dependency to your project:\n \n```groovy\ndependencies {\n    implementation 'com.cleveroad:audiowidget:1.0.2'\n}\n```\nThis library will add two new permissions to your manifest:\n```XML\n\u003c!-- used for drawing widget. This permission must be granted before calling AudioWidget.show(). --\u003e\n\u003cuses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/\u003e\n\n\u003c!-- used for notifing user that he is about to remove widget when he drags it on remove widget icon. --\u003e\n\u003c!-- This permission granted by default on Android 6.0+ devices. --\u003e\n\u003cuses-permission android:name=\"android.permission.VIBRATE\"/\u003e\n```\n \nThen you can create new instance of widget using builder:\n```JAVA\nAudioWidget audioWidget = new AudioWidget.Builder(context)\n        .lightColor(...)\n        .darkColor(...)\n        .expandWidgetColor(...)\n        .progressColor(...)\n        .progressStrokeWidth(...)\n        .crossColor(...)\n        .crossOverlappedColor(...)\n        .crossStrokeWidth(...)\n        .buttonPadding(...)\n        .bubblesMinSize(...)\n        .bubblesMaxSize(...)\n        .shadowColor(...)\n        .shadowRadius(...)\n        .shadowDx(...)\n        .shadowDy(...)\n        .playDrawable(...)\n        .pauseDrawable(...)\n        .playlistDrawable(...)\n        .prevTrackDrawale(...)\n        .nextTrackDrawable(...)\n        .defaultAlbumDrawable(...)\n        .edgeOffsetXCollapsed(...)\n        .edgeOffsetYCollapsed(...)\n        .edgeOffsetXExpanded(...)\n        .edgeOffsetYExpanded(...)\n        .build();\n```\n\nOr you can use default configuration. Just call:\n```JAVA\nAudioWidget audioWidget = new AudioWidget.Builder(context).build();\n```\n\nThen you can use audio widget's controller to listen for events:\n\n```JAVA\n// media buttons' click listener\naudioWidget.controller().onControlsClickListener(new AudioWidget.OnControlsClickListener() {\n    @Override\n    public boolean onPlaylistClicked() {\n        // playlist icon clicked\n        // return false to collapse widget, true to stay in expanded state\n    }\n\n    @Override\n    public void onPreviousClicked() {\n        // previous track button clicked\n    }\n\n    @Override\n    public boolean onPlayPauseClicked() {\n        // return true to change playback state of widget and play button click animation (in collapsed state)\n        return true;\n    }\n\n    @Override\n    public void onNextClicked() {\n        // next track button clicked\n    }\n\n    @Override\n    public void onAlbumClicked() {\n        // album cover clicked\n    }\n    \n    @Override\n    public void onPlaylistLongClicked() {\n        // playlist button long clicked\n    }\n    \n    @Override\n    public void onPreviousLongClicked() {\n        // previous track button long clicked\n    }\n    \n    @Override\n    public void onPlayPauseLongClicked() {\n        // play/pause button long clicked\n    }\n    \n    @Override\n    public void onNextLongClicked() {\n        // next track button long clicked\n    }\n\n    @Override\n    public void onAlbumClicked() {\n        // album cover long clicked\n    }\n\n    @Override\n    public void onAlbumLongClicked() {\n        // album cover long clicked\n    }\n});\n\n// widget's state listener\naudioWidget.controller().onWidgetStateChangedListener(new AudioWidget.OnWidgetStateChangedListener() {\n    @Override\n    public void onWidgetStateChanged(@NonNull AudioWidget.State state) {\n        // widget state changed (COLLAPSED, EXPANDED, REMOVED)\n    }\n\n    @Override\n    public void onWidgetPositionChanged(int cx, int cy) {\n        // widget position change. Save coordinates here to reuse them next time AudioWidget.show(int, int) called.\n    }\n});\n```\n\nUsing AudioWidget.Controller, you can set track's duration, current position or album cover. Also you can set current playback state using start(), pause() or stop() methods. See **MusicService** class for more info on how to use controller.\n\nTo show audio widget on screen call **AudioWidget.show(int, int)** method. To hide it call **AudioWidget.hide()** method. Very simple!\n```JAVA\naudioWidget.show(100, 100); // coordinates in pixels on screen from top left corner\n...\naudioWidget.hide();\n```\n\nBut make sure that your app has permission to draw over another apps in Android 6.0+. You can do it like this (in Activity):\n```JAVA\n    ...\n    \n    // somewhere in your code\n    if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.M \u0026\u0026 !Settings.canDrawOverlays(this)) {\n        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\"package:\" + getPackageName()));\n        startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);\n    }\n    \n    ...\n    \n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {\n            if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.M \u0026\u0026 Settings.canDrawOverlays(this)) {\n                // now you can show audio widget\n            }\n        }\n    }\n    \n    ...\n```\n\n#### Migration from v.0.9.1 to v.0.9.2\n* **OnControlsClickListener.onPlaylistClicked** should return `true` to consume the action or `false` to use default behavior (collapse the widget)\n* **OnControlsClickListener.onPlayPauseClicked** should return `true` to consume the action or `false` to use default behavior (change play/pause state)\n\n## Changelog\nSee [changelog history].\n\n\u003cbr /\u003e\n#### Support ####\n* * *\nIf you have any other questions regarding the use of this library, please contact us for support at info@cleveroad.com (email subject: \"Audio Widget Overlay View. Support request.\") \n\n\u003cbr /\u003e\n#### License ####\n* * *\n    The MIT License (MIT)\n    \n    Copyright (c) 2016 Cleveroad Inc.\n    \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n    \n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\n[changelog history]: /CHANGELOG.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcleveroad%2Fmusicbobber","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcleveroad%2Fmusicbobber","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcleveroad%2Fmusicbobber/lists"}