{"id":20307794,"url":"https://github.com/rayliverified/custompermissionsdialogue","last_synced_at":"2025-04-11T15:12:44.398Z","repository":{"id":67048094,"uuid":"95902343","full_name":"rayliverified/CustomPermissionsDialogue","owner":"rayliverified","description":"Custom Permissions Dialogue is the only permissions library that supports ALL permission request scenarios. This library handles multiple edge cases such as not enabling all permissions or permanently rejecting a permission request.","archived":false,"fork":false,"pushed_at":"2019-10-26T03:24:03.000Z","size":22906,"stargazers_count":53,"open_issues_count":2,"forks_count":13,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T04:49:05.944Z","etag":null,"topics":["android","dialog","dialogs","enable","give","grant","manager","marshmallow","permission","permissions","popup"],"latest_commit_sha":null,"homepage":"http://rayliverified.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rayliverified.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2017-06-30T15:40:56.000Z","updated_at":"2025-02-16T06:45:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"70388f89-aec8-4063-a761-34ce465298ae","html_url":"https://github.com/rayliverified/CustomPermissionsDialogue","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rayliverified%2FCustomPermissionsDialogue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rayliverified%2FCustomPermissionsDialogue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rayliverified%2FCustomPermissionsDialogue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rayliverified%2FCustomPermissionsDialogue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rayliverified","download_url":"https://codeload.github.com/rayliverified/CustomPermissionsDialogue/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248429118,"owners_count":21101785,"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":["android","dialog","dialogs","enable","give","grant","manager","marshmallow","permission","permissions","popup"],"created_at":"2024-11-14T17:19:09.509Z","updated_at":"2025-04-11T15:12:44.388Z","avatar_url":"https://github.com/rayliverified.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub release](https://img.shields.io/github/release/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue/releases) [![GitHub Release Date](https://img.shields.io/github/release-date/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue) [![Libraries.io for GitHub](https://img.shields.io/librariesio/github/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue) [![GitHub issues](https://img.shields.io/github/issues/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue) [![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue) [![API](https://img.shields.io/badge/API-15%2B-blue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue) [![GitHub top language](https://img.shields.io/github/languages/top/searchy2/CustomPermissionsDialogue.svg?style=flat-square)](https://github.com/searchy2/CustomPermissionsDialogue)\r\n# Custom Permissions Dialogue\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Cover_1280x.gif)\r\n\r\nCustom Permissions Dialogue is the only permissions library that supports ALL permission request scenarios. This library handles multiple edge cases such as not enabling all permissions or permanently rejecting a permission request. \r\n\r\nCustom Permissions Dialogue is also the FIRST permissions library with a graphical interface. Not only does Custom Permissions Dialogue offer the most advanced functionality, it looks fantastic while doing so!\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Screenshot.gif)\r\n\r\nThis library is part of the [Custom UI](http://rayliverified.com/index.php/code/) collection of beautiful, minimalistic, and customizable Android UI components.\r\n\r\n# Gradle Dependency\r\n\r\nAdd this line to your `build.gradle` project. Use the latest release version for the version code. \r\n\r\n```java\r\nrepositories {\r\n    maven { url 'https://jitpack.io' }\r\n}\r\nimplementation 'com.github.searchy2:CustomPermissionsDialogue:latest-version'\r\n```\r\n# Usage\r\n\r\n### Code\r\n\r\nCustom Permissions Dialogue uses the Builder format to initialize a popup permissions dialogue programmatically. To request a single permissions, just drag and drop the following code into your project. It's that simple!\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Simple_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setShowIcon(false)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n``` \r\n**IMPORTANT:** The Dialog Fragment is extremely picky about the `Activity` passed into the builder. If the improper Activity is passed, the dialogue will crash! Here's how to pass the proper Activity in the following cases:\r\n* Activity - construct with `ClassName.this`\r\n* Fragment - construct with `getActivity()`\r\n* ViewHolder - construct with `getActivity().getApplicationContext()`\r\n\r\nDo not attempt to construct the dialogue with `getContext()`. The Builder requires an Activity and passing a Context does not work! \r\n\r\n**Hint:** Passing the DecorView to the Dialogue Builder in setDecorView will create a nice blurred background. Here's how to pass the correct DecorView:\r\n* Activity - use `getWindow().getDecorView()`\r\n* Fragment - use `getActivity().getWindow().getDecorView()`\r\n* Viewholder - use `((Activity) mContext).getWindow().getDecorView()`\r\n\r\n### Manifest\r\n\r\nRemember to add the permissions your app requires to your manifest file. The following code contains a list of all regular Android permissions. \r\n\r\n```java\r\n    \u003cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.ACCESS_NOTIFICATION_POLICY\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.CALL_PHONE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.CAMERA\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.CHANGE_CONFIGURATION\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.GET_ACCOUNTS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.INTERNET\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.NFC\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_CALENDAR\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_CALL_LOG\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_CONTACTS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_PHONE_STATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_SMS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_SYNC_SETTINGS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.READ_SYNC_STATS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.RECEIVE_MMS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.RECEIVE_SMS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.RECORD_AUDIO\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.SEND_SMS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.SET_ALARM\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.VIBRATE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WAKE_LOCK\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_CALENDAR\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_CALL_LOG\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_CONTACTS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_SETTINGS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_SMS\"/\u003e\r\n    \u003cuses-permission android:name=\"android.permission.WRITE_SYNC_SETTINGS\"/\u003e\r\n```\r\n\r\n# Customization\r\n\r\nCustom Permissions Dialogue supports extensive customization options to fit your permission request needs. \r\n\r\n### Layouts\r\n\r\n**All - Showcases all Custom Permissions Dialogue permissions.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-All_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setIcon(R.mipmap.ic_launcher)\r\n        .setRequirePhone(PermissionsDialogue.REQUIRED)\r\n        .setRequireSMS(PermissionsDialogue.REQUIRED)\r\n        .setRequireContacts(PermissionsDialogue.REQUIRED)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setRequireCamera(PermissionsDialogue.OPTIONAL)\r\n        .setRequireAudio(PermissionsDialogue.OPTIONAL)\r\n        .setRequireCalendar(PermissionsDialogue.OPTIONAL)\r\n        .setRequireLocation(PermissionsDialogue.OPTIONAL)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n\r\n```\r\n\r\n**Required - Displays all required permissions for the user to grant.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Required_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setIcon(R.mipmap.ic_launcher)\r\n        .setRequirePhone(PermissionsDialogue.REQUIRED)\r\n        .setRequireSMS(PermissionsDialogue.REQUIRED)\r\n        .setRequireContacts(PermissionsDialogue.REQUIRED)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n```\r\n\r\n**Optional - Optional permissions allows user to selectively enable permissions.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Optional_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setRequireCamera(PermissionsDialogue.OPTIONAL)\r\n        .setRequireAudio(PermissionsDialogue.OPTIONAL)\r\n        .setRequireCalendar(PermissionsDialogue.OPTIONAL)\r\n        .setRequireLocation(PermissionsDialogue.OPTIONAL)\r\n        .setCameraDescription(\"Capture images\")\r\n        .setAudioDescription(\"Record audio messages\")\r\n        .setCalendarDescription(\"Add notes to calendar\")\r\n        .setLocationDescription(\"Geotag captured images\")\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n```\r\n\r\n**Single - Requests a single permission from the user.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Simple_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setShowIcon(false)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n```\r\n\r\n**Combined - A single permission request combined with other optional permissions that the user can grant.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Combined_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setShowIcon(false)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setRequireCamera(PermissionsDialogue.OPTIONAL)\r\n        .setRequireAudio(PermissionsDialogue.OPTIONAL)\r\n        .setRequireCalendar(PermissionsDialogue.OPTIONAL)\r\n        .setRequireLocation(PermissionsDialogue.OPTIONAL)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n```\r\n\r\n**Uncancelable - Set Cancelable to false to force user to grant permissions before proceeding.**\r\n\r\n![Screenshots](screenshots/Custom-Permissions-Dialogue-Simple_540x.png)\r\n\r\n```java\r\nPermissionsDialogue.Builder permissionsDialogue = new PermissionsDialogue.Builder(getActivity())\r\n        .setMessage(getString(R.string.app_name) + \" is a sample permissions app and requires the following permissions: \")\r\n        .setShowIcon(false)\r\n        .setCancelable(false)\r\n        .setRequireStorage(PermissionsDialogue.REQUIRED)\r\n        .setOnContinueClicked(new PermissionsDialogue.OnContinueClicked() {\r\n            @Override\r\n            public void OnClick(View view, Dialog dialog) {\r\n                dialog.dismiss();\r\n            }\r\n        })\r\n        .setDecorView(getWindow().getDecorView())\r\n        .build();\r\npermissionsDialogue.show();\r\n```\r\n\r\n### Builder Attributes\r\n\r\n`setTitle(String title)` - set Required Permissions title text.\r\n\r\n`setMessage(String message)` - set Required Permissions message text.\r\n\r\n`setMessageOptional(String messageOptional)` - set Optional Permissions message text.\r\n\r\n`setOnContinueClicked(OnContinueClicked onContinueClicked)` - pass a listener to be called when the `Continue` button is clicked.\r\n\r\n`setCancelable(boolean cancelable)` - set `false` to prevent dialogue dismissal without user granting required permissions.\r\n\r\n`setShowIcon(boolean showicon)` - toggle icon visibility. Default icon shown is app icon.\r\n\r\n`setIcon(int icon)` - pass a drawable resource Id to set as icon.\r\n\r\n`setRequirePhone(Integer phone)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireSMS(Integer sms)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireContacts(Integer contacts)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireCalendar(Integer calendar)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireStorage(Integer storage)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireCamera(Integer camera)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireAudio(Integer audio)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setRequireLocation(Integer location)` - set REQUIRED or OPTIONAL flag to display permission request.\r\n\r\n`setPhoneDescription(String phonedescription)` - set optional phone permission text.\r\n\r\n`setSMSDescription(String smsdescription)` - set optional text message permission text.\r\n\r\n`setContactDescription(String contactsdescription)` - set optional contact permission text.\r\n\r\n`setCalendarDescription(String calendardescription)` - set optional calendar permission text.\r\n\r\n`setStorageDescription(String storagedescription)` - set optional storage permission text.\r\n\r\n`setCameraDescription(String cameradescription)` - set optional camera permission text.\r\n\r\n`setAudioDescription(String audiodescription)` - set optional audio permission text.\r\n\r\n`setLocationDescription(String locationdescription)` - set optional location permission text.\r\n\r\n`setDecorView(View decorView)` - pass the Window DecorView for a nice blurred background. Defaults to overlay color.\r\n\r\n`build()` - Construct the Dialogue Builder.\r\n\r\n`show()` - Display the Dialogue with Builder parameters.\r\n\r\nView the Layouts section or the sample app for examples of how to use these Builder attributes. \r\n\r\n# Features Wishlist\r\n\r\nThese features would make this library even more awesome. You can contribute to this library by developing any of the features below. Or, if you really want to see a feature developed, you can sponsor me to develop the feature.\r\n\r\n---\r\n\r\n\u003eDynamic Blur Background ✔️ (Completed 2/22/2018)\r\n\r\nThanks to [@Dimezis](https://github.com/Dimezis) for fixing his [BlurView](https://github.com/Dimezis/BlurView) library to work with DialogFragments. Without Dimezis's help, there would be no blurred background! \r\n\r\n\u003eSensitive Permissions Walkthrough\r\n\r\nAndroid has many powerful but sensitive permissions tucked away in Settings. Some apps require `Usage Access` or `Accessibility Services` in order to function. Unfortunately, there is no open source library to walk users through the process of enabling those permissions. The best way I've seen to walk users through this process is through a floating popup that provides step by step instructions. Many apps have implemented this feature but no one has open sourced it yet! :(\r\n\r\n---\r\n\r\nPull requests are most welcome!\r\n\r\nIf you've fixed a bug or have a feature you've added, just create a pull request. If you've found a bug, file an issue. If you have any questions or would like to discuss upcoming features, please get in touch. You can get in touch with me in the Contact section below. \r\n\r\n# ★ Acknowledgements ★\r\n**♥ Developer ♥**\r\n\r\n[Ray Li](https://rayliverified.com)\r\n\r\n**♥ Designer ♥**\r\n\r\n[Ray Li](https://rayliverified.com)\r\n\r\n# ★ Get in Touch ★\r\n\u003ca href=\"mailto:ray.li.verified@gmail.com\"\u003e\r\n  \u003cimg alt=\"Ray Li Email\"\r\n       src=\"https://lh3.googleusercontent.com/yN_m90WN_HSCohXdgC2k91uSTk9dnYfoxTYwG_mv_l5_05dV2CzkQ1B6rEqH4uqdgjA=w96\" /\u003e\r\n\u003c/a\u003e\r\n\u003ca href=\"https://rayliverified.com\"\u003e\r\n  \u003cimg alt=\"Ray Li Website\"\r\n       src=\"https://lh3.googleusercontent.com/YmMGcgeO7Km9-J9vFRByov5sb7OUKetnKs8pTi0JZMDj3GVJ61GMTcTlHB7u9uHDHag=w96\" /\u003e\r\n\u003c/a\u003e\r\n\u003ca href=\"https://twitter.com/RayLiVerified\"\u003e\r\n  \u003cimg alt=\"Ray Li Twitter\"\r\n       src=\"https://lh3.ggpht.com/lSLM0xhCA1RZOwaQcjhlwmsvaIQYaP3c5qbDKCgLALhydrgExnaSKZdGa8S3YtRuVA=w96\" /\u003e\r\n\u003c/a\u003e\r\n\u003ca href=\"https://linkedin.com/in/rayliverified/\"\u003e\r\n  \u003cimg alt=\"Ray Li LinkedIn\"\r\n       src=\"https://lh3.googleusercontent.com/00APBMVQh3yraN704gKCeM63KzeQ-zHUi5wK6E9TjRQ26McyqYBt-zy__4i8GXDAfeys=w90\" /\u003e\r\n\u003c/a\u003e\r\n\u003ca href=\"https://www.uplabs.com/ray\"\u003e\r\n  \u003cimg alt=\"Ray Li UpLabs\"\r\n       src=\"https://lh3.googleusercontent.com/fDJB4jtIgZQF_Dj7AFAPEv2dJOJE8LaLSbaiOOFejQJl3oFbkOLLScstkp699oMDcEU=w90\" /\u003e\r\n\u003c/a\u003e\r\n\u003ca href=\"https://github.com/searchy2\"\u003e\r\n  \u003cimg alt=\"Ray Li GitHub\"\r\n       src=\"https://lh3.googleusercontent.com/L15QqmKK7Vl-Ag1ZxaBqNQlXVEw58JT2BDb-ef5t2eboDh0pPSLjDgi3-aQ3Opdhhyk=w96\" /\u003e\r\n\u003c/a\u003e\r\n\r\n# Apps Using This Library\r\n\r\nWant to be here? You can include yourself by making a `pull request`. \r\n\r\n\u003ctable\u003e\r\n    \u003ctr\u003e\r\n\t\t\u003ctd\u003e\u003cimg src=\"https://lh3.googleusercontent.com/tYGJBG8mc7lwC0ZxQUxif2FVMFI8L8xRkPON0ytkWVPTI67ggkrgDl3JpRu9jW0W3sLJ=w64\"/\u003e\u003c/td\u003e\r\n\t\t\u003ctd\u003e\u003ca href=\"https://github.com/searchy2/Rocket-Notes\"\u003eRocket Notes\u003c/a\u003e\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\t\u003ctr\u003e\r\n\t\t\u003ctd\u003e\u003cimg src=\"https://lh3.googleusercontent.com/R-vJInTblK1KBOqZaSDm_ac270QBHsiIcU9agHnN-rrp9K_lkN8rLzGIH8asCfkb420Q=w64\"/\u003e\u003c/td\u003e\r\n\t\t\u003ctd\u003e\u003ca href=\"https://play.google.com/store/apps/details?id=io.ideastarter\"\u003eCrowdfunding Community\u003c/a\u003e\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n    \u003ctr\u003e\r\n\t\t\u003ctd\u003e\u003cimg src=\"https://lh3.googleusercontent.com/CT1M2pKlUhGx4w5UHqarn6oSU_sa7L7XRW2-hQrfNi9oou6W81PbJnWi-9PbEfC_3g=w64\"/\u003e\u003c/td\u003e\r\n\t\t\u003ctd\u003e\u003ca href=\"https://play.google.com/store/apps/details?id=com.blankicon\"\u003eBlank Icon\u003c/a\u003e\u003c/td\u003e\r\n\t\u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n#### Search Terms\r\nandroid, popup, permission, permissions, dialog, dialogs, Marshmallow, grant, enable, give, manager\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frayliverified%2Fcustompermissionsdialogue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frayliverified%2Fcustompermissionsdialogue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frayliverified%2Fcustompermissionsdialogue/lists"}