[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "## FAQs\n\n<!--\nBefore you add the issue, please make sure to read over the following Frequently Asked Questions:\n\n**\"XxxPermissionsDispatcher class is not generated\"**\n\n- Did you add `@RuntimePermissions` to your class, and `@NeedsPermission` to your method?\n- Did you try a Rebuild? (Sync is not Rebuild!)\n- Don't mix `apt` and `annotationProcessor`!\n- If you're in Kotlin, use `kapt`!\n- If you're using Realm 1.x., please consider upgrading to 2.x (refer to Issue #270: https://github.com/hotchemi/PermissionsDispatcher/issues/270)\n- If you checked all these steps, and the generated classes are still not showing up, then attach your Activity/Fragment class, and build.gradle.\n-->\n \n___\n\n## Overview\n\n- Describe the issue briefly\n\n### Expected\n\n- What is the expected behavior?\n\n### Actual\n\n- What is the actual behavior?\n\n## Environment\n\n- Which library version are you using?\n- On which devices do you observe the issue?\n- Note any other information that might be useful\n\n## Reproducible steps\n\n- While it's not required, it'd be perfect to add a link to a sample project where you encounter the issue\n"
  },
  {
    "path": ".github/workflows/deploy_snapshot.yml",
    "content": "name: Deploy snapshot\n\non:\n  pull_request:\n    branches:\n      - master\n    types: [closed]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    if: github.event.pull_request.merged == true\n    steps:\n    - uses: actions/checkout@v2\n    - name: set up JDK 1.8\n      uses: actions/setup-java@v1\n      with:\n        java-version: 1.8\n    - name: Grant execute permission for gradlew\n      run: chmod +x gradlew\n    - name: Prepare local.properties for testing\n      run: echo \"sdk.dir=$ANDROID_HOME\" > local.properties\n    - name: Build with Gradle\n      run: ./gradlew clean build\n    - name: Deploy snapshot\n      run: ./gradlew uploadArchives --no-daemon --no-parallel -PSONATYPE_NEXUS_USERNAME=${{secrets.SONATYPE_NEXUS_USERNAME}} -PSONATYPE_NEXUS_PASSWORD=${{secrets.SONATYPE_NEXUS_PASSWORD}} -Psigning.keyId=${{secrets.SIGNING_KEY_ID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -Psigning.secretKeyRingFile=$(echo ~/.gradle/secring.gpg)\n"
  },
  {
    "path": ".github/workflows/ktx-release.yml",
    "content": "name: KTX Release\n\non:\n  push:\n    tags:\n      - 'ktx-*.*.*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: set up JDK 1.8\n      uses: actions/setup-java@v1\n      with:\n        java-version: 1.8\n    - name: Grant execute permission for gradlew\n      run: chmod +x gradlew\n    - name: Prepare local.properties for testing\n      run: echo \"sdk.dir=$ANDROID_HOME\" > local.properties\n    - name: Build with Gradle\n      run: ./gradlew clean build\n    - name: Decode the secret key and place the file\n      run: |\n        echo \"${{secrets.SIGNING_SECRET_KEY_RING_FILE}}\" > ~/.gradle/secring.gpg.b64\n        base64 -d ~/.gradle/secring.gpg.b64 > ~/.gradle/secring.gpg\n    - name: Publish project\n      run: ./gradlew ktx:uploadArchives --no-daemon --no-parallel -PSONATYPE_NEXUS_USERNAME=${{secrets.SONATYPE_NEXUS_USERNAME}} -PSONATYPE_NEXUS_PASSWORD=${{secrets.SONATYPE_NEXUS_PASSWORD}} -Psigning.keyId=${{secrets.SIGNING_KEY_ID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -Psigning.secretKeyRingFile=$(echo ~/.gradle/secring.gpg)\n    - name: Close the repository\n      run: ./gradlew closeAndReleaseRepository\n"
  },
  {
    "path": ".github/workflows/pull_request_ci.yml",
    "content": "name: CI for pull request\n\non:\n  pull_request:\n    types: [assigned, opened, synchronize, reopened]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: set up JDK 1.8\n      uses: actions/setup-java@v1\n      with:\n        java-version: 1.8\n    - name: Grant execute permission for gradlew\n      run: chmod +x gradlew\n    - name: Prepare local.properties for testing\n      run: echo \"sdk.dir=$ANDROID_HOME\" > local.properties\n    - name: Build with Gradle\n      run: ./gradlew clean check --stacktrace\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    tags:\n      - '[0-9]+.[0-9]+.[0-9]+'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: set up JDK 1.8\n      uses: actions/setup-java@v1\n      with:\n        java-version: 1.8\n    - name: Grant execute permission for gradlew\n      run: chmod +x gradlew\n    - name: Prepare local.properties for testing\n      run: echo \"sdk.dir=$ANDROID_HOME\" > local.properties\n    - name: Build with Gradle\n      run: ./gradlew clean build\n    - name: Decode the secret key and place the file\n      run: |\n        echo \"${{secrets.SIGNING_SECRET_KEY_RING_FILE}}\" > ~/.gradle/secring.gpg.b64\n        base64 -d ~/.gradle/secring.gpg.b64 > ~/.gradle/secring.gpg\n    - name: Publish project\n      run: ./gradlew uploadArchives --no-daemon --no-parallel -PSONATYPE_NEXUS_USERNAME=${{secrets.SONATYPE_NEXUS_USERNAME}} -PSONATYPE_NEXUS_PASSWORD=${{secrets.SONATYPE_NEXUS_PASSWORD}} -Psigning.keyId=${{secrets.SIGNING_KEY_ID}} -Psigning.password=${{secrets.SIGNING_PASSWORD}} -Psigning.secretKeyRingFile=$(echo ~/.gradle/secring.gpg)\n    - name: Close the repository\n      run: ./gradlew closeAndReleaseRepository\n"
  },
  {
    "path": ".gitignore",
    "content": ".gradle\nlocal.properties\n\nbuild/\n\n.idea/\n*.iml\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# ChangeLog\n\n- 4.9.2 | ktx: 1.1.4 2022/04/04\n  - Fix: [fix: use ContextCompat instead of PermissionChecker](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/757)\n- ktx: 1.1.3 2021/11/07\n  - Fix: [sort permissions to secure identification](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/729)\n- ktx: 1.1.2 2021/08/14\n  - Fix: [permissionRequest proceed doesn't work due to KtxPermissionRequest.requestPermission being null](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/742)\n- ktx: 1.1.1 2021/08/09\n  - Fix: [Avoid memory leak with ViewModel](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/741)\n  - Fix: [Support device orientation again](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/738)\n  - Fix: [Write settings action bug fix](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/737)\n- 4.9.1 2021/08/09\n  - Fix: [Address compile error on Kotlin 1.5](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/733)\n- ktx: 1.0.5 2021/04/14\n  - Fix: [Use commitAllowingStateLoss() instead of commitNowAllowingStateLoss() in PermissionRequestFragment dismiss() to avoid exception when performing multiple transactions at same time](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/724)\n- ktx: 1.0.4 2021/03/16\n  - Fix: [Wrong behaviour of ktx library when two permissions are requested in one screen](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/717)\n- ktx: 1.0.3 2021/03/03\n  - Fix: stop depending on SNAPSHOT library module\n- ktx: 1.0.2 2021/03/03\n  - Fix: [System dialog doesn't show up, after manually disable permission from setting](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/705)\n- ktx: 1.0.1 2020/09/17\n  - Fix: [fix: wrap PermissionResult with Event](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/689)\n- ktx: 1.0.0 2020/08/31\n  - fix: [observe ViewModel only when a permission has not been granted](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/681)\n  - feat: [Location dedicated permission methods](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/679)\n- 4.8.0 2020/08/31\n  - Feat: [Bug fix for NeedOnRequestPermissionsResult lint derector](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/680)\n- ktx: 1.0.0-beta1\n  - Update: [rewrite internal implementation](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/678)\n- 4.7.0 2020/03/25\n  - Feat: [ktx module](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/665)\n  - Update: [Add missing dangerous permissions check in later versions](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/652)\n  - Update: [Use the constant from `PermissionChecker`](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/658)\n- 4.6.0 2019/10/30\n  - Fix: lint CallNeedsPermission on same named function [#602](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/602)\n  - Fix: Remove Conductor support [#644](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/644) \n  [#620](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/620)\n  - Fix: Java to Kotlin collections mapping [#643](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/643)\n- 4.5.0 2019/07/01\n  - Improve: Incremental annotation processing for Kotlin [#626](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/626)\n  - Fix: lint CallNeedsPermission on same named function [#602](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/602)\n  - Fix: java-kotlin conversion issue [#603](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/603) [#620](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/620)\n  - Fix: Remove redundant BuildConfig file [#607](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/607)\n- 4.3.1 2019/04/08\n  - Add: Add support for internal classes [#574](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/606)\n- 4.3.0 2018/12/31\n  - Add: Conductor support [#574](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/574)\n- 4.2.0 2018/12/21\n  - Add: OnShowRationale API change with keeping backward compatibility [#569](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/569)\n  - Update: Change maven groupId from `com.github.hotchemi` to `org.permissionsdispatcher` [#560](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/560)\n  - Doc: Publish document site! https://permissions-dispatcher.github.io\n  - Fix: Any is translated to java.lang.Object [#545](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/545)\n  - Add: Support Java incremental compilation [#473](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/473)\n  - Update: Drop Xiaomi support [#548](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/548)\n- 4.1.0 2018/12/07\n  - Fix: compile time validation for detecting OnNeverAskAgain with special permissions [#549](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/549)\n  - Fix: Fix CallNeedsPermissionDetector to scan only annotated classes [#536](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/536)\n- 4.0.0 2018/10/20\n  - Update: [Update androidx ver to 1.0.0](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/530)\n  - Fix: [Add NonNull annotation and use requireActivity](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/526)\n  - Fix: [workaround to convert java String to kotlin String in argument parameter](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/509)\n- 4.0.0-alpha1 2018/07/12\n  - Remove: Remove native Fragment support[#498](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/498)\n  - Add: Jetpack support [#494](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/494)\n- 3.3.2 2018/12/07\n  - Update: Drop Xiaomi support [#548](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/548)\n- 3.3.1 2018/06/25\n  - Internal: Update using Kotlin ver to 1.2.50 [#489](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/489)\n  - Add: Add a lint rule for not call WithPermissionCheck inside onResume [#486](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/486)\n  - Fix: Fix compile error when request SYSTEM_ALERT_WINDOW on SupportFragment [#482](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/482)\n  - Fix: Fix the problem with order matter \"Useless @OnShowRationale declaration [#479](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/479)\n- 3.2.0 2018/04/17\n  - Update: Address lint for Kotlin project [#460](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/460)\n  - Add: Add JvmName annotation to generated file [#458](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/458)\n  - Update: Deprecate android.app.Fragment [#454](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/454)\n  - Fix: Kotlin file problem with CallOnRequestPermissionsResultDetector [#449](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/449)\n- 3.1.0 2017/12/18\n  - Fix: nullable params with Kotlin [#397](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/397)\n  - Fix: PD does not generate kt version of SYSTEM_ALERT_WINDOW [#406](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/406)\n- 3.0.1 2017/09/17\n  - Fix: NeedsPermission annotated method with parameter doesn't work in Kotlin [#376](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/376)\n  - Fix: CallNeedsPermission check incorrectly flags calls to methods of different class [#377](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/377)\n- 3.0.0 2017/09/16\n  - Add fully [Kotlin support](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/kotlin_support.md)!\n  - Allow for Deterministic, Reproducible Builds with sorted inputs [#342](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/342)\n  - Internal: Migrate Lint Rules to UAST [363](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/363)\n  - Rename withCheck to withPermissionCheck [#365](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/365)\n  - Fix CallNeedsPermissionDetector to work correctly [#368](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/368)\n- 2.4.0 2017/05/01\n  - Fix `SupportV13MissingException` with newer Gradle [#279](https://github.com/hotchemi/PermissionsDispatcher/issues/279).\n    - Now we bundle support v13 library in the library, you don't have to add v13 dependency by yourself.\n      - If you don't need v13 remove it rxpressly. ref: [README](https://github.com/hotchemi/PermissionsDispatcher#download)\n  - Remove a workaround in the case `targetSdkVersion < 23` [#305](https://github.com/hotchemi/PermissionsDispatcher/issues/305).\n    - If you need the workaround please use  older version.\n- 2.3.2 2017/03/10\n  - Update minSdkVersion to API level 9 [#286](https://github.com/hotchemi/PermissionsDispatcher/pull/286).\n  - Add new compile-time check [#284](https://github.com/hotchemi/PermissionsDispatcher/pull/284).\n  - Fix the problem with receiver of startActivityForResult [#280](https://github.com/hotchemi/PermissionsDispatcher/pull/280)\n  - Support nested annotated class [#263](https://github.com/hotchemi/PermissionsDispatcher/pull/263)\n- 2.3.1 2016/12/26\n  - Fix a bug related to Xiaomi. [#240](https://github.com/hotchemi/PermissionsDispatcher/issues/240).\n  - Address [#244](https://github.com/hotchemi/PermissionsDispatcher/issues/244) just in case.\n- 2.3.0 2016/12/14\n  - Start Xiaomi support. [#235](https://github.com/hotchemi/PermissionsDispatcher/pull/235).\n  - Fix slight bug for lint check. [#230](https://github.com/hotchemi/PermissionsDispatcher/pull/230).\n- 2.2.1 2016/12/08\n  - Lint update: Migrate to Psi APIs [#227](https://github.com/hotchemi/PermissionsDispatcher/pull/227).\n  - Make sure to support Java 1.6 [#222](https://github.com/hotchemi/PermissionsDispatcher/pull/222).\n- 2.2.0 2016/09/25\n  - Support maxSdkVersion [#204](https://github.com/hotchemi/PermissionsDispatcher/pull/204).\n  - Add ProGuard support [#175](https://github.com/hotchemi/PermissionsDispatcher/pull/175).\n  - Some internal cleanup.\n- 2.1.3 2016/05/12\n  - Fix [#147](https://github.com/hotchemi/PermissionsDispatcher/pull/147).\n- 2.1.2 2016/04/11\n  - Fix [#131](https://github.com/hotchemi/PermissionsDispatcher/pull/131).\n  - Add [#122](https://github.com/hotchemi/PermissionsDispatcher/pull/122).\n- 2.1.1 2016/03/30\n  - Fix [#124](https://github.com/hotchemi/PermissionsDispatcher/issues/124).\n- 2.1.0 2016/03/20\n  - Fix [#114](https://github.com/hotchemi/PermissionsDispatcher/issues/114).\n- 2.0.9 2016/03/19\n  - Fix [#112](https://github.com/hotchemi/PermissionsDispatcher/issues/112).\n- 2.0.8 2016/03/09\n  - Fix [#107](https://github.com/hotchemi/PermissionsDispatcher/issues/107).\n  - Fix [#109](https://github.com/hotchemi/PermissionsDispatcher/issues/109).\n- 2.0.7 2016/02/16\n  - Kotlin 1.0 support [#98](https://github.com/hotchemi/PermissionsDispatcher/pull/98).\n- 2.0.6 2016/02/15\n  - Add lint support [#75](https://github.com/hotchemi/PermissionsDispatcher/pull/75).\n  - Update kotlin version [#91](https://github.com/hotchemi/PermissionsDispatcher/pull/91).\n  - Performance improvement [#93](https://github.com/hotchemi/PermissionsDispatcher/pull/93).\n- 2.0.5 2016/01/29\n  - Back to support JDK 1.7.\n- 2.0.4 2016/01/22\n  - Fix [Issue #78](https://github.com/hotchemi/PermissionsDispatcher/issues/78)\n- 2.0.3 2016/01/18\n - **This version has a bug which @OnNeverAskAgain is never called. Please don't use it.** \n - Add [#65](https://github.com/hotchemi/PermissionsDispatcher/pull/65).\n - Add [#72](https://github.com/hotchemi/PermissionsDispatcher/pull/72).\n- 2.0.2 2016/01/13\n - Fix [#63](https://github.com/hotchemi/PermissionsDispatcher/issues/63).\n- 2.0.1 2015/12/04\n    - Add `@NeverAskAgain`.\n- 1.2.1 2015/09/14\n    - Fix #14 and #16.\n- 1.2.0 2015/09/07\n    - Add `@DeniedPermission` and `@DeniedPermissions`.\n- 1.1.2 2015/08/26\n    - Downgrade processor jdk version to 1.7.\n- 1.1.1 2015/08/25\n    - Fix some bugs.\n- 1.1.0 2015/08/24\n    - Add `@NeedsPermissions` and `@ShowRationales`.\n- 1.0.1 2015/08/20\n    - Stop calling rationale methods in the OnRequestPermissionsResult.\n- 1.0.0 2015/08/19\n    - Using support v4 compat classes.\n- 0.9.0 2015/08/18\n    - Prepare for preview 3(final release).\n- 0.5.0 2015/08/16\n    - Initial release.\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# PermissionsDispatcher ![CI for pull request](https://github.com/permissions-dispatcher/PermissionsDispatcher/workflows/CI%20for%20pull%20request/badge.svg) [![PermissionsDispatcher](https://www.appbrain.com/stats/libraries/shield/permissions_dispatcher.svg)](https://www.appbrain.com/stats/libraries/details/permissions_dispatcher/permissionsdispatcher)\n\n- **Fully Kotlin/Java support**\n- [**Special permissions support**](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/special_permissions.md)\n- **100% reflection-free**\n\nPermissionsDispatcher provides a simple annotation-based API to handle runtime permissions.\n\nThis library lifts the burden that comes with writing a bunch of check statements whether a permission has been granted or not from you, in order to keep your code clean and safe.\n\n## Usage\n\n- Kotlin: You can pick either of [ktx](https://github.com/permissions-dispatcher/PermissionsDispatcher/tree/master/ktx) or [kapt](https://github.com/permissions-dispatcher/PermissionsDispatcher#0-prepare-androidmanifest).\n- Java: [apt](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/java_usage.md)\n\nHere's a minimum example, in which you register a `MainActivity` which requires `Manifest.permission.CAMERA`.\n\n### 0. Prepare AndroidManifest\n\nAdd the following line to `AndroidManifest.xml`:\n \n`<uses-permission android:name=\"android.permission.CAMERA\" />`\n\n### 1. Attach annotations\n\nPermissionsDispatcher introduces only a few annotations, keeping its general API concise:\n\n> NOTE: Annotated methods must not be `private`.\n\n|Annotation|Required|Description|\n|---|---|---|\n|`@RuntimePermissions`|**✓**|Register an `Activity` or `Fragment` to handle permissions|\n|`@NeedsPermission`|**✓**|Annotate a method which performs the action that requires one or more permissions|\n|`@OnShowRationale`||Annotate a method which explains why the permissions are needed. It passes in a `PermissionRequest` object which can be used to continue or abort the current permission request upon user input. If you don't specify any argument for the method compiler will generate `process${NeedsPermissionMethodName}ProcessRequest` and `cancel${NeedsPermissionMethodName}ProcessRequest`. You can use those methods in place of `PermissionRequest`(ex: with `DialogFragment`)|\n|`@OnPermissionDenied`||Annotate a method which is invoked if the user doesn't grant the permissions|\n|`@OnNeverAskAgain`||Annotate a method which is invoked if the user chose to have the device \"never ask again\" about a permission|\n\n```kotlin\n@RuntimePermissions\nclass MainActivity : AppCompatActivity(), View.OnClickListener {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera() {\n        supportFragmentManager.beginTransaction()\n                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())\n                .addToBackStack(\"camera\")\n                .commitAllowingStateLoss()\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    fun showRationaleForCamera(request: PermissionRequest) {\n        showRationaleDialog(R.string.permission_camera_rationale, request)\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    fun onCameraDenied() {\n        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    fun onCameraNeverAskAgain() {\n        Toast.makeText(this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show()\n    }\n}\n```\n\n### 2. Delegate to generated functions\n\nNow generated functions become much more concise and intuitive than Java version!\n\n```kotlin\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        findViewById(R.id.button_camera).setOnClickListener {\n            // NOTE: delegate the permission handling to generated function\n            showCameraWithPermissionCheck()\n        }\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        // NOTE: delegate the permission handling to generated function\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n```\n\nCheck out the [sample](https://github.com/hotchemi/PermissionsDispatcher/tree/master/sample) for more details.\n\n## Other features/plugins\n\n- [Getting Special Permissions](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/special_permissions.md)\n- [maxSdkVersion](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/maxsdkversion.md)\n- [IntelliJ plugin](https://github.com/shiraji/permissions-dispatcher-plugin)\n- [AndroidAnnotations plugin](https://github.com/AleksanderMielczarek/AndroidAnnotationsPermissionsDispatcherPlugin)\n\n## Installation\n\n**NOTE:**\n  - If you're using jCenter we've moved on to MavenCentral, see [migration guide](https://github.com/hotchemi/PermissionsDispatcher/blob/master/doc/migration_guide.md).\n  - 4.x only supports [Jetpack](https://developer.android.com/jetpack/). If you still use appcompat 3.x is the way to go.\n\nTo add PermissionsDispatcher to your project, include the following in your **app module** `build.gradle` file:\n\n`${latest.version}` is [![Download](https://maven-badges.herokuapp.com/maven-central/com.github.permissions-dispatcher/permissionsdispatcher/badge.svg)](https://search.maven.org/search?q=g:com.github.permissions-dispatcher)\n\n```groovy\ndependencies {\n  implementation \"com.github.permissions-dispatcher:permissionsdispatcher:${latest.version}\"\n  annotationProcessor \"com.github.permissions-dispatcher:permissionsdispatcher-processor:${latest.version}\"\n}\n```\n\nWith Kotlin:\n\n```groovy\napply plugin: 'kotlin-kapt'\n\ndependencies {\n  implementation \"com.github.permissions-dispatcher:permissionsdispatcher:${latest.version}\"\n  kapt \"com.github.permissions-dispatcher:permissionsdispatcher-processor:${latest.version}\"\n}\n```\n\n## License\n\n```\nCopyright 2016 Shintaro Katafuchi, Marcel Schnelle, Yoshinori Isogai\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n"
  },
  {
    "path": "annotation/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "annotation/build.gradle",
    "content": "apply plugin: 'java-library'\napply plugin: \"com.vanniktech.maven.publish\"\n"
  },
  {
    "path": "annotation/gradle.properties",
    "content": "POM_NAME        = permissionsdispatcher-annotation\nPOM_ARTIFACT_ID = permissionsdispatcher-annotation\nPOM_PACKAGING   = jar\n"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/GrantableRequest.java",
    "content": "package permissions.dispatcher;\n\npublic interface GrantableRequest extends PermissionRequest {\n    void grant();\n}\n"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/NeedsPermission.java",
    "content": "package permissions.dispatcher;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Register some methods which permissions are needed.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.CLASS)\npublic @interface NeedsPermission {\n    String[] value();\n\n    int maxSdkVersion() default 0;\n}"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/OnNeverAskAgain.java",
    "content": "package permissions.dispatcher;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Register some methods handling the user's choice to permanently deny permissions.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.CLASS)\npublic @interface OnNeverAskAgain {\n    String[] value();\n}\n"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/OnPermissionDenied.java",
    "content": "package permissions.dispatcher;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Register some methods which permissions are needed.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.CLASS)\npublic @interface OnPermissionDenied {\n    String[] value();\n}"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/OnShowRationale.java",
    "content": "package permissions.dispatcher;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Register some methods which explain why permissions are needed.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.CLASS)\npublic @interface OnShowRationale {\n    String[] value();\n}"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/PermissionRequest.java",
    "content": "package permissions.dispatcher;\n\n/**\n * Interface used by {@link OnShowRationale} methods to allow for continuation\n * or cancellation of a permission request.\n */\npublic interface PermissionRequest {\n    void proceed();\n\n    void cancel();\n}\n"
  },
  {
    "path": "annotation/src/main/java/permissions/dispatcher/RuntimePermissions.java",
    "content": "package permissions.dispatcher;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Register an <code>Activity</code> or <code>Fragment</code> to handle permissions.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.CLASS)\npublic @interface RuntimePermissions {\n}"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n    repositories {\n        mavenCentral()\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath \"com.android.tools.build:gradle:$GRADLE_PLUGIN_VERSION\"\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION\"\n        classpath \"org.jetbrains.dokka:dokka-gradle-plugin:$DOKKA_VERSION\"\n        classpath \"com.vanniktech:gradle-maven-publish-plugin:$PUBLISH_PLUGIN_VERSION\"\n    }\n}\n\nallprojects {\n    repositories {\n        mavenCentral()\n        google()\n        jcenter()\n        // TODO: remove after publishing kompile-testing to Maven Central\n        maven { url 'https://jitpack.io' }\n    }\n}\n"
  },
  {
    "path": "buildSrc/build.gradle",
    "content": "apply plugin: \"groovy\"\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation gradleApi()\n    implementation localGroovy()\n    implementation \"commons-io:commons-io:2.6\"\n}\n"
  },
  {
    "path": "buildSrc/src/main/groovy/permissions/dispatcher/AarToJarDependencyPlugin.groovy",
    "content": "package permissions.dispatcher\n\nimport org.apache.commons.io.FileUtils\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.gradle.api.file.FileCollection\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.OutputDirectory\nimport org.gradle.api.tasks.TaskAction\n\nimport java.util.zip.ZipFile\n\n/**\n * Custom plugin for creating \"broken\" JARs from AAR files.\n *\n * It allows an annotation processor's code generation test\n * to resolve Android-specific classes on the classpath.\n *\n * Of course, the generated JARs aren't able to be loaded in by a ClassLoader,\n * since they reference Android classes absent in a pure-JVM environment.\n * However the generated code will compile and serve as the cornerstone\n * for assertions of an annotation processor that interfaces with Android APIs.\n *\n * To do this, a special configuration is created when the plugin is applied.\n * Any dependency specified in this configuration will be written into\n * a specific resource file, then loaded into a custom ClassLoader when\n * the unit tests are executed. Since AARs are not readable by a pure Java\n * runtime environment, their classes need to be extracted, and converted\n * into the JAR format.\n */\nclass AarToJarConversionPlugin implements Plugin<Project> {\n\n    private static final CONFIGURATION_NAME = \"testCompileAar\"\n    private static final TASK_NAME = \"convertAarsToJar\"\n    private static final CLASSPATH_FILE_NAME = \"additional-test-classpath.txt\"\n\n    @Override\n    void apply(Project project) {\n        // Custom Configuration\n        def configuration = project.configurations.create(CONFIGURATION_NAME)\n\n        // Conversion Task\n        def conversionTask = project.tasks.create(TASK_NAME, ConvertAarToJarTask) {\n            inputFiles = configuration\n            jarOutputDir = project.file(\"$project.buildDir/tmp/converted-aars\")\n            classpathOutputDir = project.file(\"$project.buildDir/resources/test\")\n        }\n\n        // Hook into the task dependency chain\n        project.tasks.getByName(\"classes\").dependsOn conversionTask\n    }\n\n    static class ConvertAarToJarTask extends DefaultTask {\n\n        @Input\n        FileCollection inputFiles\n\n        @OutputDirectory\n        File jarOutputDir\n\n        @OutputDirectory\n        File classpathOutputDir\n\n        @TaskAction\n        def convert() {\n            def paths = []\n\n            inputFiles.each { file ->\n                // AARs need to be converted to JAR,\n                // other files are piped through to the output folder\n                def destinationFile\n\n                if (file.name.endsWith(\".aar\")) {\n                    // Classes are contained inside a file named classes.jar,\n                    // which resides in an AAR.\n                    // Extract & rename it according to the artifact in question,\n                    // then copy it over to the output\n                    def zipFile = new ZipFile(file)\n                    def classesEntry = zipFile.getEntry(\"classes.jar\")\n                    def newFileName = file.name.replace(\".aar\", \".jar\")\n                    def sourceInputStream = zipFile.getInputStream(classesEntry)\n\n                    destinationFile = new File(jarOutputDir, newFileName)\n                    FileUtils.copyInputStreamToFile(sourceInputStream, destinationFile)\n\n                    project.logger.info(\"Converted AAR '$file.name' to JAR\")\n\n                } else {\n                    destinationFile = new File(jarOutputDir, file.name)\n                    FileUtils.copyFile(file, destinationFile)\n                }\n\n                paths += destinationFile.toURI().toURL().toString()\n            }\n\n            def classpathFile = new File(classpathOutputDir, CLASSPATH_FILE_NAME)\n            classpathFile.withWriter { it.write(paths.join(\"\\n\")) }\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/groovy/permissions/dispatcher/AndroidJarDependencyExtension.groovy",
    "content": "package permissions.dispatcher\n\nimport javax.annotation.Nullable\n\nclass AndroidJarDependencyExtension {\n    @Nullable\n    String directory\n}\n"
  },
  {
    "path": "buildSrc/src/main/groovy/permissions/dispatcher/AndroidJarDependencyPlugin.groovy",
    "content": "package permissions.dispatcher\n\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\n\n/**\n * This plugin creates a convenient dependency handler\n * that allows a shorthand way to access an \"android.jar\" file\n * of the environment's platform.\n *\n * It also adds an extension named \"androidJar\" to the project,\n * with which the default directory to search can be overridden.\n * If no value is specified explicitly, the plugin performs a\n * lookup of the \"sdk.dir\" property in the user's local.properties\n * file, and derives the Android version to include from the\n * compile SDK version specified in the root-level gradle.properties.\n */\n@SuppressWarnings(\"GroovyUnusedDeclaration\")\nclass AndroidJarDependencyPlugin implements Plugin<Project> {\n\n    private static final EXTENSION_NAME = \"androidJar\"\n\n    private static final SDK_DIR_PROPERTY = \"sdk.dir\"\n    private static final PLATFORM_DIR_PROPERTY = \"COMPILE_SDK_VERSION\"\n    private static final ANDROID_JAR_FILENAME = \"android.jar\"\n\n    @Override\n    void apply(Project project) {\n        def extension = project.extensions.create(EXTENSION_NAME, AndroidJarDependencyExtension)\n\n        project.dependencies.ext.androidJar = {\n            def directory = extension.directory\n            if (!directory) {\n                // By default, concatenate android.jar path from build environment variables\n                def sdkDir = loadProperties(project.rootProject.file(\"local.properties\"))\n                        .getProperty(SDK_DIR_PROPERTY)\n                def platformDir = loadProperties(project.rootProject.file(\"gradle.properties\"))\n                        .getProperty(PLATFORM_DIR_PROPERTY)\n\n                directory = \"$sdkDir/platforms/$platformDir\"\n            }\n\n            if (!new File(directory, ANDROID_JAR_FILENAME).exists()) {\n                throw new RuntimeException(\"can't find android.jar in folder '$directory'!\")\n            }\n\n            def dependency = project.fileTree(dir: directory, includes: [ANDROID_JAR_FILENAME])\n            return project.dependencies.create(dependency)\n        }\n    }\n\n    private static Properties loadProperties(File file) {\n        def properties = new Properties()\n        file.withReader { properties.load(it) }\n        return properties\n    }\n}\n"
  },
  {
    "path": "doc/java_usage.md",
    "content": "## Usage with Java\n\nHere's a minimum example, in which you register a `MainActivity` which requires `Manifest.permission.CAMERA`.\n\n### 0. Prepare AndroidManifest\n\nAdd the following line to `AndroidManifest.xml`:\n \n`<uses-permission android:name=\"android.permission.CAMERA\" />`\n\n### 1. Attach annotations\n\nPermissionsDispatcher introduces only a few annotations, keeping its general API concise:\n\n> NOTE: Annotated methods must not be `private`.\n\n|Annotation|Required|Description|\n|---|---|---|\n|`@RuntimePermissions`|**✓**|Register an `Activity` or `Fragment` to handle permissions|\n|`@NeedsPermission`|**✓**|Annotate a method which performs the action that requires one or more permissions|\n|`@OnShowRationale`||Annotate a method which explains why the permissions are needed. It passes in a `PermissionRequest` object which can be used to continue or abort the current permission request upon user input. If you don't specify any argument for the method compiler will generate `process${NeedsPermissionMethodName}ProcessRequest` and `cancel${NeedsPermissionMethodName}ProcessRequest`. You can use those methods in place of `PermissionRequest`(ex: with `DialogFragment`)|\n|`@OnPermissionDenied`||Annotate a method which is invoked if the user doesn't grant the permissions|\n|`@OnNeverAskAgain`||Annotate a method which is invoked if the user chose to have the device \"never ask again\" about a permission|\n\n```java\n@RuntimePermissions\npublic class MainActivity extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n        getSupportFragmentManager().beginTransaction()\n                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())\n                .addToBackStack(\"camera\")\n                .commitAllowingStateLoss();\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    void showRationaleForCamera(final PermissionRequest request) {\n        new AlertDialog.Builder(this)\n            .setMessage(R.string.permission_camera_rationale)\n            .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())\n            .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())\n            .show();\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    void showDeniedForCamera() {\n        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    void showNeverAskForCamera() {\n        Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();\n    }\n}\n```\n\n### 2. Delegate to generated class\n\nUpon compilation, PermissionsDispatcher generates a class for `MainActivityPermissionsDispatcher`([Activity Name] + PermissionsDispatcher), which you can use to safely access these permission-protected methods.\n\nThe only step you have to do is delegating the work to this helper class:\n\n```java\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    findViewById(R.id.button_camera).setOnClickListener(v -> {\n      // NOTE: delegate the permission handling to generated method\n      MainActivityPermissionsDispatcher.showCameraWithPermissionCheck(this);\n    });\n}\n\n@Override\npublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n    // NOTE: delegate the permission handling to generated method\n    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n}\n```\n\nCheck out the [sample](https://github.com/hotchemi/PermissionsDispatcher/tree/master/sample) for more details.\n"
  },
  {
    "path": "doc/maxsdkversion.md",
    "content": "## maxSdkVersion\n\n[&lt;uses-permission&gt;](https://developer.android.com/guide/topics/manifest/uses-permission-element.html) has an attribute call `maxSdkVersion`. PermissionsDispatcher support the feature as well.\n\nThe following sample is for declaring `Manifest.permisison.WRITE_EXTERNAL_STORAGE` up to API level 18.\n\n### 0. AndroidManifest\n\nDeclare the permission with `maxSdkVersion` attribute\n\n```xml\n<uses-permission\n     android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"\n     android:maxSdkVersion=\"18\" />\n```\n\n### 1. Attach annotations with `maxSdkVersion`\n\n```java\n@RuntimePermissions\npublic class MainActivity extends AppCompatActivity {\n    @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)\n    void getStorage() {\n    }\n}\n```\n"
  },
  {
    "path": "doc/migration_guide.md",
    "content": "# Migration guide\n\n- [Migrating to Maven Central](#migrating-to-maven-central)\n- [Migrating to 4.x](#migrating-to-4x)\n- [Migrating to 3.x](#migrating-to-3x)\n- [Migrating to 2.x](#migrating-to-2x)\n\n## Migrating to Maven Central\n\nSince Maven Central only accepts valid URL, we had no other choices but to change groupId again.\n\n```diff\ndependencies {\n-  implementation \"org.permissionsdispatcher:permissionsdispatcher:${latest.version}\"\n+  implementation \"com.github.permissions-dispatcher:permissionsdispatcher:${latest.version}\"\n-  annotationProcessor \"org.permissionsdispatcher:permissionsdispatcher-processor:${latest.version}\"\n+  annotationProcessor \"com.github.permissions-dispatcher:permissionsdispatcher-processor:${latest.version}\"\n}\n```\n\n#### KTX\n\nNOTE: Due to accidental mistake, artifact id `permissionsdispatcher-ktx` also exists on maven central but `ktx` is the correct one.\n\n```diff\ndependencies {\n-  implementation \"org.permissionsdispatcher:permissionsdispatcher-ktx:${latest.version}\"\n+  implementation \"com.github.permissions-dispatcher:ktx:${latest.version}\"\n}\n```\n\n## Migrating to 4.x\n\n### Change Maven groupId \n\nIssue: [#560](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/560)\n\n```diff\ndependencies {\n-  implementation \"com.github.hotchemi:permissionsdispatcher:${latest.version}\"\n+  implementation \"org.permissionsdispatcher:permissionsdispatcher:${latest.version}\"\n-  annotationProcessor \"com.github.hotchemi:permissionsdispatcher-processor:${latest.version}\"\n+  annotationProcessor \"org.permissionsdispatcher:permissionsdispatcher-processor:${latest.version}\"\n}\n```\n\n### Migrate to AndroidX from AppCompat\n\nIssue: [#488](https://github.com/permissions-dispatcher/PermissionsDispatcher/pull/488)\n\nFrom 4.x we only support [Jetpack](https://developer.android.com/jetpack/).\nBe sure you've gotten AndroidX migration done before upgrading the library version to 4.x.\n\n## Migrating to 3.x\n\n### Method name changing\n\nIssue: [#355](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/355)\n\nPermissionsDispatcher used to generate `***WithCheck` methods.\nStarting with 3.0, the suffix of these methods becomes `***WithPermissionCheck`.\n\n```diff\n- MainActivityPermissionsDispatcher.showCameraWithCheck(this);\n+ MainActivityPermissionsDispatcher.showCameraWithPermissionCheck(this);\n```\n\nThe motivation of this change is to make generated code more declarative and easy to figure out what'd be going on under the hood.\n\nThis change is especially beneficial in Kotlin, because the receiver of the generated method is a class annotated with `@RuntimePermissions`, instead of a helper class named `***PermissionsDispatcher`.\n\n### Kotlin support\n\nIssue: [#320](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/320)\n\nActually it's been possible to use PermissionsDispatcher with Kotlin already, because of its interoperability with Java. But to give you a more concise and idiomatic experience, we added full Kotlin support which is described in [here](kotlin_support.md).\n\nIf you're already using PermissionsDispatcher with Kotlin, be aware of the following 2 changes:\n\n#### `***WithPermissionCheck`\n\n```diff\nbutton.setOnClickListener {\n-   MainActivityPermissionsDispatcher.showCameraWithCheck(this)\n+   showCameraWithPermissionCheck()\n}\n```\n\n#### `onRequestPermissionsResult`\n\n```diff\noverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n    super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n-   MainActivityPermissionsDispatcher.onRequestPermissionsResult(requestCode, grantResults)\n+   onRequestPermissionsResult(requestCode, grantResults)\n}\n```\n\nThose methods are defined as extension functions so now you don't have to call `***MainActivityPermissionsDispatcher` class!\n\n## Migrating to 2.x\n\nSince the internals of PermissionsDispatcher 2 have undergone a fundamental refactoring, most notably in the switch of languages to Kotlin for our annotation processor, the exposed APIs to users of the library have been tweaked as well. This guide will help you migrate to the latest version in just a few minutes!\n\n### Update the artifacts\n\nFirst of all, make sure you're pulling in the correct version of the library:\n\n#### Before\n```groovy\ndependencies {\n    compile \"com.github.hotchemi:permissionsdispatcher:1.2.1\"\n    apt \"com.github.hotchemi:permissionsdispatcher-processor:1.2.1\"\n}\n```\n\n#### After\n```groovy\ndependencies {\n    compile \"com.github.hotchemi:permissionsdispatcher:2.0.0\"\n    apt \"com.github.hotchemi:permissionsdispatcher-processor:2.0.0\"\n}\n```\n\n*Make sure to change both the library and processor artifacts!*\n\n### @RuntimePermissions\n\nYour `Activity` or `Fragment` classes utilizing PermissionsDispatcher still need to be annotated with `@RuntimePermissions`, so nothing has changed there.\n\n### @NeedsPermission\n\nWhile version 1.x of the library had two flavors of the `@NeedsPermission` annotation (both the singular and plural form `@NeedsPermissions`), from now on there is only one. Make sure to change your previous usage of `@NeedsPermissions` to the unified one:\n\n#### Before\n```java\n@NeedsPermissions({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid setupCamera() {\n}\n```\n\n#### After\n```java\n@NeedsPermission({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid setupCamera() {\n}\n```\n\n### @OnShowRationale\n\nBoth `@ShowsRationale` and its plural form `@ShowsRationales` have been removed in version 2. They have been unified in the new annotation `@OnShowRationale`, which is used to display a reasoning to your users about why you need to request permissions for specific actions. The signature of methods annotated with this new annotation require a single parameter of type `PermissionRequest`: When PermissionsDispatcher calls this method on your class, the `PermissionRequest` will provide an interface for you to either `cancel()` or `proceed()` the ongoing runtime permission process. This allows you to defer showing a system dialog, for instance if you would like to display your own explanation in a dialog beforehand. And don't worry: If you forget to follow this signature pattern, PermissionsDispatcher will remind you at compile time! This is one of the most exciting new features of PermissionsDispatcher 2:\n\n#### Before\n```java\n@ShowsRationale({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid showCameraRationale() {\n    // Can't really do much here, since the system dialog is shown immediately afterwards...\n    Toast.makeText(...).show();\n}\n```\n\n#### After\n```java\n@OnShowRationale({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid showCameraRationale(final PermissionRequest request) {\n    // E.g. show a dialog explaining why you need the permission.\n    // Call proceed() or cancel() on the incoming request to continue or abort the current permissions process\n    new AlertDialog.Builder(...)\n        .setPositiveButton(\"OK\", (dialog, which) -> request.proceed())\n        .setNegativeButton(\"Abort\", (dialog, which) -> request.cancel())\n        .show();\n}\n```\n\n### @OnPermissionDenied\n\nThe old annotations `@DeniedPermission` and `@DeniedPermissions` have been unified into the new annotation `@OnPermissionDenied`. A method annotated with this annotation will be invoked if the user declines an ongoing permission request. For developers, it's as simple as switching the annotation's name:\n\n#### Before\n```java\n@DeniedPermission({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid cameraDenied() {\n}\n```\n\n#### After\n```java\n@OnPermissionDenied({ CAMERA, WRITE_EXTERNAL_STORAGE })\nvoid cameraDenied() {\n}\n```\n\n### That's it!\n\nYou're good to go and have successfully migrated to PermissionsDispatcher 2.x! We are striving to continue improving this library, so that the hassle of runtime permission handling becomes as convenient as possible for you.\n"
  },
  {
    "path": "doc/special_permissions.md",
    "content": "## Special Permissions\n\nPermissionsDispatcher takes care of special permissions `Manifest.permission.SYSTEM_ALERT_WINDOW` and `Manifest.permission.WRITE_SETTINGS`.\n\nThe following sample is to grant `SYSTEM_ALERT_WINDOW`.\n\n### 0. Prepare AndroidManifest\n\nAdd the following line to `AndroidManifest.xml`:\n \n`<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />`\n\n### 1. Attach annotations\n\nIt's the same as other permissions:\n\n```java\n@RuntimePermissions\npublic class MainActivity extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindow() {\n    }\n\n    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindowOnShowRationale(final PermissionRequest request) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindowOnPermissionDenied() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindowOnNeverAskAgain() {\n    }\n}\n```\n\n### 2. Delegate to generated class\n\nUnlike other permissions, special permissions require to call the delegation method at `onActivityResult`:\n\n```java\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    findViewById(R.id.button_system_alert_window).setOnClickListener(v -> {\n      // NOTE: delegate the permission handling to generated method\n      MainActivityPermissionsDispatcher.systemAlertWindowWithPermissionCheck(this);\n    });\n}\n\n@Override\npublic void onActivityResult(int requestCode, int resultCode, Intent data) {\n    MainActivityPermissionsDispatcher.onActivityResult(this, requestCode);\n}\n```\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.7.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Upload configuration\nUSER                    = hotchemi\nGROUP                   = com.github.permissions-dispatcher\nVERSION_NAME            = 4.10.0-SNAPSHOT\nPOM_NAME                = PermissionsDispatcher\nPOM_DESCRIPTION         = A declarative API to handle Android runtime permissions.\nPOM_INCEPTION_YEAR      = 2015\nPOM_URL                 = https://github.com/permissions-dispatcher/PermissionsDispatcher\nPOM_SCM_URL             = https://github.com/permissions-dispatcher/PermissionsDispatcher\nPOM_SCM_CONNECTION      = https://github.com/permissions-dispatcher/PermissionsDispatcher.git\nPOM_LICENCE_NAME        = The Apache Software License, Version 2.0\nPOM_LICENCE_URL         = https://www.apache.org/licenses/LICENSE-2.0.txt\nPOM_LICENCE_DIST        = repo\nPOM_DEVELOPER_ID        = hotchemi\nPOM_DEVELOPER_NAME      = Shintaro Katafuchi\nPOM_DEVELOPER_URL       = https://github.com/hotchemi\n\n# Plugin versions\nDOKKA_VERSION           = 1.4.20\nPUBLISH_PLUGIN_VERSION  = 0.18.0\nGRADLE_PLUGIN_VERSION   = 4.2.0\nKOTLIN_VERSION          = 1.5.20\nKOTLIN_METADATA_VERSION = 0.3.0\nANDROIDX_LIBRARY_VERSION= 1.0.0\nLIFECYCLE_VERSION       = 2.2.0\nARC_TESTING_VERSION     = 1.1.1\nJAVAPOET_VERSION        = 1.9.0\nKOTLINPOET_VERSION      = 1.3.0\nJUNIT_VERSION           = 4.12\nMOCKITO_VERSION         = 2.28.2\nMOCKITO_KOTLIN_VERSION  = 2.2.0\nPOWERMOCK_VERSION       = 2.0.2\nCOMPILE_TESTING_VERSION = 0.12\nLINT_VERSION            = 26.3.2\nROBOLECTRIC_VERSION     = 3.3.2\nCOMMONS_IO_VERSION      = 2.6\nKOMPILE_TESTING_VERSION = 0.1.4\n\n# Android configuration\nCOMPILE_SDK_VERSION     = android-29\nTARGET_SDK_VERSION      = 29\nMIN_SDK_VERSION         = 14\nSAMPLE_MIN_SDK_VERSION  = 16\n\n# Gradle parameters\norg.gradle.daemon       = true\norg.gradle.jvmargs      = -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -Xmx2048m\n\n# AndroidX\nandroid.useAndroidX     = true\nandroid.enableJetifier  = true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "ktx/README.md",
    "content": "## permissionsdispatcher-ktx\n\n`permissionsdispatcher-ktx` aims to let developers cope with runtime permissions handling in a declarative style without using annotation processing([kapt](https://kotlinlang.org/docs/reference/kapt.html)).\n\nLet's see a minimum example, in which you register a `MainActivity` which requires `Manifest.permission.CAMERA`.\n\n### 0. Declare a permission in AndroidManifest.xml\n\nAdd the following line to `AndroidManifest.xml`:\n \n`<uses-permission android:name=\"android.permission.CAMERA\" />`\n\n### 1. Define a requester with `constructPermissionsRequest`\n\nThe library provides `constructPermissionsRequest` which you can construct a requester object with the given several callback functions to be called in an appropriate situation.\n \n```kotlin\n/**\n * @param permissions the permissions [requiresPermission] requires.\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param onNeverAskAgain the method invoked if the user does not deny the permissions with\n * \"never ask again\" option.\n * @param requiresPermission the action requires [permissions].\n */\nfun FragmentActivity/*(or Fragment)*/.constructPermissionsRequest(\n    vararg permissions: String,\n    onShowRationale: ShowRationaleFunc? = null,\n    onPermissionDenied: Func? = null,\n    onNeverAskAgain: Func? = null,\n    requiresPermission: Func): PermissionsRequester\n```\n\nHere you just define `showCamera` and basically that's it! With the library you don't need to manually override `onRequestPermissionsResult`.\n\nNOTE: Be sure to construct a requester every time an activity is created to capture the callbacks appropriately.\n\n```kotlin\nclass MainActivity: AppCompatActivity {\n    // constructPermissionsRequest must be invoked every time an activity is created \n    private val showCamera = constructPermissionsRequest(Manifest.permission.CAMERA,\n        onShowRationale = ::onCameraShowRationale,\n        onPermissionDenied = ::onCameraDenied,\n        onNeverAskAgain = ::onCameraNeverAskAgain) {\n\t\t    // do something here\n        }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        findViewById(R.id.button_camera).setOnClickListener {\n            showCamera.launch()\n        }\n    }\n\n    private fun onCameraDenied() {\n        Toast.makeText(requireContext(), R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun onCameraShowRationale(request: PermissionRequest) {\n        request.proceed()\n    }\n\n    private fun onCameraNeverAskAgain() {\n        Toast.makeText(requireContext(), R.string.permission_camera_never_ask_again, Toast.LENGTH_SHORT).show()\n    }\n}\n```\n\nCheck out the [sample](https://github.com/hotchemi/PermissionsDispatcher/tree/master/ktx-sample) for more details.\n\n#### Location Permissions\n\nSince the location permissions have been one of the most sensitive permission group to deal with, we provide a dedicated method `constructLocationPermissionRequest`.\nWith the method you don't have to think of which API version you can ask [ACCESS_BACKGROUND_LOCATION](https://developer.android.com/about/versions/10/privacy/changes#app-access-device-location)(see the [issue](https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/646) for more detail).\n\n```kotlin\n/**\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n */\nfun FragmentActivity/*(or Fragment)*/.constructLocationPermissionRequest(\n    vararg permissions: LocationPermission,\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    onNeverAskAgain: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester\n```\n \n#### Special Permissions\n\nThe library also provides `constructWriteSettingsPermissionRequest` and\n `constructSystemAlertWindowPermissionRequest` to support `WRITE_SETTINGS` and `SYSTEM_ALERT_WINDOW` that\n requires exceptional handling.\n\n```kotlin\n/**\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n */\nfun FragmentActivity/*(or Fragment)*/.constructWriteSettingsPermissionRequest(\n    onShowRationale: ShowRationaleFunc? = null,\n    onPermissionDenied: Func? = null,\n    requiresPermission: Func): PermissionsRequester\n\n /**\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n */\nfun FragmentActivity/*(or Fragment)*/.constructSystemAlertWindowPermissionRequest(\n    onShowRationale: ShowRationaleFunc? = null,\n    onPermissionDenied: Func? = null,\n    requiresPermission: Func): PermissionsRequester\n```\n\n## Installation\n\n`${latest.version}` is [![Download](https://maven-badges.herokuapp.com/maven-central/com.github.permissions-dispatcher/ktx/badge.svg)](https://search.maven.org/artifact/com.github.permissions-dispatcher/ktx/1.0.2/aar)\n\n```groovy\ndependencies {\n  implementation \"com.github.permissions-dispatcher:ktx:${latest.version}\"\n}\n```\n"
  },
  {
    "path": "ktx/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'org.jetbrains.dokka'\napply plugin: \"com.vanniktech.maven.publish\"\n\nandroid {\n    compileSdkVersion COMPILE_SDK_VERSION\n    defaultConfig {\n        minSdkVersion MIN_SDK_VERSION\n        targetSdkVersion TARGET_SDK_VERSION\n    }\n\n    libraryVariants.all {\n        it.generateBuildConfigProvider.configure { enabled = false }\n    }\n}\n\ndependencies {\n    api \"com.github.permissions-dispatcher:permissionsdispatcher:4.8.0\"\n\n    implementation \"androidx.core:core:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.appcompat:appcompat:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.fragment:fragment:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.lifecycle:lifecycle-viewmodel-ktx:$LIFECYCLE_VERSION\"\n    implementation \"androidx.collection:collection:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION\"\n\n    testImplementation \"junit:junit:$JUNIT_VERSION\"\n    testImplementation \"androidx.test:core:1.3.0-rc01\"\n    testImplementation \"androidx.test.ext:junit:1.1.2-rc01\"\n    testImplementation \"androidx.test:runner:1.3.0-rc01\"\n    testImplementation \"android.arch.core:core-testing:$ARC_TESTING_VERSION\"\n    testImplementation \"com.nhaarman.mockitokotlin2:mockito-kotlin:$MOCKITO_KOTLIN_VERSION\"\n}\n"
  },
  {
    "path": "ktx/gradle.properties",
    "content": "POM_NAME        = ktx\nPOM_ARTIFACT_ID = ktx\nPOM_PACKAGING   = aar\nVERSION_NAME    = 1.2.0-SNAPSHOT\n"
  },
  {
    "path": "ktx/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"permissions.dispatcher.ktx\"/>\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/ActivityExtensions.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport android.annotation.SuppressLint\nimport android.provider.Settings\nimport androidx.fragment.app.FragmentActivity\n\n/**\n * Constructs a request for ordinary permissions that require a grant from the user.\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param permissions the permissions [requiresPermission] requires.\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param onNeverAskAgain the method invoked if the user does not deny the permissions with\n * \"never ask again\" option.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\nfun FragmentActivity.constructPermissionsRequest(\n    vararg permissions: String,\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    onNeverAskAgain: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = permissions,\n    activity = this,\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = onNeverAskAgain,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.Normal\n)\n\n/**\n * Constructs a request for location permissions that require a grant from the user.\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\nfun FragmentActivity.constructLocationPermissionRequest(\n    vararg permissions: LocationPermission,\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    onNeverAskAgain: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = permissions.filterByApiLevel(),\n    activity = this,\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = onNeverAskAgain,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.Normal\n)\n\n/**\n * Constructs a request for [android.Manifest.permission.WRITE_SETTINGS].\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\n@SuppressLint(\"InlinedApi\")\nfun FragmentActivity.constructWriteSettingsPermissionRequest(\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = arrayOf(Settings.ACTION_MANAGE_WRITE_SETTINGS),\n    activity = this,\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = null,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.WriteSettings\n)\n\n/**\n * Constructs a request for [android.Manifest.permission.SYSTEM_ALERT_WINDOW].\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\n@SuppressLint(\"InlinedApi\")\nfun FragmentActivity.constructSystemAlertWindowPermissionRequest(\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = arrayOf(Settings.ACTION_MANAGE_OVERLAY_PERMISSION),\n    activity = this,\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = null,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.SystemAlertWindow\n)\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/Event.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport androidx.annotation.AnyThread\n\n/**\n * Used as a wrapper for data that is exposed via a LiveData that represents an event.\n * ref: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150\n */\n@AnyThread\nclass Event<out T>(private val content: T) {\n    @Volatile\n    private var hasBeenHandled = false\n\n    /**\n     * Returns the content and prevents its use again.\n     */\n    fun getContentIfNotHandled(): T? = if (hasBeenHandled) {\n        null\n    } else {\n        hasBeenHandled = true\n        content\n    }\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/FragmentExtensions.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport android.annotation.SuppressLint\nimport android.provider.Settings\nimport androidx.fragment.app.Fragment\n\n/**\n * Constructs a request for ordinary permissions that require a grant from the user.\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param permissions the permissions [requiresPermission] requires.\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param onNeverAskAgain the method invoked if the user does not deny the permissions with\n * \"never ask again\" option.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\nfun Fragment.constructPermissionsRequest(\n    vararg permissions: String,\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    onNeverAskAgain: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = permissions,\n    activity = requireActivity(),\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = onNeverAskAgain,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.Normal\n)\n\n/**\n * Constructs a request for location permissions that require a grant from the user.\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\nfun Fragment.constructLocationPermissionRequest(\n    vararg permissions: LocationPermission,\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    onNeverAskAgain: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = permissions.filterByApiLevel(),\n    activity = requireActivity(),\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = onNeverAskAgain,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.Normal\n)\n\n/**\n * Constructs a request for [android.Manifest.permission.WRITE_SETTINGS].\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\n@SuppressLint(\"InlinedApi\")\nfun Fragment.constructWriteSettingsPermissionRequest(\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = arrayOf(Settings.ACTION_MANAGE_WRITE_SETTINGS),\n    activity = requireActivity(),\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = null,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.WriteSettings\n)\n\n/**\n * Constructs a request for [android.Manifest.permission.SYSTEM_ALERT_WINDOW].\n * Be sure to invoke the method when an activity is created to capture the valid callbacks.\n *\n * @param onShowRationale the method explains why the permissions are required.\n * @param onPermissionDenied the method invoked if the user doesn't grant the permissions.\n * @param requiresPermission the action requires [permissions].\n * @see PermissionsRequester\n */\n@SuppressLint(\"InlinedApi\")\nfun Fragment.constructSystemAlertWindowPermissionRequest(\n    onShowRationale: ShowRationaleFun? = null,\n    onPermissionDenied: Fun? = null,\n    requiresPermission: Fun\n): PermissionsRequester = PermissionsRequesterImpl(\n    permissions = arrayOf(Settings.ACTION_MANAGE_OVERLAY_PERMISSION),\n    activity = requireActivity(),\n    onShowRationale = onShowRationale,\n    onPermissionDenied = onPermissionDenied,\n    onNeverAskAgain = null,\n    requiresPermission = requiresPermission,\n    permissionRequestType = PermissionRequestType.SystemAlertWindow\n)\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/KtxPermissionRequest.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport permissions.dispatcher.PermissionRequest\nimport java.lang.ref.WeakReference\n\ninternal class KtxPermissionRequest(\n    private val requestPermission: WeakReference<Fun>,\n    private val permissionDenied: WeakReference<Fun>?\n) : PermissionRequest {\n    override fun proceed() {\n        requestPermission.get()?.invoke()\n    }\n\n    override fun cancel() {\n        permissionDenied?.get()?.invoke()\n    }\n\n    companion object {\n        fun create(onPermissionDenied: Fun?, requestPermission: Fun) = KtxPermissionRequest(\n            requestPermission = WeakReference(requestPermission),\n            permissionDenied = onPermissionDenied?.let { WeakReference(it) }\n        )\n    }\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/LocationPermission.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android.os.Build\n\n/**\n * An enum which represents location permission types.\n *\n * **See:** [Android Developers](https://developer.android.com/training/location/permissions)\n */\nenum class LocationPermission(internal val permission: String, internal val apiLevel: Int) {\n    FINE(Manifest.permission.ACCESS_FINE_LOCATION, 1),\n    COARSE(Manifest.permission.ACCESS_COARSE_LOCATION, 1),\n\n    @SuppressLint(\"InlinedApi\")\n    BACKGROUND(Manifest.permission.ACCESS_BACKGROUND_LOCATION, 29)\n}\n\ninternal fun Array<out LocationPermission>.filterByApiLevel(sdkVer: Int = Build.VERSION.SDK_INT) =\n    asSequence().filter { it.apiLevel <= sdkVer }.map { it.permission }.toList().toTypedArray()\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionRequestFragment.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.Settings\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport permissions.dispatcher.PermissionUtils\nimport permissions.dispatcher.PermissionUtils.verifyPermissions\nimport java.util.*\n\ninternal sealed class PermissionRequestFragment : Fragment() {\n    protected val requestCode = Random().nextInt(1000)\n    protected lateinit var viewModel: PermissionRequestViewModel\n\n    override fun onAttach(context: Context?) {\n        super.onAttach(context)\n        retainInstance = true\n        viewModel = ViewModelProvider(requireActivity()).get(PermissionRequestViewModel::class.java)\n    }\n\n    protected fun dismiss() =\n        fragmentManager?.beginTransaction()?.remove(this)?.commitAllowingStateLoss()\n\n    internal class NormalRequestPermissionFragment : PermissionRequestFragment() {\n        override fun onCreate(savedInstanceState: Bundle?) {\n            super.onCreate(savedInstanceState)\n            val permissions = arguments?.getStringArray(BUNDLE_PERMISSIONS_KEY) ?: return\n            requestPermissions(permissions, requestCode)\n        }\n\n        override fun onRequestPermissionsResult(\n            requestCode: Int,\n            permissions: Array<String>,\n            grantResults: IntArray\n        ) {\n            super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n            if (requestCode == this.requestCode) {\n                // https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/729\n                val key = permissions.sortedArray().contentToString()\n                if (verifyPermissions(*grantResults)) {\n                    viewModel.postPermissionRequestResult(key, PermissionResult.GRANTED)\n                } else {\n                    if (!PermissionUtils.shouldShowRequestPermissionRationale(this, *permissions)) {\n                        viewModel.postPermissionRequestResult(\n                            key,\n                            PermissionResult.DENIED_AND_DISABLED\n                        )\n                    } else {\n                        viewModel.postPermissionRequestResult(key, PermissionResult.DENIED)\n                    }\n                }\n            }\n            dismiss()\n        }\n\n        companion object {\n            const val BUNDLE_PERMISSIONS_KEY = \"key:permissions\"\n\n            fun newInstance(permissions: Array<out String>) =\n                NormalRequestPermissionFragment().apply {\n                    arguments = Bundle().apply {\n                        putStringArray(BUNDLE_PERMISSIONS_KEY, permissions)\n                    }\n                }\n        }\n    }\n\n    internal class SpecialRequestPermissionFragment : PermissionRequestFragment() {\n        private lateinit var action: String\n\n        override fun onCreate(savedInstanceState: Bundle?) {\n            super.onCreate(savedInstanceState)\n            action = arguments?.getString(BUNDLE_ACTION_KEY) ?: return\n            val packageName = context?.packageName ?: return\n            val uri = Uri.parse(\"package:$packageName\")\n            startActivityForResult(Intent(action, uri), requestCode)\n        }\n\n        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n            if (requestCode == this.requestCode) {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M\n                    && Settings.canDrawOverlays(activity)\n                ) {\n                    viewModel.postPermissionRequestResult(action, PermissionResult.GRANTED)\n                } else {\n                    viewModel.postPermissionRequestResult(action, PermissionResult.DENIED)\n                }\n            }\n            dismiss()\n        }\n\n        companion object {\n            const val BUNDLE_ACTION_KEY = \"key:action\"\n\n            fun newInstance(action: String) = SpecialRequestPermissionFragment().apply {\n                arguments = Bundle().apply {\n                    putString(BUNDLE_ACTION_KEY, action)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionRequestResult.kt",
    "content": "package permissions.dispatcher.ktx\n\ninternal enum class PermissionResult {\n    GRANTED,\n    DENIED,\n    DENIED_AND_DISABLED\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionRequestType.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport android.content.Context\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.annotation.RequiresApi\nimport permissions.dispatcher.PermissionUtils.hasSelfPermissions\n\ninternal sealed class PermissionRequestType {\n    object Normal : PermissionRequestType() {\n        override fun checkPermissions(context: Context, permissions: Array<out String>): Boolean =\n            hasSelfPermissions(context, *permissions)\n\n        override fun fragment(permissions: Array<out String>): PermissionRequestFragment =\n            PermissionRequestFragment.NormalRequestPermissionFragment.newInstance(\n                permissions\n            )\n    }\n\n    object SystemAlertWindow : PermissionRequestType() {\n        override fun checkPermissions(context: Context, permissions: Array<out String>): Boolean =\n            Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.canDrawOverlays(context)\n\n        @RequiresApi(Build.VERSION_CODES.M)\n        override fun fragment(permissions: Array<out String>): PermissionRequestFragment =\n            PermissionRequestFragment.SpecialRequestPermissionFragment.newInstance(\n                Settings.ACTION_MANAGE_OVERLAY_PERMISSION\n            )\n    }\n\n    object WriteSettings : PermissionRequestType() {\n        override fun checkPermissions(context: Context, permissions: Array<out String>): Boolean =\n            Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.System.canWrite(context)\n\n        @RequiresApi(Build.VERSION_CODES.M)\n        override fun fragment(permissions: Array<out String>): PermissionRequestFragment =\n            PermissionRequestFragment.SpecialRequestPermissionFragment.newInstance(\n                Settings.ACTION_MANAGE_WRITE_SETTINGS\n            )\n    }\n\n    abstract fun checkPermissions(context: Context, permissions: Array<out String>): Boolean\n\n    abstract fun fragment(permissions: Array<out String>): PermissionRequestFragment\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionRequestViewModel.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport androidx.annotation.MainThread\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport java.lang.ref.WeakReference\n\n@MainThread\ninternal class PermissionRequestViewModel : ViewModel() {\n    private val permissionRequestResult =\n        MutableLiveData<MutableMap<String, Event<PermissionResult>>>()\n        get() {\n            field.value ?: run { field.value = mutableMapOf() }\n            return field\n        }\n\n    fun postPermissionRequestResult(key: String, value: PermissionResult) {\n        permissionRequestResult.value?.set(key, Event(value))\n        permissionRequestResult.notifyObserver()\n    }\n\n    inline fun observe(\n        owner: LifecycleOwner,\n        key: String,\n        requiresPermission: WeakReference<Fun>,\n        onPermissionDenied: WeakReference<Fun>?,\n        onNeverAskAgain: WeakReference<Fun>?\n    ) {\n        permissionRequestResult.observe(owner, {\n            when (it[key]?.getContentIfNotHandled()) {\n                PermissionResult.GRANTED -> requiresPermission.get()?.invoke()\n                PermissionResult.DENIED -> onPermissionDenied?.get()?.invoke()\n                PermissionResult.DENIED_AND_DISABLED -> onNeverAskAgain?.get()?.invoke()\n                else -> Unit\n            }\n        })\n    }\n\n    fun removeObservers(owner: LifecycleOwner) = permissionRequestResult.removeObservers(owner)\n\n    private fun <T> MutableLiveData<T>.notifyObserver() {\n        this.value = this.value\n    }\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionsRequester.kt",
    "content": "package permissions.dispatcher.ktx\n\n/**\n * An intermediate class that is able to launch permissions request process as appropriate.\n * [launch] method kicks off the actual process.\n */\ninterface PermissionsRequester {\n    fun launch()\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/PermissionsRequesterImpl.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport androidx.fragment.app.FragmentActivity\nimport androidx.lifecycle.ViewModelProvider\nimport permissions.dispatcher.PermissionUtils.shouldShowRequestPermissionRationale\nimport java.lang.ref.WeakReference\n\ninternal class PermissionsRequesterImpl(\n    private val permissions: Array<out String>,\n    private val activity: FragmentActivity,\n    private val onShowRationale: ShowRationaleFun?,\n    private val onPermissionDenied: Fun?,\n    private val requiresPermission: Fun,\n    onNeverAskAgain: Fun?,\n    private val permissionRequestType: PermissionRequestType\n) : PermissionsRequester {\n    private val viewModel = ViewModelProvider(activity).get(PermissionRequestViewModel::class.java)\n    private val requestFun: Fun = {\n        activity.supportFragmentManager\n            .beginTransaction()\n            .replace(android.R.id.content, permissionRequestType.fragment(permissions))\n            .commitAllowingStateLoss()\n    }\n\n    init {\n        viewModel.observe(\n            activity,\n            // https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/729\n            permissions.sortedArray().contentToString(),\n            WeakReference(requiresPermission),\n            WeakReference(onPermissionDenied),\n            WeakReference(onNeverAskAgain)\n        )\n    }\n\n    override fun launch() {\n        if (permissionRequestType.checkPermissions(activity, permissions)) {\n            viewModel.removeObservers(activity)\n            requiresPermission()\n        } else {\n            if (shouldShowRequestPermissionRationale(activity, *permissions) && onShowRationale != null) {\n                onShowRationale.invoke(KtxPermissionRequest.create(onPermissionDenied, requestFun))\n            } else {\n                requestFun.invoke()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ktx/src/main/java/permissions/dispatcher/ktx/TypeAliases.kt",
    "content": "package permissions.dispatcher.ktx\n\nimport permissions.dispatcher.PermissionRequest\n\ninternal typealias Fun = () -> Unit\ninternal typealias ShowRationaleFun = (PermissionRequest) -> Unit\n"
  },
  {
    "path": "ktx/src/test/java/permissions/dispatcher/test/EventTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport junit.framework.Assert.assertEquals\nimport junit.framework.Assert.assertNull\nimport org.junit.Test\nimport permissions.dispatcher.ktx.Event\n\nclass EventTest {\n    @Test\n    fun `getContentIfNotHandled returns null from the second access`() {\n        val testInstance = Event(1)\n        assertEquals(1, testInstance.getContentIfNotHandled())\n        assertNull(testInstance.getContentIfNotHandled())\n        assertNull(testInstance.getContentIfNotHandled())\n    }\n}\n"
  },
  {
    "path": "ktx/src/test/java/permissions/dispatcher/test/KtxPermissionRequestTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport com.nhaarman.mockitokotlin2.mock\nimport com.nhaarman.mockitokotlin2.verify\nimport org.junit.Before\nimport org.junit.Test\nimport org.mockito.Mockito.never\nimport permissions.dispatcher.ktx.*\n\nclass KtxPermissionRequestTest {\n    private lateinit var onPermissionDenied: Fun\n    private lateinit var requiresPermission: Fun\n\n    @Before\n    fun setUp() {\n        onPermissionDenied = mock()\n        requiresPermission = mock()\n    }\n\n    @Test\n    fun `PermissionRequest#proceed invokes requiresPermission`() {\n        val request = KtxPermissionRequest.create(onPermissionDenied, requiresPermission)\n        request.proceed()\n\n        verify(onPermissionDenied, never()).invoke()\n        verify(requiresPermission).invoke()\n    }\n\n    @Test\n    fun `PermissionRequest#cancel invokes onPermissionDenied`() {\n        val request = KtxPermissionRequest.create(onPermissionDenied, requiresPermission)\n        request.cancel()\n\n        verify(onPermissionDenied).invoke()\n        verify(requiresPermission, never()).invoke()\n    }\n}\n"
  },
  {
    "path": "ktx/src/test/java/permissions/dispatcher/test/LocationPermissionTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport org.junit.Assert.*\nimport org.junit.Test\nimport permissions.dispatcher.ktx.LocationPermission\nimport permissions.dispatcher.ktx.filterByApiLevel\n\nclass LocationPermissionTest {\n    @Test\n    fun `BACKGRGROUND should be excluded when sdkVer is less than 29`() {\n        val permissions = LocationPermission.values()\n            .filterByApiLevel(sdkVer = LocationPermission.BACKGROUND.apiLevel - 1)\n        assertEquals(2, permissions.size)\n        assertFalse(permissions.contains(LocationPermission.BACKGROUND.permission))\n    }\n\n    @Test\n    fun `BACKGRGROUND should be included when sdkVer equals to 29`() {\n        val permissions = LocationPermission.values()\n            .filterByApiLevel(sdkVer = LocationPermission.BACKGROUND.apiLevel)\n        assertEquals(3, permissions.size)\n        assertTrue(permissions.contains(LocationPermission.BACKGROUND.permission))\n    }\n\n    @Test\n    fun `BACKGRGROUND should be included when sdkVer is more than 29`() {\n        val permissions = LocationPermission.values()\n            .filterByApiLevel(sdkVer = LocationPermission.BACKGROUND.apiLevel + 1)\n        assertEquals(3, permissions.size)\n        assertTrue(permissions.contains(LocationPermission.BACKGROUND.permission))\n    }\n}\n"
  },
  {
    "path": "ktx/src/test/java/permissions/dispatcher/test/PermissionRequestViewModelTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.LifecycleRegistry\nimport com.nhaarman.mockitokotlin2.mock\nimport com.nhaarman.mockitokotlin2.never\nimport com.nhaarman.mockitokotlin2.verify\nimport com.nhaarman.mockitokotlin2.whenever\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport permissions.dispatcher.ktx.Fun\nimport permissions.dispatcher.ktx.PermissionRequestViewModel\nimport permissions.dispatcher.ktx.PermissionResult\nimport java.lang.ref.WeakReference\n\nclass PermissionRequestViewModelTest {\n    @Rule\n    @JvmField\n    val instantTaskExecutorRule = InstantTaskExecutorRule()\n    private val permission = arrayOf(Manifest.permission.CAMERA).contentToString()\n    private lateinit var viewModel: PermissionRequestViewModel\n    private lateinit var lifecycleOwner: LifecycleOwner\n    private lateinit var requiresPermission: Fun\n    private lateinit var onPermissionDenied: Fun\n    private lateinit var onNeverAskAgain: Fun\n\n    @Before\n    fun setup() {\n        viewModel = PermissionRequestViewModel()\n\n        lifecycleOwner = mock()\n        val lifecycle = LifecycleRegistry(mock())\n        lifecycle.markState(Lifecycle.State.RESUMED)\n        whenever(lifecycleOwner.lifecycle).thenReturn(lifecycle)\n\n        onPermissionDenied = mock()\n        requiresPermission = mock()\n        onNeverAskAgain = mock()\n    }\n\n    @After\n    fun cleanup() {\n        viewModel.removeObservers(lifecycleOwner)\n    }\n\n    @Test\n    fun `GRANTED emits requiresPermission`() {\n        viewModel.observe(\n            lifecycleOwner,\n            permission,\n            WeakReference(requiresPermission),\n            WeakReference(onPermissionDenied),\n            WeakReference(onNeverAskAgain)\n        )\n        viewModel.postPermissionRequestResult(permission, PermissionResult.GRANTED)\n\n        verify(requiresPermission).invoke()\n        verify(onPermissionDenied, never()).invoke()\n        verify(onNeverAskAgain, never()).invoke()\n    }\n\n    @Test\n    fun `DENIED emits onPermissionDenied`() {\n        viewModel.observe(\n            lifecycleOwner,\n            permission,\n            WeakReference(requiresPermission),\n            WeakReference(onPermissionDenied),\n            WeakReference(onNeverAskAgain)\n        )\n        viewModel.postPermissionRequestResult(permission, PermissionResult.DENIED)\n\n        verify(requiresPermission, never()).invoke()\n        verify(onPermissionDenied).invoke()\n        verify(onNeverAskAgain, never()).invoke()\n    }\n\n    @Test\n    fun `DENIED_AND_DISABLED emits onNeverAskAgain`() {\n        viewModel.observe(\n            lifecycleOwner,\n            permission,\n            WeakReference(requiresPermission),\n            WeakReference(onPermissionDenied),\n            WeakReference(onNeverAskAgain)\n        )\n        viewModel.postPermissionRequestResult(permission, PermissionResult.DENIED_AND_DISABLED)\n\n        verify(requiresPermission, never()).invoke()\n        verify(onPermissionDenied, never()).invoke()\n        verify(onNeverAskAgain).invoke()\n    }\n}\n"
  },
  {
    "path": "ktx/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker",
    "content": "mock-maker-inline"
  },
  {
    "path": "ktx-sample/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "ktx-sample/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion COMPILE_SDK_VERSION\n    defaultConfig {\n        applicationId \"permissions.dispatcher.sample\"\n        targetSdkVersion TARGET_SDK_VERSION\n        minSdkVersion SAMPLE_MIN_SDK_VERSION\n        versionCode 1\n        versionName \"1.0\"\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION\"\n    implementation \"androidx.appcompat:appcompat:$ANDROIDX_LIBRARY_VERSION\"\n    implementation project(':ktx')\n}\n"
  },
  {
    "path": "ktx-sample/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"permissions.dispatcher.ktx.sample\">\n\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n    <application\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\"\n        tools:ignore=\"GoogleAppIndexingWarning\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "ktx-sample/src/main/java/permissions/dispatcher/ktx/sample/MainActivity.kt",
    "content": "package permissions.dispatcher.ktx.sample\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\n\nclass MainActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        if (savedInstanceState == null) {\n            val fragment = MainFragment()\n            supportFragmentManager.beginTransaction()\n                .replace(R.id.container, fragment)\n                .commitNowAllowingStateLoss()\n        }\n    }\n}\n"
  },
  {
    "path": "ktx-sample/src/main/java/permissions/dispatcher/ktx/sample/MainFragment.kt",
    "content": "package permissions.dispatcher.ktx.sample\n\nimport android.Manifest\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Environment\nimport android.provider.MediaStore\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.Toast\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AlertDialog\nimport androidx.fragment.app.Fragment\nimport permissions.dispatcher.PermissionRequest\nimport permissions.dispatcher.ktx.PermissionsRequester\nimport permissions.dispatcher.ktx.constructPermissionsRequest\n\nclass MainFragment : Fragment() {\n    private lateinit var permissionsRequester: PermissionsRequester\n    private lateinit var fileManagerRequester: PermissionsRequester\n\n    override fun onAttach(context: Context?) {\n        super.onAttach(context)\n        permissionsRequester = constructPermissionsRequest(\n            Manifest.permission.CAMERA,\n            onShowRationale = ::onCameraShowRationale,\n            onPermissionDenied = ::onCameraDenied,\n            onNeverAskAgain = ::onCameraNeverAskAgain,\n            requiresPermission = ::openCamera\n        )\n        fileManagerRequester = constructPermissionsRequest(\n            Manifest.permission.READ_EXTERNAL_STORAGE,\n            requiresPermission = ::openFileManager\n        )\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? = inflater.inflate(R.layout.fragment_main, container, false)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        view.findViewById<Button>(R.id.button_camera).setOnClickListener {\n            permissionsRequester.launch()\n        }\n        view.findViewById<Button>(R.id.button_file_manager).setOnClickListener {\n            fileManagerRequester.launch()\n        }\n    }\n\n    private fun openCamera() {\n        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, Environment.DIRECTORY_DOWNLOADS + \"/temp.png\")\n        startActivityForResult(intent, 1)\n    }\n\n    private fun openFileManager() {\n        val intent = Intent().setAction(Intent.ACTION_GET_CONTENT)\n        startActivityForResult(Intent.createChooser(intent, \"Choose file\"), 2)\n    }\n\n    private fun onCameraDenied() {\n        Toast.makeText(requireContext(), R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun onCameraShowRationale(request: PermissionRequest) {\n        // NOTE: Show a rationale to explain why the permission is needed, e.g. with a dialog.\n        // Call proceed() or cancel() on the provided PermissionRequest to continue or abort\n        showRationaleDialog(R.string.permission_camera_rationale, request)\n    }\n\n    private fun onCameraNeverAskAgain() {\n        Toast.makeText(requireContext(), R.string.permission_camera_never_ask_again, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun showRationaleDialog(@StringRes messageResId: Int, request: PermissionRequest) {\n        AlertDialog.Builder(requireContext())\n            .setPositiveButton(R.string.button_allow) { _, _ -> request.proceed() }\n            .setNegativeButton(R.string.button_deny) { _, _ -> request.cancel() }\n            .setCancelable(false)\n            .setMessage(messageResId)\n            .show()\n    }\n}\n"
  },
  {
    "path": "ktx-sample/src/main/res/layout/activity_main.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\" />\n"
  },
  {
    "path": "ktx-sample/src/main/res/layout/fragment_camera.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <Button\n        android:id=\"@+id/back\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:text=\"@string/back\" />\n\n    <FrameLayout\n        android:id=\"@+id/camera_preview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n</LinearLayout>"
  },
  {
    "path": "ktx-sample/src/main/res/layout/fragment_main.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/vertical_page_margin\"\n    android:paddingLeft=\"@dimen/horizontal_page_margin\"\n    android:paddingRight=\"@dimen/horizontal_page_margin\"\n    android:paddingTop=\"@dimen/vertical_page_margin\"\n    tools:context=\".MainActivity\">\n\n    <Button\n        android:id=\"@+id/button_camera\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/show_camera\" />\n\n    <Button\n        android:id=\"@+id/button_file_manager\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/open_file_manager\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "ktx-sample/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"margin_medium\">16dp</dimen>\n    <dimen name=\"horizontal_page_margin\">@dimen/margin_medium</dimen>\n    <dimen name=\"vertical_page_margin\">@dimen/margin_medium</dimen>\n</resources>\n"
  },
  {
    "path": "ktx-sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">PermissionsDispatcher Sample</string>\n    <string name=\"back\">Back</string>\n    <string name=\"button_allow\">Allow</string>\n    <string name=\"button_deny\">Deny</string>\n\n    <string name=\"contacts_string\">Total number of contacts: %1$d\\nFirst contact:<b>%2$s</b></string>\n    <string name=\"contacts_empty\">Contacts not loaded.</string>\n\n    <string name=\"show_camera\">Show camera preview</string>\n    <string name=\"open_file_manager\">Open file manager</string>\n\n    <string name=\"permission_camera_rationale\">Camera permission is needed to show the camera preview.</string>\n    <string name=\"permission_camera_denied\">Camera permission was denied. Please consider granting it in order to access the camera!</string>\n    <string name=\"permission_camera_never_ask_again\">Camera permission was denied with never ask again.</string>\n</resources>\n"
  },
  {
    "path": "ktx-sample/src/main/res/values/template-styles.xml",
    "content": "<resources>\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\" />\n</resources>\n"
  },
  {
    "path": "library/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: \"com.vanniktech.maven.publish\"\n\nandroid {\n    compileSdkVersion COMPILE_SDK_VERSION\n    defaultConfig {\n        minSdkVersion MIN_SDK_VERSION\n        targetSdkVersion TARGET_SDK_VERSION\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_6\n        targetCompatibility JavaVersion.VERSION_1_6\n    }\n\n    packagingOptions {\n        exclude 'META-INF/services/javax.annotation.processing.Processor'\n    }\n\n    libraryVariants.all {\n        it.generateBuildConfigProvider.configure { enabled = false }\n    }\n}\n\nconfigurations {\n    lintChecks\n}\n\ndependencies {\n    implementation \"androidx.core:core:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.fragment:fragment:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.collection:collection:$ANDROIDX_LIBRARY_VERSION\"\n\n    testImplementation \"junit:junit:$JUNIT_VERSION\"\n    testImplementation \"org.mockito:mockito-core:$MOCKITO_VERSION\"\n    testImplementation \"org.powermock:powermock-api-mockito2:$POWERMOCK_VERSION\"\n    testImplementation \"org.powermock:powermock-module-junit4:$POWERMOCK_VERSION\"\n\n    api project(path: ':annotation')\n    lintChecks project(path: ':lint', configuration: 'lintChecks')\n}\n\ntask copyLintJar(type: Copy) {\n    from(configurations.lintChecks) {\n        rename { 'lint.jar' }\n    }\n    into 'build/intermediates/lint/'\n}\n\nproject.afterEvaluate {\n    def compileLintTask = project.tasks.find { it.name == 'compileLint' }\n    compileLintTask.dependsOn(copyLintJar)\n}\n"
  },
  {
    "path": "library/gradle.properties",
    "content": "POM_NAME        = permissionsdispatcher\nPOM_ARTIFACT_ID = permissionsdispatcher\nPOM_PACKAGING   = aar\n"
  },
  {
    "path": "library/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"permissions.dispatcher\"/>\n"
  },
  {
    "path": "library/src/main/java/permissions/dispatcher/PermissionUtils.java",
    "content": "package permissions.dispatcher;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\n\nimport androidx.collection.SimpleArrayMap;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.Fragment;\n\npublic final class PermissionUtils {\n    // Map of dangerous permissions introduced in later framework versions.\n    // Used to conditionally bypass permission-hold checks on older devices.\n    // ref: https://developer.android.com/reference/android/Manifest.permission\n    private static final SimpleArrayMap<String, Integer> MIN_SDK_PERMISSIONS;\n\n    static {\n        MIN_SDK_PERMISSIONS = new SimpleArrayMap<String, Integer>(13);\n        MIN_SDK_PERMISSIONS.put(\"com.android.voicemail.permission.ADD_VOICEMAIL\", 14);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.READ_CALL_LOG\", 16);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.READ_EXTERNAL_STORAGE\", 16);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.WRITE_CALL_LOG\", 16);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.BODY_SENSORS\", 20);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.SYSTEM_ALERT_WINDOW\", 23);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.WRITE_SETTINGS\", 23);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.READ_PHONE_NUMBERS\", 26);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.ANSWER_PHONE_CALLS\", 26);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.ACCEPT_HANDOVER\", 28);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.ACTIVITY_RECOGNITION\", 29);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.ACCESS_MEDIA_LOCATION\", 29);\n        MIN_SDK_PERMISSIONS.put(\"android.permission.ACCESS_BACKGROUND_LOCATION\", 29);\n    }\n\n    private PermissionUtils() {\n    }\n\n    /**\n     * Checks all given permissions have been granted.\n     *\n     * @param grantResults results\n     * @return returns true if all permissions have been granted.\n     */\n    public static boolean verifyPermissions(int... grantResults) {\n        if (grantResults.length == 0) {\n            return false;\n        }\n        for (int result : grantResults) {\n            if (result != PackageManager.PERMISSION_GRANTED) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Returns true if the permission exists in this SDK version\n     *\n     * @param permission permission\n     * @return returns true if the permission exists in this SDK version\n     */\n    private static boolean permissionExists(String permission) {\n        // Check if the permission could potentially be missing on this device\n        Integer minVersion = MIN_SDK_PERMISSIONS.get(permission);\n        // If null was returned from the above call, there is no need for a device API level check for the permission;\n        // otherwise, we check if its minimum API level requirement is met\n        return minVersion == null || Build.VERSION.SDK_INT >= minVersion;\n    }\n\n    /**\n     * Returns true if the Activity or Fragment has access to all given permissions.\n     *\n     * @param context     context\n     * @param permissions permission list\n     * @return returns true if the Activity or Fragment has access to all given permissions.\n     */\n    public static boolean hasSelfPermissions(Context context, String... permissions) {\n        for (String permission : permissions) {\n            if (permissionExists(permission) && !hasSelfPermission(context, permission)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Determine context has access to the given permission.\n     * <p>\n     * This is a workaround for RuntimeException of Parcel#readException.\n     * For more detail, check this issue https://github.com/hotchemi/PermissionsDispatcher/issues/107\n     *\n     * @param context    context\n     * @param permission permission\n     * @return true if context has access to the given permission, false otherwise.\n     * @see #hasSelfPermissions(Context, String...)\n     */\n    private static boolean hasSelfPermission(Context context, String permission) {\n        try {\n            return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;\n        } catch (RuntimeException t) {\n            return false;\n        }\n    }\n\n    /**\n     * Checks given permissions are needed to show rationale.\n     *\n     * @param activity    activity\n     * @param permissions permission list\n     * @return returns true if one of the permission is needed to show rationale.\n     */\n    public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) {\n        for (String permission : permissions) {\n            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Checks given permissions are needed to show rationale.\n     *\n     * @param fragment    fragment\n     * @param permissions permission list\n     * @return returns true if one of the permission is needed to show rationale.\n     */\n    public static boolean shouldShowRequestPermissionRationale(Fragment fragment, String... permissions) {\n        for (String permission : permissions) {\n            if (fragment.shouldShowRequestPermissionRationale(permission)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "library/src/test/java/permissions/dispatcher/ApiLevelTestSuite.java",
    "content": "package permissions.dispatcher;\n\nimport android.Manifest;\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.os.Build;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.BDDMockito;\nimport org.mockito.Mockito;\nimport org.powermock.api.mockito.PowerMockito;\nimport org.powermock.core.classloader.annotations.PrepareForTest;\nimport org.powermock.modules.junit4.PowerMockRunner;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\n\nimport androidx.core.content.PermissionChecker;\n\nimport static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;\nimport static android.os.Build.VERSION_CODES.JELLY_BEAN;\nimport static android.os.Build.VERSION_CODES.KITKAT_WATCH;\nimport static android.os.Build.VERSION_CODES.O;\nimport static android.os.Build.VERSION_CODES.P;\nimport static android.os.Build.VERSION_CODES.Q;\nimport static junit.framework.Assert.assertEquals;\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Matchers.anyString;\n\n/**\n * Test suite related to permissions that were added to Android at a later point in the platform's lifecycle.\n */\n@RunWith(PowerMockRunner.class)\n@PrepareForTest({PermissionChecker.class})\n@SuppressLint(\"NewApi\")\npublic class ApiLevelTestSuite {\n\n    private static final int MOST_RECENT_API_LEVEL = Build.VERSION_CODES.M;\n    private static final int NEEDS_PERMISSION_CHECK = 1024;\n\n    private final Context mockContext;\n\n    public ApiLevelTestSuite() {\n        // Mock out Context\n        mockContext = Mockito.mock(Context.class);\n    }\n\n    @Before\n    public void beforeTest() throws Exception {\n        // Reset the API level assumption\n        this.resetApiLevel();\n\n        // Mock out PermissionChecker, so that \"checkSelfPermission\"\n        // always returns NEEDS_PERMISSION_CHECK.\n        // This way, we can distinguish between auto-grants and permission-checks\n        PowerMockito.mockStatic(PermissionChecker.class);\n        BDDMockito.given(PermissionChecker.checkSelfPermission(any(Context.class), anyString())).willReturn(NEEDS_PERMISSION_CHECK);\n    }\n\n    @Test\n    public void testAssumeApiLevelWorking() throws Exception {\n        // Check that manually setting the API level to a value works\n        assumeApiLevel(ICE_CREAM_SANDWICH);\n        assertEquals(ICE_CREAM_SANDWICH, Build.VERSION.SDK_INT);\n\n        // Check that resetting the API level works\n        resetApiLevel();\n        assertEquals(0, Build.VERSION.SDK_INT);\n    }\n\n    @Test\n    public void testCheckSelfPermissionMockWorking() throws Exception {\n        // Check that mocking out PermissionChecker works\n        assertEquals(NEEDS_PERMISSION_CHECK, PermissionChecker.checkSelfPermission(mockContext, \"permission\"));\n    }\n\n    @Test\n    public void testAddVoicemailPermission() throws Exception {\n        // ADD_VOICEMAIL:\n        // Added in API level 14 (\"Ice Cream Sandwich\")\n        iteratePermissionCheck(Manifest.permission.ADD_VOICEMAIL, ICE_CREAM_SANDWICH);\n    }\n\n    @Test\n    public void testBodySensorsPermission() throws Exception {\n        // BODY_SENSORS:\n        // Added in API level 20 (\"KitKat Watch\")\n        iteratePermissionCheck(Manifest.permission.BODY_SENSORS, KITKAT_WATCH);\n    }\n\n    @Test\n    public void testReadCallLogPermission() throws Exception {\n        // READ_CALL_LOG:\n        // Added in API level 16 (\"Jelly Bean\")\n        iteratePermissionCheck(Manifest.permission.READ_CALL_LOG, JELLY_BEAN);\n    }\n\n    @Test\n    public void testReadExternalStoragePermission() throws Exception {\n        // READ_EXTERNAL_STORAGE:\n        // Added in API level 16 (\"Jelly Bean\")\n        iteratePermissionCheck(Manifest.permission.READ_EXTERNAL_STORAGE, JELLY_BEAN);\n    }\n\n    @Test\n    public void testWriteCallLogPermission() throws Exception {\n        // WRITE_CALL_LOG:\n        // Added in API level 16 (\"Jelly Bean\")\n        iteratePermissionCheck(Manifest.permission.WRITE_CALL_LOG, JELLY_BEAN);\n    }\n\n    @Test\n    public void testBodySensors() throws Exception {\n        iteratePermissionCheck(Manifest.permission.BODY_SENSORS, KITKAT_WATCH);\n    }\n\n    @Test\n    public void testReadPhoneNumbers() throws Exception {\n        iteratePermissionCheck(Manifest.permission.READ_PHONE_NUMBERS, O);\n    }\n\n    @Test\n    public void testAnswerPhoneNumbers() throws Exception {\n        iteratePermissionCheck(Manifest.permission.ANSWER_PHONE_CALLS, O);\n    }\n\n    @Test\n    public void testAcceptHandOver() throws Exception {\n        iteratePermissionCheck(Manifest.permission.ACCEPT_HANDOVER, P);\n    }\n\n    @Test\n    public void testActivityRecognition() throws Exception {\n        iteratePermissionCheck(Manifest.permission.ACTIVITY_RECOGNITION, Q);\n    }\n\n    @Test\n    public void testAccessMediaLocation() throws Exception {\n        iteratePermissionCheck(Manifest.permission.ACCESS_MEDIA_LOCATION, Q);\n    }\n\n    @Test\n    public void testAccessBackgroundLocation() throws Exception {\n        iteratePermissionCheck(Manifest.permission.ACCESS_BACKGROUND_LOCATION, Q);\n    }\n\n    /* Begin private */\n\n    private void iteratePermissionCheck(String permission, int permissionMinLevel) throws Exception {\n        for (int apiLevel = 0; apiLevel <= MOST_RECENT_API_LEVEL; apiLevel++) {\n            // Adjust the current API level\n            assumeApiLevel(apiLevel);\n\n            // Iterate over all API levels and verify that the permission is auto-granted\n            // below the minimum available level. For all other API levels, the permission\n            // shouldn't be auto-granted.\n            boolean shouldAutoGrantPermission = apiLevel < permissionMinLevel;\n            boolean hasPermission = PermissionUtils.hasSelfPermissions(mockContext, permission);\n\n            if (shouldAutoGrantPermission != hasPermission) {\n                // Mismatch, because the permission shouldn't be granted because the API level requires a check,\n                // OR the permission should be granted because it doesn't exist on the current API level\n                throw new AssertionError(permission + \" check on API level \" + apiLevel + \" shouldn't return auto-grant=\" + shouldAutoGrantPermission + \" amd has-permission=\" + hasPermission);\n            }\n        }\n    }\n\n    private void assumeApiLevel(int apiLevel) throws Exception {\n        // Adjust the value of Build.VERSION.SDK_INT statically using reflection\n        Field sdkIntField = Build.VERSION.class.getDeclaredField(\"SDK_INT\");\n        sdkIntField.setAccessible(true);\n\n        // Temporarily remove the SDK_INT's \"final\" modifier\n        Field modifiersField = Field.class.getDeclaredField(\"modifiers\");\n        modifiersField.setAccessible(true);\n        modifiersField.setInt(sdkIntField, sdkIntField.getModifiers() & ~Modifier.FINAL);\n\n        // Update the SDK_INT value, re-finalize the field, and lock it again\n        sdkIntField.set(null, apiLevel);\n        modifiersField.setInt(sdkIntField, sdkIntField.getModifiers() | Modifier.FINAL);\n        sdkIntField.setAccessible(false);\n    }\n\n    private void resetApiLevel() throws Exception {\n        this.assumeApiLevel(0);\n    }\n}"
  },
  {
    "path": "lint/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "lint/build.gradle",
    "content": "apply plugin: 'java'\napply plugin: 'kotlin'\n\ntargetCompatibility = JavaVersion.VERSION_1_6\nsourceCompatibility = JavaVersion.VERSION_1_6\n\nconfigurations {\n    lintChecks\n}\n\ndependencies {\n    implementation \"com.android.tools.lint:lint-api:$LINT_VERSION\"\n    implementation \"com.android.tools.lint:lint-checks:$LINT_VERSION\"\n    implementation \"com.android.tools.lint:lint:$LINT_VERSION\"\n\n    implementation \"androidx.core:core:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"androidx.fragment:fragment:$ANDROIDX_LIBRARY_VERSION\"\n\n    testImplementation \"junit:junit:$JUNIT_VERSION\"\n    testImplementation \"com.android.tools.lint:lint-tests:$LINT_VERSION\"\n    testImplementation \"com.android.tools:testutils:$LINT_VERSION\"\n\n    lintChecks files(jar)\n}\n\njar {\n    manifest {\n        attributes(\"Lint-Registry-v2\": \"permissions.dispatcher.PermissionsDispatcherIssueRegistry\")\n    }\n}\n"
  },
  {
    "path": "lint/src/main/java/permissions/dispatcher/CallNeedsPermissionDetector.java",
    "content": "package permissions.dispatcher;\n\nimport com.android.tools.lint.client.api.UElementHandler;\nimport com.android.tools.lint.detector.api.Category;\nimport com.android.tools.lint.detector.api.Detector;\nimport com.android.tools.lint.detector.api.Implementation;\nimport com.android.tools.lint.detector.api.Issue;\nimport com.android.tools.lint.detector.api.JavaContext;\nimport com.android.tools.lint.detector.api.Scope;\nimport com.android.tools.lint.detector.api.Severity;\n\nimport org.jetbrains.annotations.NotNull;\nimport org.jetbrains.annotations.Nullable;\nimport org.jetbrains.uast.UAnnotation;\nimport org.jetbrains.uast.UCallExpression;\nimport org.jetbrains.uast.UClass;\nimport org.jetbrains.uast.UElement;\nimport org.jetbrains.uast.UFile;\nimport org.jetbrains.uast.UMethod;\nimport org.jetbrains.uast.visitor.AbstractUastVisitor;\n\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\npublic final class CallNeedsPermissionDetector extends Detector implements Detector.UastScanner {\n\n    private static final String COLON = \":\";\n\n    static final Issue ISSUE = Issue.create(\"CallNeedsPermission\",\n            \"Call the corresponding \\\"WithPermissionCheck\\\" method of the generated PermissionsDispatcher class instead\",\n            \"Directly invoking a method annotated with @NeedsPermission may lead to misleading behaviour on devices running Marshmallow and up. Therefore, it is advised to use the generated PermissionsDispatcher class instead, which provides a \\\"WithPermissionCheck\\\" method that safely handles runtime permissions.\",\n            Category.CORRECTNESS,\n            7,\n            Severity.ERROR,\n            new Implementation(CallNeedsPermissionDetector.class, EnumSet.of(Scope.ALL_JAVA_FILES)));\n\n    private static Set<String> annotatedMethods = new HashSet<String>();\n\n    @Override\n    public List<Class<? extends UElement>> getApplicableUastTypes() {\n        return Collections.<Class<? extends UElement>>singletonList(UClass.class);\n    }\n\n    @Override\n    public UElementHandler createUastHandler(@NotNull final JavaContext context) {\n        return new UElementHandler() {\n            @Override\n            public void visitClass(@NotNull UClass node) {\n                node.accept(new AnnotationChecker(context));\n            }\n        };\n    }\n\n    private static class AnnotationChecker extends AbstractUastVisitor {\n\n        private final JavaContext context;\n\n        private boolean hasRuntimePermissionAnnotation;\n\n        private AnnotationChecker(JavaContext context) {\n            this.context = context;\n        }\n\n        @Override\n        public boolean visitAnnotation(@NotNull UAnnotation node) {\n            if (!\"permissions.dispatcher.RuntimePermissions\".equals(node.getQualifiedName())) {\n                return true;\n            }\n            hasRuntimePermissionAnnotation = true;\n            return true;\n        }\n\n        @Override\n        public boolean visitCallExpression(@NotNull UCallExpression node) {\n            if (isGeneratedFiles(context) || !hasRuntimePermissionAnnotation) {\n                return true;\n            }\n            if (node.getReceiver() == null && annotatedMethods.contains(methodIdentifier(node))) {\n                context.report(ISSUE, node, context.getLocation(node), \"Trying to access permission-protected method directly\");\n            }\n            return true;\n        }\n\n        /**\n         * Generate method identifier from method information.\n         *\n         * @param node UCallExpression\n         * @return className + methodName + parametersType\n         */\n        @Nullable\n        private static String methodIdentifier(@NotNull UCallExpression node) {\n            UElement element = node.getUastParent();\n            while (element != null) {\n                if (element instanceof UClass) {\n                    break;\n                }\n                element = element.getUastParent();\n            }\n            UClass uClass = (UClass) element;\n            if (uClass == null || node.getMethodName() == null) {\n                return null;\n            }\n            return uClass.getName() + COLON + node.getMethodName();\n        }\n\n        @Override\n        public boolean visitMethod(@NotNull UMethod node) {\n            if (isGeneratedFiles(context)) {\n                return super.visitMethod(node);\n            }\n            UAnnotation annotation = node.findAnnotation(\"permissions.dispatcher.NeedsPermission\");\n            if (annotation == null) {\n                return super.visitMethod(node);\n            }\n            String methodIdentifier = methodIdentifier(node);\n            if (methodIdentifier == null) {\n                return super.visitMethod(node);\n            }\n            annotatedMethods.add(methodIdentifier);\n            return super.visitMethod(node);\n        }\n\n        /**\n         * Generate method identifier from method information.\n         *\n         * @param node UMethod\n         * @return className + methodName + parametersType\n         */\n        @Nullable\n        private static String methodIdentifier(@NotNull UMethod node) {\n            UElement parent = node.getUastParent();\n            if (!(parent instanceof UClass)) {\n                return null;\n            }\n            UClass uClass = (UClass) parent;\n            return uClass.getName() + COLON + node.getName();\n        }\n\n        private static boolean isGeneratedFiles(JavaContext context) {\n            UFile sourceFile = context.getUastFile();\n            if (sourceFile == null) {\n                return false;\n            }\n            List<UClass> classes = sourceFile.getClasses();\n            if (classes.isEmpty()) {\n                return false;\n            }\n            String qualifiedName = classes.get(0).getName();\n            return qualifiedName != null && qualifiedName.contains(\"PermissionsDispatcher\");\n        }\n    }\n}\n"
  },
  {
    "path": "lint/src/main/java/permissions/dispatcher/CallOnRequestPermissionsResultDetector.java",
    "content": "package permissions.dispatcher;\n\nimport androidx.annotation.Nullable;\n\nimport com.android.tools.lint.client.api.UElementHandler;\nimport com.android.tools.lint.detector.api.Category;\nimport com.android.tools.lint.detector.api.Detector;\nimport com.android.tools.lint.detector.api.Implementation;\nimport com.android.tools.lint.detector.api.Issue;\nimport com.android.tools.lint.detector.api.JavaContext;\nimport com.android.tools.lint.detector.api.Scope;\nimport com.android.tools.lint.detector.api.Severity;\nimport com.intellij.psi.PsiElement;\n\nimport org.jetbrains.uast.UAnnotation;\nimport org.jetbrains.uast.UBlockExpression;\nimport org.jetbrains.uast.UClass;\nimport org.jetbrains.uast.UElement;\nimport org.jetbrains.uast.UExpression;\nimport org.jetbrains.uast.UMethod;\nimport org.jetbrains.uast.UQualifiedReferenceExpression;\nimport org.jetbrains.uast.kotlin.KotlinUFunctionCallExpression;\nimport org.jetbrains.uast.kotlin.KotlinUImplicitReturnExpression;\nimport org.jetbrains.uast.kotlin.KotlinUQualifiedReferenceExpression;\nimport org.jetbrains.uast.visitor.AbstractUastVisitor;\n\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.List;\n\npublic final class CallOnRequestPermissionsResultDetector extends Detector implements Detector.UastScanner {\n\n    static final Issue ISSUE = Issue.create(\"NeedOnRequestPermissionsResult\",\n            \"Call the \\\"onRequestPermissionsResult\\\" method of the generated PermissionsDispatcher class in the respective method of your Activity or Fragment\",\n            \"You are required to inform the generated PermissionsDispatcher class about the results of a permission request. In your class annotated with @RuntimePermissions, override the \\\"onRequestPermissionsResult\\\" method and call through to the generated PermissionsDispatcher method with the same name.\",\n            Category.CORRECTNESS,\n            5,\n            Severity.ERROR,\n            new Implementation(CallOnRequestPermissionsResultDetector.class,\n                    EnumSet.of(Scope.JAVA_FILE)));\n\n    @Override\n    public List<Class<? extends UElement>> getApplicableUastTypes() {\n        return Collections.<Class<? extends UElement>>singletonList(UClass.class);\n    }\n\n    @Override\n    public UElementHandler createUastHandler(final JavaContext context) {\n        return new UElementHandler() {\n            @Override\n            public void visitClass(UClass node) {\n                node.accept(new OnRequestPermissionsResultChecker(context, node));\n            }\n        };\n    }\n\n    private static class OnRequestPermissionsResultChecker extends AbstractUastVisitor {\n\n        private final JavaContext context;\n\n        private final String className;\n\n        private final boolean isKotlin;\n\n        private boolean hasRuntimePermissionAnnotation;\n\n\n        private OnRequestPermissionsResultChecker(JavaContext context, UClass klass) {\n            this.context = context;\n            this.className = klass.getName();\n            isKotlin = context.getPsiFile() != null && \"kotlin\".equals(context.getPsiFile().getLanguage().getID());\n        }\n\n        @Override\n        public boolean visitAnnotation(UAnnotation node) {\n            if (!\"permissions.dispatcher.RuntimePermissions\".equals(node.getQualifiedName())) {\n                return true;\n            }\n            hasRuntimePermissionAnnotation = true;\n            return true;\n        }\n\n        @Override\n        public boolean visitMethod(UMethod node) {\n            if (!hasRuntimePermissionAnnotation) {\n                return true;\n            }\n            if (!\"onRequestPermissionsResult\".equals(node.getName())) {\n                return true;\n            }\n            if (hasRuntimePermissionAnnotation && !isGeneratedMethodCalled(node, className, isKotlin)) {\n                context.report(ISSUE, context.getLocation(node), \"Generated onRequestPermissionsResult method not called\");\n            }\n            return true;\n        }\n\n        private static boolean assertMethodName(@Nullable String name) {\n            return \"onRequestPermissionsResult\".equals(name);\n        }\n\n        private static boolean isGeneratedMethodCalled(UMethod method, String className, boolean isKotlin) {\n            UExpression methodBody = method.getUastBody();\n            if (methodBody == null) {\n                return false;\n            }\n            if (methodBody instanceof UBlockExpression) {\n                UBlockExpression methodBodyExpression = (UBlockExpression) methodBody;\n                List<UExpression> expressions = methodBodyExpression.getExpressions();\n                for (UExpression expression : expressions) {\n                    if (isKotlin && expression instanceof KotlinUFunctionCallExpression) {\n                        KotlinUFunctionCallExpression functionalExpression = (KotlinUFunctionCallExpression) expression;\n                        return assertMethodName(functionalExpression.getMethodName());\n                    } else if (isKotlin && expression instanceof KotlinUImplicitReturnExpression) {\n                        KotlinUImplicitReturnExpression returnExpression =\n                                (KotlinUImplicitReturnExpression) expression;\n                        UExpression uExpression = returnExpression.returnExpression;\n                        if (uExpression instanceof KotlinUFunctionCallExpression) {\n                            KotlinUFunctionCallExpression uFunctionCallExpression =\n                                    (KotlinUFunctionCallExpression) uExpression;\n                            return assertMethodName(uFunctionCallExpression.getMethodName());\n                        }\n                    }\n\n                    if (!(expression instanceof UQualifiedReferenceExpression)) {\n                        continue;\n                    }\n\n                    UQualifiedReferenceExpression referenceExpression = (UQualifiedReferenceExpression) expression;\n                    UExpression receiverExpression = referenceExpression.getReceiver();\n                    PsiElement receiverPsi = receiverExpression.getPsi();\n                    if (receiverPsi == null) {\n                        continue; // can this case be happened?\n                    }\n                    String receiverName = receiverPsi.getText();\n                    if (\"super\".equals(receiverName)) {\n                        // skip super method call\n                        continue;\n                    }\n\n                    if (isKotlin && referenceExpression instanceof KotlinUQualifiedReferenceExpression) {\n                        return assertMethodName(referenceExpression.getResolvedName());\n                    } else {\n                        String targetClassName = className + \"PermissionsDispatcher\";\n                        if (targetClassName.equals(receiverName) && assertMethodName(referenceExpression.getResolvedName())) {\n                            return true;\n                        }\n                    }\n                }\n            }\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "lint/src/main/java/permissions/dispatcher/NoCorrespondingNeedsPermissionDetector.java",
    "content": "package permissions.dispatcher;\n\nimport com.android.tools.lint.client.api.UElementHandler;\nimport com.android.tools.lint.detector.api.Category;\nimport com.android.tools.lint.detector.api.Detector;\nimport com.android.tools.lint.detector.api.Implementation;\nimport com.android.tools.lint.detector.api.Issue;\nimport com.android.tools.lint.detector.api.JavaContext;\nimport com.android.tools.lint.detector.api.Scope;\nimport com.android.tools.lint.detector.api.Severity;\n\nimport org.jetbrains.uast.UAnnotation;\nimport org.jetbrains.uast.UClass;\nimport org.jetbrains.uast.UElement;\nimport org.jetbrains.uast.UNamedExpression;\nimport org.jetbrains.uast.visitor.AbstractUastVisitor;\n\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\npublic final class NoCorrespondingNeedsPermissionDetector extends Detector implements Detector.UastScanner {\n\n    static final Issue ISSUE = Issue.create(\"NoCorrespondingNeedsPermission\",\n            \"The method annotated with @OnShowRationale has no corresponding @NeedsPermission method, and will therefore be ignored by PermissionsDispatcher\",\n            \"The @OnShowRationale method with a certain signature is internally connected to another method annotated with @NeedsPermission and the same annotation value. Please ensure that there is a @NeedsPermission method with matching annotation values for this method.\",\n            Category.CORRECTNESS,\n            4,\n            Severity.ERROR,\n            new Implementation(NoCorrespondingNeedsPermissionDetector.class,\n                    EnumSet.of(Scope.JAVA_FILE)));\n\n    @Override\n    public List<Class<? extends UElement>> getApplicableUastTypes() {\n        return Collections.<Class<? extends UElement>>singletonList(UClass.class);\n    }\n\n    @Override\n    public UElementHandler createUastHandler(final JavaContext context) {\n        return new UElementHandler() {\n            @Override public void visitClass(UClass node) {\n                node.accept(new AnnotationChecker(context));\n            }\n        };\n    }\n\n    private static class AnnotationChecker extends AbstractUastVisitor {\n\n        private final JavaContext context;\n\n        private final Set<UAnnotation> needsPermissionAnnotations;\n\n        private final Set<UAnnotation> onShowRationaleAnnotations;\n\n        private AnnotationChecker(JavaContext context) {\n            this.context = context;\n            needsPermissionAnnotations = new HashSet<UAnnotation>();\n            onShowRationaleAnnotations = new HashSet<UAnnotation>();\n        }\n\n        @Override\n        public boolean visitAnnotation(UAnnotation node) {\n            if (!context.isEnabled(ISSUE)) {\n                return true;\n            }\n            // Let's store NeedsPermission and OnShowRationale\n            String type = node.getQualifiedName();\n            if (\"permissions.dispatcher.NeedsPermission\".equals(type)) {\n                needsPermissionAnnotations.add(node);\n            } else if (\"permissions.dispatcher.OnShowRationale\".equals(type)) {\n                onShowRationaleAnnotations.add(node);\n            }\n            if (onShowRationaleAnnotations.isEmpty()) {\n                return true;\n            }\n            return true;\n        }\n\n        @Override\n        public void afterVisitClass(UClass node) {\n            // If there is OnShowRationale, find corresponding NeedsPermission\n            for (UAnnotation onShowRationaleAnnotation : onShowRationaleAnnotations) {\n                boolean found = false;\n                for (UAnnotation needsPermissionAnnotation : needsPermissionAnnotations) {\n                    if (hasSameNodes(onShowRationaleAnnotation.getAttributeValues(), needsPermissionAnnotation.getAttributeValues())) {\n                        found = true;\n                    }\n                }\n                if (!found) {\n                    context.report(ISSUE, context.getLocation(onShowRationaleAnnotation), \"Useless @OnShowRationale declaration\");\n                }\n            }\n        }\n\n        private static boolean hasSameNodes(List<UNamedExpression> first, List<UNamedExpression> second) {\n            if (first.size() != second.size()) {\n                return false;\n            }\n            for (int i = 0, size = first.size(); i < size; i++) {\n                if (!first.get(i).toString().equals(second.get(i).toString())) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "lint/src/main/java/permissions/dispatcher/NoDelegateOnResumeDetector.java",
    "content": "package permissions.dispatcher;\n\nimport com.android.tools.lint.client.api.UElementHandler;\nimport com.android.tools.lint.detector.api.Category;\nimport com.android.tools.lint.detector.api.Detector;\nimport com.android.tools.lint.detector.api.Implementation;\nimport com.android.tools.lint.detector.api.Issue;\nimport com.android.tools.lint.detector.api.JavaContext;\nimport com.android.tools.lint.detector.api.Scope;\nimport com.android.tools.lint.detector.api.Severity;\nimport com.intellij.psi.PsiType;\n\nimport org.jetbrains.annotations.NotNull;\nimport org.jetbrains.uast.UCallExpression;\nimport org.jetbrains.uast.UClass;\nimport org.jetbrains.uast.UElement;\nimport org.jetbrains.uast.UExpression;\nimport org.jetbrains.uast.UIdentifier;\nimport org.jetbrains.uast.UMethod;\nimport org.jetbrains.uast.UastVisibility;\nimport org.jetbrains.uast.visitor.AbstractUastVisitor;\n\nimport java.util.Collections;\nimport java.util.EnumSet;\nimport java.util.List;\n\npublic class NoDelegateOnResumeDetector extends Detector implements Detector.UastScanner {\n    static final Issue ISSUE = Issue.create(\"NoDelegateOnResumeDetector\",\n            \"Asking permissions at `onResume()` will cause an infinite loop.\",\n            \"Asking permissions in `onResume()` will cause an infinite loop when user selects \\\"Never ask again\\\" and denies the permission, since `onResume()` is called again after returning from a permission request check. This problem can be solved by moving this method call to `onStart()`.\",\n            Category.CORRECTNESS,\n            4,\n            Severity.ERROR,\n            new Implementation(NoDelegateOnResumeDetector.class,\n                    EnumSet.of(Scope.JAVA_FILE)));\n\n    @Override\n    public List<Class<? extends UElement>> getApplicableUastTypes() {\n        return Collections.<Class<? extends UElement>>singletonList(UClass.class);\n    }\n\n    @Override\n    public UElementHandler createUastHandler(final JavaContext context) {\n        return new UElementHandler() {\n            @Override\n            public void visitClass(UClass node) {\n                if (node.findAnnotation(\"permissions.dispatcher.RuntimePermissions\") != null) {\n                    node.accept(new Checker(context));\n                }\n            }\n        };\n    }\n\n    private class Checker extends AbstractUastVisitor {\n        private final JavaContext context;\n        private String needPermissionMethodName = null;\n\n        private Checker(JavaContext context) {\n            this.context = context;\n        }\n\n        @Override\n        public boolean visitMethod(UMethod node) {\n            super.visitMethod(node);\n            if (node.findAnnotation(\"permissions.dispatcher.NeedsPermission\") != null) {\n                needPermissionMethodName = node.getName();\n            }\n            return true;\n        }\n\n        @Override\n        public void afterVisitClass(UClass node) {\n            super.afterVisitClass(node);\n            if (needPermissionMethodName != null) {\n                node.accept(new OnResumeChecker(context, node, needPermissionMethodName));\n            }\n        }\n    }\n\n    private class OnResumeChecker extends AbstractUastVisitor {\n        private final JavaContext context;\n        private boolean isKotlin;\n        private UClass uClass;\n        private String needPermissionMethodName;\n\n        private OnResumeChecker(JavaContext context, UClass uClass, String needPermissionMethodName) {\n            this.context = context;\n            this.uClass = uClass;\n            this.needPermissionMethodName = needPermissionMethodName;\n            isKotlin = context.getPsiFile() != null && \"kotlin\".equals(context.getPsiFile().getLanguage().getID());\n        }\n\n        /**\n         * @return return true if visiting end (if lint does not visit inside the method), false otherwise\n         */\n        @Override\n        public boolean visitMethod(UMethod node) {\n            super.visitMethod(node);\n            return !\"onResume\".equalsIgnoreCase(node.getName())\n                    || node.getReturnType() != PsiType.VOID\n                    || node.getUastParameters().size() != 0\n                    || !isPublicOrProtected(node);\n        }\n\n        private boolean isPublicOrProtected(UMethod node) {\n            UastVisibility visibility = node.getVisibility();\n            return visibility == UastVisibility.PUBLIC || visibility == UastVisibility.PROTECTED;\n        }\n\n        @Override\n        public boolean visitCallExpression(UCallExpression node) {\n            super.visitCallExpression(node);\n            UIdentifier methodIdentifier = node.getMethodIdentifier();\n            if (methodIdentifier != null && isWithPermissionCheckCalled(node, methodIdentifier)) {\n                context.report(ISSUE, context.getLocation(node), \"Asking permission inside onResume()\");\n            }\n            return true;\n        }\n\n        private boolean isWithPermissionCheckCalled(@NotNull UCallExpression node, @NotNull UIdentifier methodIdentifier) {\n            if (!(needPermissionMethodName + \"WithPermissionCheck\").equalsIgnoreCase(methodIdentifier.getName())) {\n                return false;\n            }\n\n            UExpression receiver = node.getReceiver();\n            if (isKotlin) {\n                return receiver == null;\n            } else {\n                String qualifiedName = uClass.getQualifiedName();\n                if (node.getValueArgumentCount() < 1) return false;\n                PsiType expressionType = node.getValueArguments().get(0).getExpressionType();\n                return receiver != null\n                        && qualifiedName != null\n                        && expressionType != null\n                        && qualifiedName.equalsIgnoreCase(expressionType.getCanonicalText())\n                        && (uClass.getName() + \"PermissionsDispatcher\").equalsIgnoreCase(receiver.asSourceString());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "lint/src/main/java/permissions/dispatcher/PermissionsDispatcherIssueRegistry.java",
    "content": "package permissions.dispatcher;\n\nimport com.android.tools.lint.client.api.IssueRegistry;\nimport com.android.tools.lint.detector.api.Issue;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n@SuppressWarnings(\"unused\")\npublic final class PermissionsDispatcherIssueRegistry extends IssueRegistry {\n    @Override\n    public List<Issue> getIssues() {\n        return Arrays.asList(\n                CallNeedsPermissionDetector.ISSUE,\n                CallOnRequestPermissionsResultDetector.ISSUE,\n                NoCorrespondingNeedsPermissionDetector.ISSUE,\n                NoDelegateOnResumeDetector.ISSUE);\n    }\n\n    @Override\n    public int getApi() {\n        return com.android.tools.lint.detector.api.ApiKt.CURRENT_API;\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/CallNeedsPermissionDetectorKtTest.kt",
    "content": "package permissions.dispatcher\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestFiles.kt\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass CallNeedsPermissionDetectorKtTest {\n\n    @Test\n    fun callNeedsPermissionMethod() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package com.example\n\n                import permissions.dispatcher.NeedsPermission\n                import permissions.dispatcher.RuntimePermissions\n\n                @RuntimePermissions\n                class Foo {\n                    @NeedsPermission(\"Test\")\n                    fun fooBar() {\n                    }\n\n                    fun hoge() {\n                        fooBar()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n            |src/com/example/Foo.kt:13: Error: Trying to access permission-protected method directly [CallNeedsPermission]\n            |                        fooBar()\n            |                        ~~~~~~~~\n            |1 errors, 0 warnings\n            \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        kt(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    fun callNeedsPermissionMethodNoError() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package com.example\n\n                class Foo {\n                    fun someMethod() {\n                        val baz = Baz()\n                        baz.noFooBar()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"kotlin\") val baz = \"\"\"\n                package com.example\n\n                import permissions.dispatcher.NeedsPermission\n                import permissions.dispatcher.RuntimePermissions\n\n                @RuntimePermissions\n                class Baz {\n                    @NeedsPermission(\"Test\")\n                    fun fooBar() {\n                    }\n\n                    fun noFooBar() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        kt(foo),\n                        kt(baz))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    fun issues502() {\n        @Language(\"kotlin\") val foo = \"\"\"\n            package com.example\n\n            import permissions.dispatcher.NeedsPermission\n            import permissions.dispatcher.RuntimePermissions\n\n            @RuntimePermissions\n            class Foo: AppCompatActivity  {\n                @NeedsPermission(Manifest.permission.READ_SMS)\n                fun requestOTP() {\n                    PhoneVerificationInputFragment().requestOTP()\n                }\n            }\n\n            class FooFragment: Fragment {\n                fun resendOTP() {\n                    requestOTP()\n                }\n                private fun requestOTP() {\n                }\n            }\n        \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        kt(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    fun `same name methods in different class(issue602)`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n            package com.example\n\n            import permissions.dispatcher.NeedsPermission\n            import permissions.dispatcher.RuntimePermissions\n\n            @RuntimePermissions\n            class FirstActivity : AppCompatActivity() {\n                @NeedsPermission(Manifest.permission.CAMERA)\n                fun someFun() {\n                }\n            }\n\n            @RuntimePermissions\n            class SecondActivity : AppCompatActivity() {\n                override fun onCreate(savedInstanceState: Bundle?) {\n                    super.onCreate(savedInstanceState)\n                    someFun()\n                }\n\n                fun someFun() {\n                }\n\n                @NeedsPermission(Manifest.permission.CAMERA)\n                fun otherFun() {\n                }\n            }\n        \"\"\".trimMargin()\n\n        lint()\n                .files(java(runtimePermission), java(onNeedsPermission), kt(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/CallNeedsPermissionDetectorTest.kt",
    "content": "package permissions.dispatcher\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass CallNeedsPermissionDetectorTest {\n\n    @Test\n    @Throws(Exception::class)\n    fun callNeedsPermissionMethod() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package com.example;\n\n                import permissions.dispatcher.NeedsPermission;\n                import permissions.dispatcher.RuntimePermissions;\n\n                @RuntimePermissions\n                public class Foo {\n                    @NeedsPermission(\"Test\")\n                    void fooBar() {\n                    }\n\n                    public void hoge() {\n                        fooBar();\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n            |src/com/example/Foo.java:13: Error: Trying to access permission-protected method directly [CallNeedsPermission]\n            |                        fooBar();\n            |                        ~~~~~~~~\n            |1 errors, 0 warnings\n            \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun callNeedsPermissionMethodNoError() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package com.example;\n\n                public class Foo {\n                    void someMethod() {\n                        Baz baz = new Baz();\n                        baz.noFooBar();\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"JAVA\") val baz = \"\"\"\n                package com.example;\n\n                import permissions.dispatcher.NeedsPermission;\n                import permissions.dispatcher.RuntimePermissions;\n\n                @RuntimePermissions\n                public class Baz {\n                    @NeedsPermission(\"Test\")\n                    void fooBar() {\n                    }\n\n                    void noFooBar() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onNeedsPermission),\n                        java(foo),\n                        java(baz))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun issues502() {\n        @Language(\"JAVA\") val foo = \"\"\"\n            package com.example;\n\n            import permissions.dispatcher.NeedsPermission;\n            import permissions.dispatcher.RuntimePermissions;\n\n            @RuntimePermissions\n            public class Foo extends AppCompatActivity  {\n                @NeedsPermission({Manifest.permission.READ_SMS})\n                void requestOTP() {\n                    new PhoneVerificationInputFragment().requestOTP();\n                }\n            }\n\n            class FooFragment extends Fragment {\n                public void resendOTP() {\n                    requestOTP();\n                }\n                private void requestOTP() {\n                }\n            }\n        \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    fun `same name methods in different class(issue602)`() {\n        @Language(\"java\") val foo = \"\"\"\n            package com.example;\n\n            import permissions.dispatcher.NeedsPermission;\n            import permissions.dispatcher.RuntimePermissions;\n\n            @RuntimePermissions\n            public class FirstActivity extends AppCompatActivity  {\n                @NeedsPermission({Manifest.permission.READ_SMS})\n                void someFun() {\n                }\n            }\n\n            @RuntimePermissions\n            public class SecondActivity extends AppCompatActivity  {\n                @Override\n                protected void onCreate(@Nullable Bundle savedInstanceState) {\n                    super.onCreate(savedInstanceState);\n                    someFun();\n                }\n\n                void someFun() {\n                }\n\n                @NeedsPermission({Manifest.permission.READ_SMS})\n                void otherFun() {\n                }\n            }\n        \"\"\".trimMargin()\n\n        lint()\n                .files(java(runtimePermission), java(onNeedsPermission), java(foo))\n                .issues(CallNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/CallOnRequestPermissionsResultDetectorKtTest.kt",
    "content": "package permissions.dispatcher\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestFiles.kt\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.onRationaleAnnotation\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass CallOnRequestPermissionsResultDetectorKtTest {\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetectorNoErrorForKotlin() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n                        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n                        onRequestPermissionsResult(requestCode, grantResults)\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"kotlin\") val generatedClass = \"\"\"\n                package permissions.dispatcher\n\n                fun Foo.onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        kt(generatedClass),\n                        kt(foo))\n                .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetectorNoErrorWithNamedMethodReference() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) =\n                        onRequestPermissionsResult(requestCode, grantResults)\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"kotlin\") val generatedClass = \"\"\"\n                package permissions.dispatcher\n\n                fun Foo.onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {\n                }\n                \"\"\".trimMargin()\n\n        lint()\n            .files(\n                java(runtimePermission),\n                java(onNeedsPermission),\n                java(onRationaleAnnotation),\n                kt(generatedClass),\n                kt(foo))\n            .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n            .run()\n            .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetectorErrorWithWrongMethod() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) =\n                        hoge(requestCode, grantResults)\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"kotlin\") val generatedClass = \"\"\"\n                package permissions.dispatcher\n\n                fun Foo.hoge(requestCode: Int, grantResults: IntArray) {\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:5: Error: Generated onRequestPermissionsResult method not called [NeedOnRequestPermissionsResult]\n                |                    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) =\n                |                    ^\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        lint()\n            .files(\n                java(runtimePermission),\n                java(onNeedsPermission),\n                java(onRationaleAnnotation),\n                kt(foo))\n            .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n            .run()\n            .expect(expectedText)\n            .expectErrorCount(1)\n            .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetector() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo: android.app.Activity {\n                    fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n                        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:5: Error: Generated onRequestPermissionsResult method not called [NeedOnRequestPermissionsResult]\n                |                    fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n                |                    ^\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        kt(foo))\n                .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/CallOnRequestPermissionsResultDetectorTest.kt",
    "content": "package permissions.dispatcher\n\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.onRationaleAnnotation\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass CallOnRequestPermissionsResultDetectorTest {\n\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetectorNoError() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo extends android.app.Activity {\n                    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n                        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n                        FooPermissionsDispatcher.onRequestPermissionsResult(requestCode, grantResults);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    public void showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    public void someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        @Language(\"JAVA\") val generatedClass = \"\"\"\n                package permissions.dispatcher;\n\n                public class FooPermissionsDispatcher {\n                    public static void onRequestPermissionsResult(int requestCode, int[] grantResults) {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        java(generatedClass),\n                        java(foo))\n                .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun callOnRequestPermissionsResultDetector() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo extends android.app.Activity {\n                    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n                        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    public void showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    public void someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.java:5: Error: Generated onRequestPermissionsResult method not called [NeedOnRequestPermissionsResult]\n                |                    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n                |                    ^\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(runtimePermission),\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        java(foo))\n                .issues(CallOnRequestPermissionsResultDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/NoCorrespondingNeedsPermissionDetectorKtTest.kt",
    "content": "package permissions.dispatcher\n\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestFiles.kt\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.onRationaleAnnotation\n\nclass NoCorrespondingNeedsPermissionDetectorKtTest {\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotationNoErrors() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                class Foo {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        kt(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotationNoErrorsOrderNotMatter() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                class Foo {\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        kt(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotation() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                class Foo {\n                    @OnShowRationale(\"Camera\")\n                    fun someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:4: Error: Useless @OnShowRationale declaration [NoCorrespondingNeedsPermission]\n                |                    @OnShowRationale(\"Camera\")\n                |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onRationaleAnnotation),\n                        kt(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/NoCorrespondingNeedsPermissionDetectorTest.kt",
    "content": "package permissions.dispatcher\n\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles.java\nimport com.android.tools.lint.checks.infrastructure.TestLintTask.lint\nimport permissions.dispatcher.Utils.onNeedsPermission\nimport permissions.dispatcher.Utils.onRationaleAnnotation\n\nclass NoCorrespondingNeedsPermissionDetectorTest {\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotationNoErrors() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                public class Foo {\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n\n                    @OnShowRationale(\"Camera\")\n                    void someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        java(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotationNoErrorsOrderNoTMatter() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                public class Foo {\n                    @OnShowRationale(\"Camera\")\n                    void someMethod() {\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onNeedsPermission),\n                        java(onRationaleAnnotation),\n                        java(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun noNeedsPermissionAnnotation() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                public class Foo {\n                    @OnShowRationale(\"Camera\")\n                    void someMethod() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.java:4: Error: Useless @OnShowRationale declaration [NoCorrespondingNeedsPermission]\n                |                    @OnShowRationale(\"Camera\")\n                |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        lint()\n                .files(\n                        java(onRationaleAnnotation),\n                        java(foo))\n                .issues(NoCorrespondingNeedsPermissionDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/NoDelegateOnResumeDetectorKtTest.kt",
    "content": "package permissions.dispatcher\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass NoDelegateOnResumeDetectorKtTest {\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    fun onResume() {\n                        super.onResume()\n                        showCameraWithPermissionCheck()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:11: Error: Asking permission inside onResume() [NoDelegateOnResumeDetector]\n                |                        showCameraWithPermissionCheck()\n                |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume which the method is before NeedsPermission`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    fun onResume() {\n                        super.onResume()\n                        showCameraWithPermissionCheck()\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:7: Error: Asking permission inside onResume() [NoDelegateOnResumeDetector]\n                |                        showCameraWithPermissionCheck()\n                |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `No WithPermissionCheck inside onResume`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    fun onStart() {\n                        super.onStart()\n                        showCameraWithPermissionCheck()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume with argument`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera(value: Int) {\n                    }\n\n                    fun onResume() {\n                        super.onResume()\n                        showCameraWithPermissionCheck(1)\n                    }\n\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.kt:11: Error: Asking permission inside onResume() [NoDelegateOnResumeDetector]\n                |                        showCameraWithPermissionCheck(1)\n                |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume but there is receiver`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    fun onResume() {\n                        super.onResume()\n                        Bar.showCameraWithPermissionCheck()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume but its visibility is private`() {\n        @Language(\"kotlin\") val foo = \"\"\"\n                package permissions.dispatcher\n\n                @RuntimePermissions\n                class Foo : android.app.Activity {\n                    @NeedsPermission(\"Camera\")\n                    fun showCamera() {\n                    }\n\n                    private fun onResume() {\n                        super.onResume()\n                        showCameraWithPermissionCheck()\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.kt(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n}"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/NoDelegateOnResumeDetectorTest.kt",
    "content": "package permissions.dispatcher\n\nimport com.android.tools.lint.checks.infrastructure.TestFiles\nimport com.android.tools.lint.checks.infrastructure.TestLintTask\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nimport permissions.dispatcher.Utils.runtimePermission\n\nclass NoDelegateOnResumeDetectorTest {\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n\n                    protected void onResume() {\n                        super.onResume();\n                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.java:11: Error: Asking permission inside onResume() [NoDelegateOnResumeDetector]\n                |                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume which the method is before NeedsPermission`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    protected void onResume() {\n                        super.onResume();\n                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        val expectedText = \"\"\"\n                |src/permissions/dispatcher/Foo.java:7: Error: Asking permission inside onResume() [NoDelegateOnResumeDetector]\n                |                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n                |1 errors, 0 warnings\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expect(expectedText)\n                .expectErrorCount(1)\n                .expectWarningCount(0)\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `No WithPermissionCheck inside onResume`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    public void onStart() {\n                        super.onStart();\n                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume but there is no argument`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    protected void onResume() {\n                        super.onResume();\n                        // this should not be generated...\n                        FooPermissionsDispatcher.showCameraWithPermissionCheck();\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume but there is no receiver`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    protected void onResume() {\n                        super.onResume();\n                        showCameraWithPermissionCheck(this);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n\n                    void showCameraWithPermissionCheck(Foo foo) {\n\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n    @Test\n    @Throws(Exception::class)\n    fun `WithPermissionCheck call inside onResume but its visibility is package private`() {\n        @Language(\"JAVA\") val foo = \"\"\"\n                package permissions.dispatcher;\n\n                @RuntimePermissions\n                public class Foo {\n                    void onResume() {\n                        super.onResume();\n                        FooPermissionsDispatcher.showCameraWithPermissionCheck(this);\n                    }\n\n                    @NeedsPermission(\"Camera\")\n                    void showCamera() {\n                    }\n                }\n                \"\"\".trimMargin()\n\n        TestLintTask.lint()\n                .files(\n                        TestFiles.java(runtimePermission),\n                        TestFiles.java(Utils.onNeedsPermission),\n                        TestFiles.java(foo))\n                .issues(NoDelegateOnResumeDetector.ISSUE)\n                .run()\n                .expectClean()\n    }\n\n}"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/PermissionsDispatcherIssueRegistryTest.kt",
    "content": "package permissions.dispatcher\n\nimport org.junit.Test\n\nimport com.google.common.truth.Truth.assertThat\n\nclass PermissionsDispatcherIssueRegistryTest {\n    @Test\n    fun issues() {\n        assertThat(PermissionsDispatcherIssueRegistry().issues).containsAllOf(\n                CallNeedsPermissionDetector.ISSUE,\n                CallOnRequestPermissionsResultDetector.ISSUE,\n                NoCorrespondingNeedsPermissionDetector.ISSUE)\n    }\n}\n"
  },
  {
    "path": "lint/src/test/java/permissions/dispatcher/Utils.kt",
    "content": "package permissions.dispatcher\n\ninternal object Utils {\n\n    val runtimePermission = \"\"\"\n                 |package permissions.dispatcher;\n                 |\n                 |import java.lang.annotation.ElementType;\n                 |import java.lang.annotation.Retention;\n                 |import java.lang.annotation.RetentionPolicy;\n                 |import java.lang.annotation.Target;\n                 |\n                 |@Target(ElementType.TYPE)\n                 |@Retention(RetentionPolicy.CLASS)\n                 |public @interface RuntimePermissions {\n                 |}\n                \"\"\".trimMargin()\n\n    val onNeedsPermission = \"\"\"\n                |package permissions.dispatcher;\n                |\n                |import java.lang.annotation.ElementType;\n                |import java.lang.annotation.Retention;\n                |import java.lang.annotation.RetentionPolicy;\n                |import java.lang.annotation.Target;\n                |\n                |@Target(ElementType.METHOD)\n                |@Retention(RetentionPolicy.CLASS)\n                |public @interface NeedsPermission {\n                |  String[] value();\n                |  int maxSdkVersion() default 0;\n                |}\n                \"\"\".trimMargin()\n\n    val onRationaleAnnotation = \"\"\"\n                |package permissions.dispatcher;\n                |\n                |import java.lang.annotation.ElementType;\n                |import java.lang.annotation.Retention;\n                |import java.lang.annotation.RetentionPolicy;\n                |import java.lang.annotation.Target;\n                |\n                |@Target(ElementType.METHOD)\n                |@Retention(RetentionPolicy.CLASS)\n                |public @interface OnShowRationale {\n                |  String[] value();\n                |}\n                \"\"\".trimMargin()\n}\n"
  },
  {
    "path": "processor/build.gradle",
    "content": "import org.gradle.internal.jvm.Jvm\nimport permissions.dispatcher.AndroidJarDependencyPlugin\nimport permissions.dispatcher.AarToJarConversionPlugin\n\napply plugin: 'kotlin'\napply plugin: 'org.jetbrains.dokka'\napply plugin: \"com.vanniktech.maven.publish\"\napply plugin: AndroidJarDependencyPlugin\napply plugin: AarToJarConversionPlugin\n\n// Connect sources & tests to library project\nconvertAarsToJar.dependsOn \":library:assembleRelease\"\n\nconfigurations.all {\n    resolutionStrategy.eachDependency { DependencyResolveDetails details ->\n        def requested = details.requested\n        if (requested.group == 'org.jetbrains.kotlin' && requested.name == 'kotlin-reflect') {\n            details.useVersion KOTLIN_VERSION\n        }\n    }\n}\n\ndependencies {\n    implementation \"androidx.annotation:annotation:$ANDROIDX_LIBRARY_VERSION\"\n    implementation \"org.jetbrains.kotlinx:kotlinx-metadata-jvm:$KOTLIN_METADATA_VERSION\"\n    implementation \"com.squareup:javapoet:$JAVAPOET_VERSION\"\n    implementation \"com.squareup:kotlinpoet:$KOTLINPOET_VERSION\"\n    implementation project(path: ':annotation')\n\n    testCompileAar \"androidx.legacy:legacy-support-v4:$ANDROIDX_LIBRARY_VERSION\"\n    testCompileAar project(path: \":library\", configuration: \"default\")\n\n    testImplementation androidJar()\n    testImplementation files(Jvm.current().getToolsJar())\n    testImplementation \"junit:junit:$JUNIT_VERSION\"\n    testImplementation \"org.mockito:mockito-core:$MOCKITO_VERSION\"\n    testImplementation \"com.google.testing.compile:compile-testing:$COMPILE_TESTING_VERSION\"\n    testImplementation \"commons-io:commons-io:$COMMONS_IO_VERSION\"\n    testImplementation \"com.squareup.okio:okio:2.1.0\"\n    testImplementation \"androidx.legacy:legacy-support-v4:$ANDROIDX_LIBRARY_VERSION\"\n    testImplementation \"com.github.permissions-dispatcher:kompile-testing:$KOMPILE_TESTING_VERSION\"\n}\n"
  },
  {
    "path": "processor/gradle.properties",
    "content": "POM_NAME        = permissionsdispatcher-processor\nPOM_ARTIFACT_ID = permissionsdispatcher-processor\nPOM_PACKAGING   = jar\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/PermissionsProcessor.kt",
    "content": "package permissions.dispatcher.processor\n\nimport permissions.dispatcher.RuntimePermissions\nimport permissions.dispatcher.processor.impl.java.JavaActivityProcessorUnit\nimport permissions.dispatcher.processor.impl.java.JavaFragmentProcessorUnit\nimport permissions.dispatcher.processor.impl.kotlin.KotlinActivityProcessorUnit\nimport permissions.dispatcher.processor.impl.kotlin.KotlinFragmentProcessorUnit\nimport permissions.dispatcher.processor.util.findAndValidateProcessorUnit\nimport javax.annotation.processing.AbstractProcessor\nimport javax.annotation.processing.Filer\nimport javax.annotation.processing.ProcessingEnvironment\nimport javax.annotation.processing.RoundEnvironment\nimport javax.lang.model.SourceVersion\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.TypeElement\nimport javax.lang.model.util.Elements\nimport javax.lang.model.util.Types\nimport kotlin.properties.Delegates\n\n/** Element Utilities, obtained from the processing environment */\nvar ELEMENT_UTILS: Elements by Delegates.notNull()\n/** Type Utilities, obtained from the processing environment */\nvar TYPE_UTILS: Types by Delegates.notNull()\n\nclass PermissionsProcessor : AbstractProcessor() {\n    private val javaProcessorUnits = listOf(JavaActivityProcessorUnit(), JavaFragmentProcessorUnit())\n    private val kotlinProcessorUnits = listOf(KotlinActivityProcessorUnit(), KotlinFragmentProcessorUnit())\n    /* Processing Environment helpers */\n    private var filer: Filer by Delegates.notNull()\n\n    override fun init(processingEnv: ProcessingEnvironment) {\n        super.init(processingEnv)\n        filer = processingEnv.filer\n        ELEMENT_UTILS = processingEnv.elementUtils\n        TYPE_UTILS = processingEnv.typeUtils\n    }\n\n    override fun getSupportedSourceVersion(): SourceVersion? {\n        return SourceVersion.latestSupported()\n    }\n\n    override fun getSupportedAnnotationTypes(): Set<String> {\n        return hashSetOf(RuntimePermissions::class.java.canonicalName)\n    }\n\n    override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean {\n        // Create a RequestCodeProvider which guarantees unique request codes for each permission request\n        val requestCodeProvider = RequestCodeProvider()\n\n        // The Set of annotated elements needs to be ordered\n        // in order to achieve Deterministic, Reproducible Builds\n        roundEnv.getElementsAnnotatedWith(RuntimePermissions::class.java)\n                .sortedBy { it.simpleName.toString() }\n                .forEach {\n                    val rpe = RuntimePermissionsElement(it as TypeElement)\n                    val kotlinMetadata = it.getAnnotation(Metadata::class.java)\n                    if (kotlinMetadata != null) {\n                        processKotlin(it, rpe, requestCodeProvider)\n                    } else {\n                        processJava(it, rpe, requestCodeProvider)\n                    }\n                }\n        return true\n    }\n\n    private fun processKotlin(element: Element, rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider) {\n        val processorUnit = findAndValidateProcessorUnit(kotlinProcessorUnits, element)\n        val kotlinFile = processorUnit.createFile(rpe, requestCodeProvider)\n        kotlinFile.writeTo(filer)\n    }\n\n    private fun processJava(element: Element, rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider) {\n        val processorUnit = findAndValidateProcessorUnit(javaProcessorUnits, element)\n        val javaFile = processorUnit.createFile(rpe, requestCodeProvider)\n        javaFile.writeTo(filer)\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/ProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor\n\nimport com.squareup.javapoet.JavaFile\nimport com.squareup.kotlinpoet.FileSpec\nimport javax.lang.model.type.TypeMirror\n\ninterface ProcessorUnit<out K> {\n    fun getTargetType(): TypeMirror\n    /**\n     * Creates the File for the provided @RuntimePermissions element.\n     * <p>\n     * This will delegate to other methods that compose generated code.\n     */\n    fun createFile(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): K\n}\n\ninterface JavaProcessorUnit : ProcessorUnit<JavaFile>\ninterface KtProcessorUnit : ProcessorUnit<FileSpec>\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/RequestCodeProvider.kt",
    "content": "package permissions.dispatcher.processor\n\nimport java.util.concurrent.atomic.AtomicInteger\n\n/**\n * Helper class providing app-level unique request codes\n * for a round trip of the annotation processor.\n */\nclass RequestCodeProvider {\n\n    private val currentCode = AtomicInteger(0)\n\n    /**\n     * Obtains the next unique request code.\n     * This method atomically increments the value\n     * returned upon the next invocation.\n     */\n    fun nextRequestCode(): Int = currentCode.andIncrement\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/RuntimePermissionsElement.kt",
    "content": "package permissions.dispatcher.processor\n\nimport com.squareup.javapoet.TypeName\nimport com.squareup.javapoet.TypeVariableName\nimport com.squareup.kotlinpoet.asTypeName\nimport com.squareup.kotlinpoet.asTypeVariableName\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.OnNeverAskAgain\nimport permissions.dispatcher.OnPermissionDenied\nimport permissions.dispatcher.OnShowRationale\nimport permissions.dispatcher.processor.util.*\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.element.TypeElement\n\nclass RuntimePermissionsElement(val element: TypeElement) {\n    val typeName: TypeName = TypeName.get(element.asType())\n    val ktTypeName = element.asType().asTypeName()\n    val typeVariables = element.typeParameters.map { TypeVariableName.get(it) }\n    val ktTypeVariables = element.typeParameters.map { it.asTypeVariableName() }\n    val packageName = element.packageName()\n    val inputClassName = element.simpleString()\n    val generatedClassName = inputClassName + GEN_CLASS_SUFFIX\n    val needsElements = element.childElementsAnnotatedWith(NeedsPermission::class.java)\n    private val onRationaleElements = element.childElementsAnnotatedWith(OnShowRationale::class.java)\n    private val onDeniedElements = element.childElementsAnnotatedWith(OnPermissionDenied::class.java)\n    private val onNeverAskElements = element.childElementsAnnotatedWith(OnNeverAskAgain::class.java)\n\n    init {\n        validateNeedsMethods()\n        validateRationaleMethods()\n        validateDeniedMethods()\n        validateNeverAskMethods()\n    }\n\n    private fun validateNeedsMethods() {\n        checkNotEmpty(needsElements, this, NeedsPermission::class.java)\n        checkPrivateMethods(needsElements, NeedsPermission::class.java)\n        checkMethodSignature(needsElements)\n        checkMixPermissionType(needsElements, NeedsPermission::class.java)\n        checkDuplicatedMethodName(needsElements)\n    }\n\n    private fun validateRationaleMethods() {\n        checkDuplicatedValue(onRationaleElements, OnShowRationale::class.java)\n        checkPrivateMethods(onRationaleElements, OnShowRationale::class.java)\n        checkMethodSignature(onRationaleElements)\n        checkMethodParameters(onRationaleElements, 1, typeMirrorOf(\"permissions.dispatcher.PermissionRequest\"))\n    }\n\n    private fun validateDeniedMethods() {\n        checkDuplicatedValue(onDeniedElements, OnPermissionDenied::class.java)\n        checkPrivateMethods(onDeniedElements, OnPermissionDenied::class.java)\n        checkMethodSignature(onDeniedElements)\n        checkMethodParameters(onDeniedElements, 0)\n    }\n\n    private fun validateNeverAskMethods() {\n        checkDuplicatedValue(onNeverAskElements, OnNeverAskAgain::class.java)\n        checkPrivateMethods(onNeverAskElements, OnNeverAskAgain::class.java)\n        checkMethodSignature(onNeverAskElements)\n        checkMethodParameters(onNeverAskElements, 0)\n        checkSpecialPermissionsWithNeverAskAgain(onNeverAskElements)\n    }\n\n    fun findOnRationaleForNeeds(needsElement: ExecutableElement): ExecutableElement? {\n        return findMatchingMethodForNeeds(needsElement, onRationaleElements, OnShowRationale::class.java)\n    }\n\n    fun findOnDeniedForNeeds(needsElement: ExecutableElement): ExecutableElement? {\n        return findMatchingMethodForNeeds(needsElement, onDeniedElements, OnPermissionDenied::class.java)\n    }\n\n    fun findOnNeverAskForNeeds(needsElement: ExecutableElement): ExecutableElement? {\n        return findMatchingMethodForNeeds(needsElement, onNeverAskElements, OnNeverAskAgain::class.java)\n    }\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/DuplicatedMethodNameException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass DuplicatedMethodNameException(e: ExecutableElement) : RuntimeException(\"'${e.simpleString()}()' has duplicated '@NeedsPermission' method. The method annotated with '@NeedsPermission' must has the unique name.\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/DuplicatedValueException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass DuplicatedValueException(value: List<String>, e: ExecutableElement, annotation: Class<*>) : RuntimeException(\"$value is duplicated in '${e.simpleString()}()' annotated with '@${annotation.simpleName}'\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/MixPermissionTypeException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass MixPermissionTypeException(e: ExecutableElement, permissionName: String) : RuntimeException(\"Method '${e.simpleString()}()' defines '$permissionName' with other permissions at the same time.\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/NoAnnotatedMethodsException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.RuntimePermissionsElement\n\nclass NoAnnotatedMethodsException(rpe: RuntimePermissionsElement, type: Class<*>) : RuntimeException(\"Annotated class '${rpe.inputClassName}' doesn't have any method annotated with '@${type.simpleName}'\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/NoParametersAllowedException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass NoParametersAllowedException(e: ExecutableElement) : RuntimeException(\"Method '${e.simpleString()}()' must not have any parameters\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/NoThrowsAllowedException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass NoThrowsAllowedException(e: ExecutableElement) : RuntimeException(\"Method '${e.simpleString()}()' must not have any 'throws' declaration in its signature\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/PrivateMethodException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass PrivateMethodException(e: ExecutableElement, annotationType: Class<*>) : RuntimeException(\"Method '${e.simpleString()}()' annotated with '@${annotationType.simpleName}' must not be private\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/SpecialPermissionsWithNeverAskAgainException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nclass SpecialPermissionsWithNeverAskAgainException : RuntimeException(\"'@NeverAskAgain' annotated method never being called with 'WRITE_SETTINGS' or 'SYSTEM_ALERT_WINDOW' permission.\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/WrongClassException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport com.squareup.javapoet.TypeName\nimport javax.lang.model.type.TypeMirror\n\nclass WrongClassException(type: TypeMirror) : RuntimeException(\"Class '${TypeName.get(type)}' can't be annotated with '@RuntimePermissions'\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/WrongParametersException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.type.TypeMirror\n\nclass WrongParametersException(e: ExecutableElement, numParams: Int, requiredType: TypeMirror) : RuntimeException(\"Method '${e.simpleString()}()' must has less than or equal to $numParams size parameter and type of it is supposed to be '${requiredType.simpleString()}'\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/exception/WrongReturnTypeException.kt",
    "content": "package permissions.dispatcher.processor.exception\n\nimport permissions.dispatcher.processor.util.simpleString\nimport javax.lang.model.element.ExecutableElement\n\nclass WrongReturnTypeException(e: ExecutableElement) : RuntimeException(\"Method '${e.simpleString()}()' must specify return type 'void', not '${e.returnType}'\")"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/JavaActivityProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport com.squareup.javapoet.ClassName\nimport com.squareup.javapoet.MethodSpec\nimport permissions.dispatcher.processor.util.typeMirrorOf\nimport javax.lang.model.type.TypeMirror\n\n/**\n * ProcessorUnit implementation for Activity.\n */\nclass JavaActivityProcessorUnit : JavaBaseProcessorUnit() {\n\n    override fun getTargetType(): TypeMirror = typeMirrorOf(\"android.app.Activity\")\n\n    override fun getActivityName(targetParam: String): String = targetParam\n\n    override fun addShouldShowRequestPermissionRationaleCondition(builder: MethodSpec.Builder, targetParam: String, permissionField: String, isPositiveCondition: Boolean) {\n        builder.beginControlFlow(\"if (\\$N\\$T.shouldShowRequestPermissionRationale(\\$N, \\$N))\", if (isPositiveCondition) \"\" else \"!\", permissionUtils, targetParam, permissionField)\n    }\n\n    override fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, permissionField: String, requestCodeField: String) {\n        builder.addStatement(\"\\$T.requestPermissions(\\$N, \\$N, \\$N)\", ClassName.get(\"androidx.core.app\", \"ActivityCompat\"), targetParam, permissionField, requestCodeField)\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/JavaBaseProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport androidx.annotation.NonNull\nimport com.squareup.javapoet.ArrayTypeName\nimport com.squareup.javapoet.ClassName\nimport com.squareup.javapoet.CodeBlock\nimport com.squareup.javapoet.FieldSpec\nimport com.squareup.javapoet.JavaFile\nimport com.squareup.javapoet.MethodSpec\nimport com.squareup.javapoet.ParameterSpec\nimport com.squareup.javapoet.ParameterizedTypeName\nimport com.squareup.javapoet.TypeName\nimport com.squareup.javapoet.TypeSpec\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.processor.JavaProcessorUnit\nimport permissions.dispatcher.processor.RequestCodeProvider\nimport permissions.dispatcher.processor.RuntimePermissionsElement\nimport permissions.dispatcher.processor.util.*\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.element.Modifier\n\n/**\n * Base class for [JavaProcessorUnit] implementations.\n * <p>\n * This generates the parts of code independent from specific permission method signatures for different target objects.\n */\nabstract class JavaBaseProcessorUnit : JavaProcessorUnit {\n\n    protected val permissionUtils: ClassName = ClassName.get(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val grantableRequest = ClassName.get(\"permissions.dispatcher\", \"GrantableRequest\")\n    private val build = ClassName.get(\"android.os\", \"Build\")\n    private val writeSettings = \"android.permission.WRITE_SETTINGS\"\n    private val systemAlertWindow = \"android.permission.SYSTEM_ALERT_WINDOW\"\n    private val addWithCheckBodyMap = hashMapOf(\n            systemAlertWindow to SystemAlertWindowHelper(),\n            writeSettings to WriteSettingsHelper())\n\n    final override fun createFile(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): JavaFile {\n        return JavaFile.builder(rpe.packageName, createTypeSpec(rpe, requestCodeProvider))\n                .addFileComment(FILE_COMMENT)\n                .build()\n    }\n\n    abstract fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, permissionField: String, requestCodeField: String)\n\n    abstract fun addShouldShowRequestPermissionRationaleCondition(builder: MethodSpec.Builder, targetParam: String, permissionField: String, isPositiveCondition: Boolean = true)\n\n    abstract fun getActivityName(targetParam: String): String\n\n    private fun createTypeSpec(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): TypeSpec {\n        return TypeSpec.classBuilder(rpe.generatedClassName)\n                .addOriginatingElement(rpe.element) // for incremental annotation processing\n                .addModifiers(Modifier.FINAL)\n                .addFields(createFields(rpe, requestCodeProvider))\n                .addMethod(createConstructor())\n                .addMethods(createWithPermissionCheckMethods(rpe))\n                .addMethods(createOnShowRationaleCallbackMethods(rpe))\n                .addMethods(createPermissionHandlingMethods(rpe))\n                .addTypes(createPermissionRequestClasses(rpe))\n                .build()\n    }\n\n    private fun createFields(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): List<FieldSpec> {\n        val fields = arrayListOf<FieldSpec>()\n        // The set of annotated elements needs to be ordered in order to achieve Deterministic, reproducible builds\n        rpe.needsElements.sortedBy { it.simpleString() }.forEach {\n            fields.add(createRequestCodeField(it, requestCodeProvider.nextRequestCode()))\n            fields.add(createPermissionField(it))\n            if (it.parameters.isNotEmpty()) {\n                val hasOnRationaleParams = rpe.findOnRationaleForNeeds(it)?.parameters?.isNotEmpty()\n                        ?: true\n                if (hasOnRationaleParams) {\n                    fields.add(createPendingRequestField(it))\n                } else {\n                    fields.addAll(createArgFields(it))\n                }\n            }\n        }\n        return fields\n    }\n\n    private fun createRequestCodeField(e: ExecutableElement, index: Int): FieldSpec {\n        return FieldSpec.builder(Int::class.java, requestCodeFieldName(e))\n                .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)\n                .initializer(\"\\$L\", index)\n                .build()\n    }\n\n    private fun createPermissionField(e: ExecutableElement): FieldSpec {\n        val permissionValue = e.getAnnotation(NeedsPermission::class.java).permissionValue()\n        val formattedValue: String = permissionValue.joinToString(\n                separator = \",\",\n                prefix = \"{\",\n                postfix = \"}\",\n                transform = { \"\\\"$it\\\"\" }\n        )\n        return FieldSpec.builder(ArrayTypeName.of(String::class.java), permissionFieldName(e))\n                .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)\n                .initializer(\"\\$N\", \"new String[] $formattedValue\")\n                .build()\n    }\n\n    private fun createPendingRequestField(e: ExecutableElement): FieldSpec {\n        return FieldSpec.builder(grantableRequest, pendingRequestFieldName(e))\n                .addModifiers(Modifier.PRIVATE, Modifier.STATIC)\n                .build()\n    }\n\n    private fun createArgFields(method: ExecutableElement): List<FieldSpec> {\n        return method.parameters.map {\n            FieldSpec.builder(typeNameOf(it), method.argumentFieldName(it))\n                    .addModifiers(Modifier.PRIVATE, Modifier.STATIC)\n                    .build()\n        }\n    }\n\n    private fun createConstructor(): MethodSpec {\n        return MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build()\n    }\n\n    private fun createWithPermissionCheckMethods(rpe: RuntimePermissionsElement): List<MethodSpec> {\n        return rpe.needsElements.map { createWithPermissionCheckMethod(rpe, it) }\n    }\n\n    private fun createWithPermissionCheckMethod(rpe: RuntimePermissionsElement, method: ExecutableElement): MethodSpec {\n        val targetParam = \"target\"\n        val builder = MethodSpec.methodBuilder(withPermissionCheckMethodName(method))\n                .addTypeVariables(rpe.typeVariables)\n                .addModifiers(Modifier.STATIC)\n                .returns(TypeName.VOID)\n                .addParameter(ParameterSpec.builder(rpe.typeName, targetParam).addAnnotation(NonNull::class.java).build())\n\n        method.parameters.forEach {\n            builder.addParameter(typeNameOf(it), it.simpleString())\n        }\n        addWithPermissionCheckBody(builder, method, rpe, targetParam)\n        return builder.build()\n    }\n\n    private fun addWithPermissionCheckBody(builder: MethodSpec.Builder, needsMethod: ExecutableElement, rpe: RuntimePermissionsElement, targetParam: String) {\n        // Create field names for the constants to use\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        val permissionField = permissionFieldName(needsMethod)\n\n        // if maxSdkVersion is lower than os level does nothing\n        val needsPermissionMaxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion\n        if (needsPermissionMaxSdkVersion > 0) {\n            builder.beginControlFlow(\"if (\\$T.VERSION.SDK_INT > \\$L)\", build, needsPermissionMaxSdkVersion)\n                    .addCode(CodeBlock.builder()\n                            .add(\"\\$N.\\$N(\", targetParam, needsMethod.simpleString())\n                            .add(varargsParametersCodeBlock(needsMethod))\n                            .addStatement(\")\")\n                            .addStatement(\"return\")\n                            .build())\n                    .endControlFlow()\n        }\n\n        // Add the conditional for when permission has already been granted\n        val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n        val activityVar = getActivityName(targetParam)\n        addWithCheckBodyMap[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, activityVar, permissionField)\n                ?: builder.beginControlFlow(\"if (\\$T.hasSelfPermissions(\\$N, \\$N))\", permissionUtils, activityVar, permissionField)\n        builder.addCode(CodeBlock.builder()\n                .add(\"\\$N.\\$N(\", targetParam, needsMethod.simpleString())\n                .add(varargsParametersCodeBlock(needsMethod))\n                .addStatement(\")\")\n                .build()\n        )\n        builder.nextControlFlow(\"else\")\n\n        // Add the conditional for \"OnShowRationale\", if present\n        val onRationale = rpe.findOnRationaleForNeeds(needsMethod)\n        val hasOnRationaleParams = onRationale?.parameters?.isNotEmpty() ?: true\n        val hasParameters = needsMethod.parameters.isNotEmpty()\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                // If the method has parameters, precede the potential OnRationale call with\n                // an instantiation of the temporary Request object\n                val varargsCall = CodeBlock.builder()\n                        .add(\"\\$N = new \\$N(\\$N, \",\n                                pendingRequestFieldName(needsMethod),\n                                permissionRequestTypeName(rpe, needsMethod),\n                                targetParam\n                        )\n                        .add(varargsParametersCodeBlock(needsMethod))\n                        .addStatement(\")\")\n                builder.addCode(varargsCall.build())\n            } else {\n                needsMethod.parameters.forEach {\n                    val varargsCall = CodeBlock.builder().addStatement(\n                            \"\\$N = \\$N\",\n                            needsMethod.argumentFieldName(it),\n                            it.simpleName)\n                    builder.addCode(varargsCall.build())\n                }\n            }\n        }\n        if (onRationale != null) {\n            addShouldShowRequestPermissionRationaleCondition(builder, targetParam, permissionField)\n            if (hasParameters) {\n                if (hasOnRationaleParams) {\n                    // For methods with parameters, use the PermissionRequest instantiated above\n                    builder.addStatement(\"\\$N.\\$N(\\$N)\", targetParam, onRationale.simpleString(), pendingRequestFieldName(needsMethod))\n                } else {\n                    builder.addStatement(\"\\$N.\\$N()\", targetParam, onRationale.simpleString())\n                }\n            } else {\n                if (hasOnRationaleParams) {\n                    // Otherwise, create a new PermissionRequest on-the-fly\n                    builder.addStatement(\"\\$N.\\$N(new \\$N(\\$N))\", targetParam, onRationale.simpleString(), permissionRequestTypeName(rpe, needsMethod), targetParam)\n                } else {\n                    builder.addStatement(\"\\$N.\\$N()\", targetParam, onRationale.simpleString())\n                }\n            }\n            builder.nextControlFlow(\"else\")\n        }\n\n        // Add the branch for \"request permission\"\n        addWithCheckBodyMap[needsPermissionParameter]?.addRequestPermissionsStatement(builder, targetParam, activityVar, requestCodeField)\n                ?: addRequestPermissionsStatement(builder, targetParam, permissionField, requestCodeField)\n        if (onRationale != null) {\n            builder.endControlFlow()\n        }\n        builder.endControlFlow()\n    }\n\n    private fun createPermissionHandlingMethods(rpe: RuntimePermissionsElement): List<MethodSpec> {\n        val methods = arrayListOf<MethodSpec>()\n        if (hasNormalPermission(rpe)) {\n            methods.add(createPermissionResultMethod(rpe))\n        }\n        if (isDefinePermission(rpe, systemAlertWindow) || isDefinePermission(rpe, writeSettings)) {\n            methods.add(createOnActivityResultMethod(rpe))\n        }\n        return methods\n    }\n\n    private fun createOnActivityResultMethod(rpe: RuntimePermissionsElement): MethodSpec {\n        val targetParam = \"target\"\n        val requestCodeParam = \"requestCode\"\n        val grantResultsParam = \"grantResults\"\n        val builder = MethodSpec.methodBuilder(\"onActivityResult\")\n                .addTypeVariables(rpe.typeVariables)\n                .addModifiers(Modifier.STATIC)\n                .returns(TypeName.VOID)\n                .addParameter(ParameterSpec.builder(rpe.typeName, targetParam).addAnnotation(NonNull::class.java).build())\n                .addParameter(TypeName.INT, requestCodeParam)\n\n        builder.beginControlFlow(\"switch (\\$N)\", requestCodeParam)\n        for (needsMethod in rpe.needsElements) {\n            val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n            if (!addWithCheckBodyMap.containsKey(needsPermissionParameter)) {\n                continue\n            }\n\n            builder.addCode(\"case \\$N:\\n\", requestCodeFieldName(needsMethod))\n\n            addResultCaseBody(builder, needsMethod, rpe, targetParam, grantResultsParam)\n        }\n\n        builder\n                .addCode(\"default:\\n\")\n                .addStatement(\"break\")\n                .endControlFlow()\n\n        return builder.build()\n    }\n\n    private fun createPermissionResultMethod(rpe: RuntimePermissionsElement): MethodSpec {\n        val targetParam = \"target\"\n        val requestCodeParam = \"requestCode\"\n        val grantResultsParam = \"grantResults\"\n        val builder = MethodSpec.methodBuilder(\"onRequestPermissionsResult\")\n                .addTypeVariables(rpe.typeVariables)\n                .addModifiers(Modifier.STATIC)\n                .returns(TypeName.VOID)\n                .addParameter(ParameterSpec.builder(rpe.typeName, targetParam).addAnnotation(NonNull::class.java).build())\n                .addParameter(TypeName.INT, requestCodeParam)\n                .addParameter(ArrayTypeName.of(TypeName.INT), grantResultsParam)\n\n        // For each @NeedsPermission method, add a switch case\n        builder.beginControlFlow(\"switch (\\$N)\", requestCodeParam)\n        for (needsMethod in rpe.needsElements) {\n            val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n            if (addWithCheckBodyMap.containsKey(needsPermissionParameter)) {\n                continue\n            }\n\n            builder.addCode(\"case \\$N:\\n\", requestCodeFieldName(needsMethod))\n\n            // Delegate switch-case generation to implementing classes\n            addResultCaseBody(builder, needsMethod, rpe, targetParam, grantResultsParam)\n        }\n\n        // Add the default case\n        builder\n                .addCode(\"default:\\n\")\n                .addStatement(\"break\")\n                .endControlFlow()\n\n        return builder.build()\n    }\n\n    private fun addResultCaseBody(builder: MethodSpec.Builder, needsMethod: ExecutableElement, rpe: RuntimePermissionsElement, targetParam: String, grantResultsParam: String) {\n        val onDenied = rpe.findOnDeniedForNeeds(needsMethod)\n        val hasDenied = onDenied != null\n        val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n        val permissionField = permissionFieldName(needsMethod)\n\n        // Add the conditional for \"permission verified\"\n        addWithCheckBodyMap[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, getActivityName(targetParam), permissionField)\n                ?: builder.beginControlFlow(\"if (\\$T.verifyPermissions(\\$N))\", permissionUtils, grantResultsParam)\n\n        // Based on whether or not the method has parameters, delegate to the \"pending request\" object or invoke the method directly\n        val onRationale = rpe.findOnRationaleForNeeds(needsMethod)\n        val hasOnRationaleParams = onRationale?.parameters?.isNotEmpty() ?: true\n        val hasParameters = needsMethod.parameters.isNotEmpty()\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                val pendingField = pendingRequestFieldName(needsMethod)\n                builder.beginControlFlow(\"if (\\$N != null)\", pendingField)\n                builder.addStatement(\"\\$N.grant()\", pendingField)\n                builder.endControlFlow()\n            } else {\n                builder.addCode(CodeBlock.builder()\n                        .add(\"\\$N.\\$N(\", targetParam, needsMethod.simpleString())\n                        .add(varargsParametersCodeBlock(needsMethod, withCache = true))\n                        .addStatement(\")\")\n                        .build())\n            }\n        } else {\n            builder.addStatement(\"target.\\$N()\", needsMethod.simpleString())\n        }\n\n        // Add the conditional for \"permission denied\" and/or \"never ask again\", if present\n        val onNeverAsk = rpe.findOnNeverAskForNeeds(needsMethod)\n        val hasNeverAsk = onNeverAsk != null\n\n        if (hasDenied || hasNeverAsk) {\n            builder.nextControlFlow(\"else\")\n        }\n        if (hasNeverAsk) {\n            // Split up the \"else\" case with another if condition checking for \"never ask again\" first\n            addShouldShowRequestPermissionRationaleCondition(builder, targetParam, permissionFieldName(needsMethod), false)\n            builder.addStatement(\"target.\\$N()\", onNeverAsk?.simpleString())\n            // If a \"permission denied\" is present as well, go into an else case, otherwise close this temporary branch\n            if (hasDenied) {\n                builder.nextControlFlow(\"else\")\n            } else {\n                builder.endControlFlow()\n            }\n        }\n        if (hasDenied) {\n            // Add the \"permissionDenied\" statement\n            builder.addStatement(\"\\$N.\\$N()\", targetParam, onDenied!!.simpleString())\n            // Close the additional control flow potentially opened by a \"never ask again\" method\n            if (hasNeverAsk) {\n                builder.endControlFlow()\n            }\n        }\n        // Close the \"switch\" control flow\n        builder.endControlFlow()\n\n        // Remove the temporary pending request field, in case it was used for a method with parameters\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                builder.addStatement(\"\\$N = null\", pendingRequestFieldName(needsMethod))\n            } else {\n                needsMethod.parameters.forEach {\n                    if (!typeNameOf(it).isPrimitive) {\n                        builder.addStatement(\"\\$N = null\", needsMethod.argumentFieldName(it))\n                    }\n                }\n            }\n        }\n        builder.addStatement(\"break\")\n    }\n\n    private fun hasNormalPermission(rpe: RuntimePermissionsElement): Boolean {\n        rpe.needsElements.forEach {\n            val permissionValue = it.getAnnotation(NeedsPermission::class.java).permissionValue()\n            if (!permissionValue.contains(systemAlertWindow) && !permissionValue.contains(writeSettings)) {\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun isDefinePermission(rpe: RuntimePermissionsElement, permissionName: String): Boolean {\n        rpe.needsElements.forEach {\n            val permissionValue = it.getAnnotation(NeedsPermission::class.java).permissionValue()\n            if (permissionValue.contains(permissionName)) {\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun createOnShowRationaleCallbackMethods(rpe: RuntimePermissionsElement): List<MethodSpec> {\n        val methods = arrayListOf<MethodSpec>()\n        rpe.needsElements.forEach {\n            val rationale = rpe.findOnRationaleForNeeds(it)\n            val isRationaleParamsEmpty = rationale?.parameters?.isEmpty() ?: false\n            if (isRationaleParamsEmpty) {\n                methods.add(createProceedPermissionRequestMethod(rpe, it))\n                val onDenied = rpe.findOnDeniedForNeeds(it)\n                if (onDenied != null) {\n                    methods.add(createCancelPermissionRequestMethod(rpe, onDenied, it))\n                }\n            }\n        }\n        return methods\n    }\n\n    private fun createProceedPermissionRequestMethod(rpe: RuntimePermissionsElement, needsMethod: ExecutableElement): MethodSpec {\n        val targetParam = \"target\"\n        val builder = MethodSpec.methodBuilder(needsMethod.proceedOnShowRationaleMethodName())\n                .addTypeVariables(rpe.typeVariables)\n                .addModifiers(Modifier.STATIC)\n                .returns(TypeName.VOID)\n                .addParameter(ParameterSpec.builder(rpe.typeName, targetParam).addAnnotation(NonNull::class.java).build())\n        val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n        val activityVar = getActivityName(targetParam)\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        addWithCheckBodyMap[needsPermissionParameter]?.addRequestPermissionsStatement(builder, targetParam, activityVar, requestCodeField)\n                ?: addRequestPermissionsStatement(builder, targetParam, permissionFieldName(needsMethod), requestCodeField)\n        return builder.build()\n    }\n\n    private fun createCancelPermissionRequestMethod(rpe: RuntimePermissionsElement, onDenied: ExecutableElement, needsMethod: ExecutableElement): MethodSpec {\n        return MethodSpec.methodBuilder(needsMethod.cancelOnShowRationaleMethodName())\n                .addTypeVariables(rpe.typeVariables)\n                .addModifiers(Modifier.STATIC)\n                .returns(TypeName.VOID)\n                .addParameter(ParameterSpec.builder(rpe.typeName, \"target\").addAnnotation(NonNull::class.java).build())\n                .addStatement(\"target.\\$N()\", onDenied.simpleString())\n                .build()\n    }\n\n    private fun createPermissionRequestClasses(rpe: RuntimePermissionsElement): List<TypeSpec> {\n        val classes = arrayListOf<TypeSpec>()\n        rpe.needsElements.forEach {\n            val onRationale = rpe.findOnRationaleForNeeds(it)\n            val hasOnRationaleParams = onRationale?.parameters?.isNotEmpty() ?: true\n            if (hasOnRationaleParams && (onRationale != null || it.parameters.isNotEmpty())) {\n                classes.add(createPermissionRequestClass(rpe, it))\n            }\n        }\n        return classes\n    }\n\n    private fun createPermissionRequestClass(rpe: RuntimePermissionsElement, needsMethod: ExecutableElement): TypeSpec {\n        // Select the superinterface of the generated class\n        // based on whether or not the annotated method has parameters\n        val hasParameters: Boolean = needsMethod.parameters.isNotEmpty()\n        val superInterfaceName: String = if (hasParameters) \"GrantableRequest\" else \"PermissionRequest\"\n\n        val targetType = rpe.typeName\n        val builder = TypeSpec.classBuilder(permissionRequestTypeName(rpe, needsMethod))\n                .addTypeVariables(rpe.typeVariables)\n                .addSuperinterface(ClassName.get(\"permissions.dispatcher\", superInterfaceName))\n                .addModifiers(Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)\n\n        // Add required fields to the target\n        val weakFieldName = \"weakTarget\"\n        val weakFieldType = ParameterizedTypeName.get(ClassName.get(\"java.lang.ref\", \"WeakReference\"), targetType)\n        builder.addField(weakFieldType, weakFieldName, Modifier.PRIVATE, Modifier.FINAL)\n        needsMethod.parameters.forEach {\n            builder.addField(typeNameOf(it), it.simpleString(), Modifier.PRIVATE, Modifier.FINAL)\n        }\n\n        // Add constructor\n        val targetParam = \"target\"\n        val constructorBuilder = MethodSpec.constructorBuilder()\n                .addModifiers(Modifier.PRIVATE)\n                .addParameter(ParameterSpec.builder(targetType, targetParam).addAnnotation(NonNull::class.java).build())\n                .addStatement(\"this.\\$L = new WeakReference<\\$T>(\\$N)\", weakFieldName, targetType, targetParam)\n        needsMethod.parameters.forEach {\n            val fieldName = it.simpleString()\n            constructorBuilder\n                    .addParameter(typeNameOf(it), fieldName)\n                    .addStatement(\"this.\\$L = \\$N\", fieldName, fieldName)\n        }\n        builder.addMethod(constructorBuilder.build())\n\n        // Add proceed() override\n        val proceedMethod: MethodSpec.Builder = MethodSpec.methodBuilder(\"proceed\")\n                .addAnnotation(Override::class.java)\n                .addModifiers(Modifier.PUBLIC)\n                .returns(TypeName.VOID)\n                .addStatement(\"\\$T target = \\$N.get()\", targetType, weakFieldName)\n                .addStatement(\"if (target == null) return\")\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        addWithCheckBodyMap[needsMethod.getAnnotation(NeedsPermission::class.java).value[0]]?.addRequestPermissionsStatement(proceedMethod, targetParam, getActivityName(targetParam), requestCodeField)\n                ?: addRequestPermissionsStatement(proceedMethod, targetParam, permissionFieldName(needsMethod), requestCodeField)\n        builder.addMethod(proceedMethod.build())\n\n        // Add cancel() override method\n        val cancelMethod: MethodSpec.Builder = MethodSpec.methodBuilder(\"cancel\")\n                .addAnnotation(Override::class.java)\n                .addModifiers(Modifier.PUBLIC)\n                .returns(TypeName.VOID)\n        val onDenied = rpe.findOnDeniedForNeeds(needsMethod)\n        if (onDenied != null) {\n            cancelMethod\n                    .addStatement(\"\\$T target = \\$N.get()\", targetType, weakFieldName)\n                    .addStatement(\"if (target == null) return\")\n                    .addStatement(\"target.\\$N()\", onDenied.simpleString())\n        }\n        builder.addMethod(cancelMethod.build())\n\n        // For classes with additional parameters, add a \"grant()\" method\n        if (hasParameters) {\n            val grantMethod: MethodSpec.Builder = MethodSpec.methodBuilder(\"grant\")\n                    .addAnnotation(Override::class.java)\n                    .addModifiers(Modifier.PUBLIC)\n                    .returns(TypeName.VOID)\n            grantMethod\n                    .addStatement(\"\\$T target = \\$N.get()\", targetType, weakFieldName)\n                    .addStatement(\"if (target == null) return\")\n\n            // Compose the call to the permission-protected method;\n            // since the number of parameters is variable, utilize the low-level CodeBlock here\n            // to compose the method call and its parameters\n            grantMethod.addCode(\n                    CodeBlock.builder()\n                            .add(\"target.\\$N(\", needsMethod.simpleString())\n                            .add(varargsParametersCodeBlock(needsMethod))\n                            .addStatement(\")\")\n                            .build()\n            )\n            builder.addMethod(grantMethod.build())\n        }\n        return builder.build()\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/JavaFragmentProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport com.squareup.javapoet.MethodSpec\nimport permissions.dispatcher.processor.util.typeMirrorOf\nimport javax.lang.model.type.TypeMirror\n\n/**\n * ProcessorUnit implementation for Fragment.\n */\nclass JavaFragmentProcessorUnit : JavaBaseProcessorUnit() {\n\n    override fun getTargetType(): TypeMirror = typeMirrorOf(\"androidx.fragment.app.Fragment\")\n\n    override fun getActivityName(targetParam: String): String = \"$targetParam.requireActivity()\"\n\n    override fun addShouldShowRequestPermissionRationaleCondition(builder: MethodSpec.Builder, targetParam: String, permissionField: String, isPositiveCondition: Boolean) {\n        builder.beginControlFlow(\"if (\\$N\\$T.shouldShowRequestPermissionRationale(\\$N, \\$N))\", if (isPositiveCondition) \"\" else \"!\", permissionUtils, targetParam, permissionField)\n    }\n\n    override fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, permissionField: String, requestCodeField: String) {\n        builder.addStatement(\"\\$N.requestPermissions(\\$N, \\$N)\", targetParam, permissionField, requestCodeField)\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/SensitivePermissionInterface.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport com.squareup.javapoet.MethodSpec\n\ninterface SensitivePermissionInterface {\n    fun addHasSelfPermissionsCondition(builder: MethodSpec.Builder, activityVar: String, permissionField: String)\n\n    fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, activityVar: String, requestCodeField: String)\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/SystemAlertWindowHelper.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport com.squareup.javapoet.ClassName\nimport com.squareup.javapoet.MethodSpec\n\nclass SystemAlertWindowHelper : SensitivePermissionInterface {\n    private val permissionUtils = ClassName.get(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val settings = ClassName.get(\"android.provider\", \"Settings\")\n    private val intent = ClassName.get(\"android.content\", \"Intent\")\n    private val uri = ClassName.get(\"android.net\", \"Uri\")\n\n    override fun addHasSelfPermissionsCondition(builder: MethodSpec.Builder, activityVar: String, permissionField: String) {\n        builder.beginControlFlow(\"if (\\$T.hasSelfPermissions(\\$N, \\$N) || \\$T.canDrawOverlays(\\$N))\", permissionUtils, activityVar, permissionField, settings, activityVar)\n    }\n\n    override fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, activityVar: String, requestCodeField: String) {\n        builder.addStatement(\"\\$T intent = new \\$T(\\$T.ACTION_MANAGE_OVERLAY_PERMISSION, \\$T.parse(\\\"package:\\\" + \\$N.getPackageName()))\", intent, intent, settings, uri, activityVar)\n        builder.addStatement(\"\\$N.startActivityForResult(intent, \\$N)\", targetParam, requestCodeField)\n    }\n\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/java/WriteSettingsHelper.kt",
    "content": "package permissions.dispatcher.processor.impl.java\n\nimport com.squareup.javapoet.ClassName\nimport com.squareup.javapoet.MethodSpec\n\nclass WriteSettingsHelper : SensitivePermissionInterface {\n    private val permissionUtils = ClassName.get(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val settings = ClassName.get(\"android.provider\", \"Settings\")\n    private val intent = ClassName.get(\"android.content\", \"Intent\")\n    private val uri = ClassName.get(\"android.net\", \"Uri\")\n\n    override fun addHasSelfPermissionsCondition(builder: MethodSpec.Builder, activityVar: String, permissionField: String) {\n        builder.beginControlFlow(\"if (\\$T.hasSelfPermissions(\\$N, \\$N) || \\$T.System.canWrite(\\$N))\", permissionUtils, activityVar, permissionField, settings, activityVar)\n    }\n\n    override fun addRequestPermissionsStatement(builder: MethodSpec.Builder, targetParam: String, activityVar: String, requestCodeField: String) {\n        builder.addStatement(\"\\$T intent = new \\$T(\\$T.ACTION_MANAGE_WRITE_SETTINGS, \\$T.parse(\\\"package:\\\" + \\$N.getPackageName()))\", intent, intent, settings, uri, activityVar)\n        builder.addStatement(\"\\$N.startActivityForResult(intent, \\$N)\", targetParam, requestCodeField)\n    }\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/KotlinActivityProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FunSpec\nimport permissions.dispatcher.processor.util.typeMirrorOf\nimport javax.lang.model.type.TypeMirror\n\n/**\n * [permissions.dispatcher.processor.KtProcessorUnit] implementation for Activity classes.\n */\nclass KotlinActivityProcessorUnit : KotlinBaseProcessorUnit() {\n\n    override fun getTargetType(): TypeMirror = typeMirrorOf(\"android.app.Activity\")\n\n    override fun getActivityName(targetParam: String): String = targetParam\n\n    override fun addShouldShowRequestPermissionRationaleCondition(builder: FunSpec.Builder, permissionField: String, isPositiveCondition: Boolean) {\n        val condition = if (isPositiveCondition) \"\" else \"!\"\n        builder.beginControlFlow(\"if (%L%T.shouldShowRequestPermissionRationale(%L, *%N))\", condition, permissionUtils, \"this\", permissionField)\n    }\n\n    override fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String, permissionField: String, requestCodeField: String) {\n        builder.addStatement(\"%T.requestPermissions(%L, %N, %N)\", ClassName(\"androidx.core.app\", \"ActivityCompat\"), targetParam, permissionField, requestCodeField)\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/KotlinBaseProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.*\nimport com.squareup.kotlinpoet.ParameterizedTypeName.Companion.plusParameter\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.processor.KtProcessorUnit\nimport permissions.dispatcher.processor.RequestCodeProvider\nimport permissions.dispatcher.processor.RuntimePermissionsElement\nimport permissions.dispatcher.processor.util.*\nimport javax.lang.model.element.ExecutableElement\n\n/**\n * Base class for [KtProcessorUnit] implementations.\n * <p>\n * This generates the parts of code independent from specific permission method signatures for different target objects.\n */\nabstract class KotlinBaseProcessorUnit : KtProcessorUnit {\n\n    protected val permissionUtils = ClassName(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val build = ClassName(\"android.os\", \"Build\")\n    private val intArray = ClassName(\"kotlin\", \"IntArray\")\n    private val weakReference = ClassName(\"java.lang.ref\", \"WeakReference\")\n    private val manifestWriteSettings = \"android.permission.WRITE_SETTINGS\"\n    private val manifestSystemAlertWindow = \"android.permission.SYSTEM_ALERT_WINDOW\"\n    private val addWithCheckBodyMap = hashMapOf(\n            manifestSystemAlertWindow to SystemAlertWindowHelper(),\n            manifestWriteSettings to WriteSettingsHelper())\n\n    abstract fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String = \"this\", permissionField: String, requestCodeField: String)\n\n    abstract fun addShouldShowRequestPermissionRationaleCondition(builder: FunSpec.Builder, permissionField: String, isPositiveCondition: Boolean = true)\n\n    abstract fun getActivityName(targetParam: String = \"this\"): String\n\n    override fun createFile(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): FileSpec {\n        return FileSpec.builder(rpe.packageName, rpe.generatedClassName)\n                .addComment(FILE_COMMENT)\n                .addAnnotation(createJvmNameAnnotation(rpe.generatedClassName))\n                .addProperties(createProperties(rpe, requestCodeProvider))\n                .addFunctions(createWithPermissionCheckFuns(rpe))\n                .addFunctions(createOnShowRationaleCallbackFuns(rpe))\n                .addFunctions(createPermissionHandlingFuns(rpe))\n                .addTypes(createPermissionRequestClasses(rpe))\n                .build()\n    }\n\n    private fun createJvmNameAnnotation(generatedClassName: String): AnnotationSpec {\n        return AnnotationSpec.builder(ClassName(\"\", \"JvmName\"))\n                .addMember(\"%S\", generatedClassName)\n                .build()\n    }\n\n    private fun createProperties(rpe: RuntimePermissionsElement, requestCodeProvider: RequestCodeProvider): List<PropertySpec> {\n        val properties = arrayListOf<PropertySpec>()\n        // The set of annotated elements needs to be ordered in order to achieve deterministic, reproducible builds\n        rpe.needsElements.sortedBy { it.simpleString() }.forEach {\n            properties.add(createRequestCodeProp(it, requestCodeProvider.nextRequestCode()))\n            properties.add(createPermissionProperty(it))\n            if (it.parameters.isNotEmpty()) {\n                val hasOnRationaleParams = rpe.findOnRationaleForNeeds(it)?.parameters?.isNotEmpty()\n                        ?: true\n                if (hasOnRationaleParams) {\n                    properties.add(createPendingRequestProperty(it))\n                } else {\n                    properties.addAll(createArgProps(it))\n                }\n            }\n        }\n        return properties\n    }\n\n    private fun createRequestCodeProp(e: ExecutableElement, index: Int): PropertySpec {\n        return PropertySpec.builder(requestCodeFieldName(e), Int::class.java, KModifier.CONST, KModifier.PRIVATE)\n                .initializer(\"%L\", index)\n                .build()\n    }\n\n    private fun createArgProps(method: ExecutableElement): List<PropertySpec> {\n        return method.parameters.map {\n            PropertySpec.builder(method.argumentFieldName(it), it.asPreparedType().copy(nullable = true), KModifier.PRIVATE)\n                    .mutable()\n                    .initializer(CodeBlock.of(\"null\"))\n                    .build()\n        }\n    }\n\n    private fun createPermissionProperty(e: ExecutableElement): PropertySpec {\n        val permissionValue = e.getAnnotation(NeedsPermission::class.java).permissionValue()\n        val formattedValue = permissionValue.joinToString(\n                separator = \", \",\n                transform = { \"\\\"$it\\\"\" }\n        )\n        val parameterType = ARRAY.plusParameter(ClassName(\"kotlin\", \"String\"))\n        return PropertySpec.builder(permissionFieldName(e), parameterType, KModifier.PRIVATE)\n                .initializer(\"arrayOf(%L)\", formattedValue)\n                .build()\n    }\n\n    private fun createPendingRequestProperty(e: ExecutableElement): PropertySpec {\n        val type = ClassName(\"permissions.dispatcher\", \"GrantableRequest\").copy(nullable = true)\n        return PropertySpec\n                .builder(pendingRequestFieldName(e), type, KModifier.PRIVATE)\n                .mutable()\n                .initializer(CodeBlock.of(\"null\"))\n                .build()\n    }\n\n    private fun createWithPermissionCheckFuns(rpe: RuntimePermissionsElement): List<FunSpec> {\n        return rpe.needsElements.map { createWithPermissionCheckFun(rpe, it) }\n    }\n\n    private fun createWithPermissionCheckFun(rpe: RuntimePermissionsElement, method: ExecutableElement): FunSpec {\n        val builder = FunSpec.builder(withPermissionCheckMethodName(method))\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .receiver(rpe.ktTypeName)\n        if (method.enclosingElement.isInternal) {\n            builder.addModifiers(KModifier.INTERNAL)\n        }\n        method.parameters.forEach {\n            builder.addParameter(it.simpleString(), it.asPreparedType())\n        }\n        addWithPermissionCheckBody(builder, method, rpe)\n        return builder.build()\n    }\n\n    private fun addWithPermissionCheckBody(builder: FunSpec.Builder, needsMethod: ExecutableElement, rpe: RuntimePermissionsElement) {\n        // Create field names for the constants to use\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        val permissionField = permissionFieldName(needsMethod)\n\n        // if maxSdkVersion is lower than os level does nothing\n        val maxSdkVersion = needsMethod.getAnnotation(NeedsPermission::class.java).maxSdkVersion\n        if (maxSdkVersion > 0) {\n            builder.beginControlFlow(\"if (%T.VERSION.SDK_INT > %L)\", build, maxSdkVersion)\n                    .addCode(CodeBlock.builder()\n                            .add(\"%N(\", needsMethod.simpleString())\n                            .add(varargsKtParametersCodeBlock(needsMethod))\n                            .addStatement(\")\")\n                            .addStatement(\"return\")\n                            .build())\n                    .endControlFlow()\n        }\n\n        // Add the conditional for when permission has already been granted\n        val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n        val activity = getActivityName()\n        addWithCheckBodyMap[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, activity, permissionField)\n                ?: builder.beginControlFlow(\"if (%T.hasSelfPermissions(%L, *%N))\", permissionUtils, activity, permissionField)\n        builder.addCode(CodeBlock.builder()\n                .add(\"%N(\", needsMethod.simpleString())\n                .add(varargsKtParametersCodeBlock(needsMethod))\n                .addStatement(\")\")\n                .build()\n        )\n        builder.nextControlFlow(\"else\")\n\n        // Add the conditional for \"OnShowRationale\", if present\n        val onRationale = rpe.findOnRationaleForNeeds(needsMethod)\n        val hasOnRationaleParams = onRationale?.parameters?.isNotEmpty() ?: true\n        val hasParameters = needsMethod.parameters.isNotEmpty()\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                // If the method has parameters, precede the potential OnRationale call with\n                // an instantiation of the temporary Request object\n                val varargsCall = CodeBlock.builder()\n                        .add(\"%N = %N(this, \",\n                                pendingRequestFieldName(needsMethod),\n                                permissionRequestTypeName(rpe, needsMethod)\n                        )\n                        .add(varargsKtParametersCodeBlock(needsMethod))\n                        .addStatement(\")\")\n                builder.addCode(varargsCall.build())\n            } else {\n                needsMethod.parameters.forEach {\n                    val code = CodeBlock.builder().addStatement(\"%N = %N\", needsMethod.argumentFieldName(it), it.simpleString())\n                    builder.addCode(code.build())\n                }\n            }\n        }\n        if (onRationale != null) {\n            addShouldShowRequestPermissionRationaleCondition(builder, permissionField)\n            if (hasParameters) {\n                if (hasOnRationaleParams) {\n                    // For methods with parameters, use the PermissionRequest instantiated above\n                    builder.addStatement(\"%N?.let { %N(it) }\", pendingRequestFieldName(needsMethod), onRationale.simpleString())\n                } else {\n                    builder.addStatement(\"%N()\", onRationale.simpleString())\n                }\n            } else {\n                if (hasOnRationaleParams) {\n                    // Otherwise, create a new PermissionRequest on-the-fly\n                    builder.addStatement(\"%N(%N(this))\", onRationale.simpleString(), permissionRequestTypeName(rpe, needsMethod))\n                } else {\n                    builder.addStatement(\"%N()\", onRationale.simpleString())\n                }\n            }\n            builder.nextControlFlow(\"else\")\n        }\n\n        addWithCheckBodyMap[needsPermissionParameter]?.addRequestPermissionsStatement(builder = builder, activityVar = getActivityName(), requestCodeField = requestCodeField)\n                ?: addRequestPermissionsStatement(builder = builder, permissionField = permissionField, requestCodeField = requestCodeField)\n        if (onRationale != null) {\n            builder.endControlFlow()\n        }\n        builder.endControlFlow()\n    }\n\n    private fun createOnShowRationaleCallbackFuns(rpe: RuntimePermissionsElement): List<FunSpec> {\n        val methods = arrayListOf<FunSpec>()\n        rpe.needsElements.forEach {\n            if (rpe.findOnRationaleForNeeds(it) != null) {\n                val rationale = rpe.findOnRationaleForNeeds(it)\n                val isRationaleParamsEmpty = rationale?.parameters?.isEmpty() ?: false\n                if (isRationaleParamsEmpty) {\n                    methods.add(createProceedPermissionRequestFun(rpe, it))\n                    val onDenied = rpe.findOnDeniedForNeeds(it)\n                    if (onDenied != null) {\n                        methods.add(createCancelPermissionRequestFun(rpe, onDenied, it))\n                    }\n                }\n            }\n        }\n        return methods\n    }\n\n    private fun createProceedPermissionRequestFun(rpe: RuntimePermissionsElement, needsMethod: ExecutableElement): FunSpec {\n        val builder = FunSpec.builder(needsMethod.proceedOnShowRationaleMethodName())\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .receiver(rpe.ktTypeName)\n        val targetParam = \"this\"\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        addWithCheckBodyMap[needsMethod.getAnnotation(NeedsPermission::class.java).value[0]]?.addRequestPermissionsStatement(builder, targetParam, getActivityName(targetParam), requestCodeField)\n                ?: addRequestPermissionsStatement(builder, targetParam, permissionFieldName(needsMethod), requestCodeField)\n        return builder.build()\n    }\n\n    private fun createCancelPermissionRequestFun(rpe: RuntimePermissionsElement, onDenied: ExecutableElement, needsMethod: ExecutableElement): FunSpec {\n        return FunSpec.builder(needsMethod.cancelOnShowRationaleMethodName())\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .receiver(rpe.ktTypeName)\n                .addStatement(\"this.%N()\", onDenied.simpleString())\n                .build()\n    }\n\n    private fun createPermissionHandlingFuns(rpe: RuntimePermissionsElement): List<FunSpec> {\n        val methods = arrayListOf<FunSpec>()\n        if (hasNormalPermission(rpe)) {\n            methods.add(createPermissionResultFun(rpe))\n        }\n        if (isDefinePermission(rpe, manifestSystemAlertWindow) || isDefinePermission(rpe, manifestWriteSettings)) {\n            methods.add(createOnActivityResultFun(rpe))\n        }\n        return methods\n    }\n\n    private fun createOnActivityResultFun(rpe: RuntimePermissionsElement): FunSpec {\n        val requestCodeParam = \"requestCode\"\n        val grantResultsParam = \"grantResults\"\n        val builder = FunSpec.builder(\"onActivityResult\")\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .receiver(rpe.ktTypeName)\n                .addParameter(requestCodeParam, INT)\n\n        if (rpe.element.isInternal) {\n            builder.addModifiers(KModifier.INTERNAL)\n        }\n\n        builder.beginControlFlow(\"when (%N)\", requestCodeParam)\n        for (needsMethod in rpe.needsElements) {\n            val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n            if (!addWithCheckBodyMap.containsKey(needsPermissionParameter)) {\n                continue\n            }\n            builder.beginControlFlow(\"%N ->\", requestCodeFieldName(needsMethod))\n            addResultCaseBody(builder, needsMethod, rpe, grantResultsParam)\n            builder.endControlFlow()\n        }\n\n        builder.endControlFlow()\n        return builder.build()\n    }\n\n    private fun createPermissionResultFun(rpe: RuntimePermissionsElement): FunSpec {\n        val requestCodeParam = \"requestCode\"\n        val grantResultsParam = \"grantResults\"\n        val builder = FunSpec.builder(\"onRequestPermissionsResult\")\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .receiver(rpe.ktTypeName)\n                .addParameter(requestCodeParam, INT)\n                .addParameter(grantResultsParam, intArray)\n\n        if (rpe.element.isInternal) {\n            builder.addModifiers(KModifier.INTERNAL)\n        }\n\n        builder.beginControlFlow(\"when (%N)\", requestCodeParam)\n        for (needsMethod in rpe.needsElements) {\n            val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n            if (addWithCheckBodyMap.containsKey(needsPermissionParameter)) {\n                continue\n            }\n            builder.beginControlFlow(\"%N ->\\n\", requestCodeFieldName(needsMethod))\n            addResultCaseBody(builder, needsMethod, rpe, grantResultsParam)\n            builder.endControlFlow()\n        }\n        builder.endControlFlow()\n        return builder.build()\n    }\n\n\n    private fun addResultCaseBody(builder: FunSpec.Builder, needsMethod: ExecutableElement, rpe: RuntimePermissionsElement, grantResultsParam: String) {\n        val onDenied = rpe.findOnDeniedForNeeds(needsMethod)\n        val hasDenied = onDenied != null\n        val needsPermissionParameter = needsMethod.getAnnotation(NeedsPermission::class.java).value[0]\n        val permissionField = permissionFieldName(needsMethod)\n\n        // Add the conditional for \"permission verified\"\n        val activity = getActivityName()\n        addWithCheckBodyMap[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, activity, permissionField)\n                ?: builder.beginControlFlow(\"if (%T.verifyPermissions(*%N))\", permissionUtils, grantResultsParam)\n\n        val onRationale = rpe.findOnRationaleForNeeds(needsMethod)\n        val hasOnRationaleParams = onRationale?.parameters?.isNotEmpty() ?: true\n        val hasParameters = needsMethod.parameters.isNotEmpty()\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                val pendingField = pendingRequestFieldName(needsMethod)\n                builder.addStatement(\"%N?.grant()\", pendingField)\n            } else {\n                addWithCheckBodyMap[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, activity, permissionField)\n                        ?: builder.beginControlFlow(\"if (%T.hasSelfPermissions(%L, *%N))\", permissionUtils, activity, permissionField)\n                builder.addCode(CodeBlock.builder()\n                        .add(\"%N(\", needsMethod.simpleString())\n                        .add(varargsKtParametersCodeBlock(needsMethod, withCache = true))\n                        .addStatement(\")\")\n                        .build())\n                builder.endControlFlow()\n            }\n        } else {\n            builder.addStatement(\"%N()\", needsMethod.simpleString())\n        }\n\n        // Add the conditional for \"permission denied\" and/or \"never ask again\", if present\n        val onNeverAsk = rpe.findOnNeverAskForNeeds(needsMethod)\n        val hasNeverAsk = onNeverAsk != null\n\n        if (hasDenied || hasNeverAsk) {\n            builder.nextControlFlow(\"else\")\n        }\n        if (onNeverAsk != null) {\n            // Split up the \"else\" case with another if condition checking for \"never ask again\" first\n            addShouldShowRequestPermissionRationaleCondition(builder, permissionFieldName(needsMethod), false)\n            builder.addStatement(\"%N()\", onNeverAsk.simpleString())\n\n            // If a \"permission denied\" is present as well, go into an else case, otherwise close this temporary branch\n            if (hasDenied) {\n                builder.nextControlFlow(\"else\")\n            } else {\n                builder.endControlFlow()\n            }\n        }\n        if (hasDenied) {\n            // Add the \"permissionDenied\" statement\n            builder.addStatement(\"%N()\", onDenied!!.simpleString())\n            // Close the additional control flow potentially opened by a \"never ask again\" method\n            if (hasNeverAsk) {\n                builder.endControlFlow()\n            }\n        }\n        // Close the \"switch\" control flow\n        builder.endControlFlow()\n\n        // Remove the temporary pending request field, in case it was used for a method with parameters\n        if (hasParameters) {\n            if (hasOnRationaleParams) {\n                builder.addStatement(\"%N = null\", pendingRequestFieldName(needsMethod))\n            } else {\n                needsMethod.parameters.forEach {\n                    builder.addStatement(\"%N = null\", needsMethod.argumentFieldName(it))\n                }\n            }\n        }\n    }\n\n    private fun hasNormalPermission(rpe: RuntimePermissionsElement): Boolean {\n        rpe.needsElements.forEach {\n            val permissionValue = it.getAnnotation(NeedsPermission::class.java).permissionValue()\n            if (!permissionValue.contains(manifestSystemAlertWindow) && !permissionValue.contains(manifestWriteSettings)) {\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun isDefinePermission(rpe: RuntimePermissionsElement, permissionName: String): Boolean {\n        rpe.needsElements.forEach {\n            val permissionValue: List<String> = it.getAnnotation(NeedsPermission::class.java).permissionValue()\n            if (permissionValue.contains(permissionName)) {\n                return true\n            }\n        }\n        return false\n    }\n\n    private fun createPermissionRequestClasses(rpe: RuntimePermissionsElement): List<TypeSpec> {\n        val classes = arrayListOf<TypeSpec>()\n        rpe.needsElements.forEach {\n            val onRationale = rpe.findOnRationaleForNeeds(it)\n            if (onRationale != null || it.parameters.isNotEmpty()) {\n                classes.add(createPermissionRequestClass(rpe, it))\n            }\n        }\n        return classes\n    }\n\n    private fun createPermissionRequestClass(rpe: RuntimePermissionsElement, needsMethod: ExecutableElement): TypeSpec {\n        // Select the superinterface of the generated class\n        // based on whether or not the annotated method has parameters\n        val hasParameters = needsMethod.parameters.isNotEmpty()\n        val superInterfaceName = if (hasParameters) \"GrantableRequest\" else \"PermissionRequest\"\n\n        val builder = TypeSpec.classBuilder(permissionRequestTypeName(rpe, needsMethod))\n                .addOriginatingElement(rpe.element)\n                .addTypeVariables(rpe.ktTypeVariables)\n                .addSuperinterface(ClassName(\"permissions.dispatcher\", superInterfaceName))\n                .addModifiers(KModifier.PRIVATE)\n\n        // Add required fields to the target\n        val propName = \"weakTarget\"\n        val parameterType = weakReference.plusParameter(rpe.ktTypeName)\n        val propertySpec = PropertySpec.builder(propName, parameterType, KModifier.PRIVATE)\n        propertySpec.initializer(\"%T(target)\", weakReference)\n        builder.addProperty(propertySpec.build())\n\n        needsMethod.parameters.forEach {\n            builder.addProperty(\n                    PropertySpec.builder(it.simpleString(), it.asPreparedType(), KModifier.PRIVATE)\n                            .initializer(CodeBlock.of(it.simpleString()))\n                            .build()\n            )\n        }\n\n        // Add constructor\n        val targetParam = \"target\"\n        val constructorSpec = FunSpec.constructorBuilder().addParameter(targetParam, rpe.ktTypeName)\n        needsMethod.parameters.forEach {\n            constructorSpec.addParameter(it.simpleString(), it.asPreparedType(), KModifier.PRIVATE)\n        }\n        builder.primaryConstructor(constructorSpec.build())\n\n        // Add proceed() override\n        val proceedFun = FunSpec.builder(\"proceed\")\n                .addOriginatingElement(rpe.element)\n                .addModifiers(KModifier.OVERRIDE)\n                .addStatement(\"val target = %N.get() ?: return\", propName)\n        val requestCodeField = requestCodeFieldName(needsMethod)\n        addWithCheckBodyMap[needsMethod.getAnnotation(NeedsPermission::class.java).value[0]]?.addRequestPermissionsStatement(proceedFun, targetParam, getActivityName(targetParam), requestCodeField)\n                ?: addRequestPermissionsStatement(proceedFun, targetParam, permissionFieldName(needsMethod), requestCodeField)\n        builder.addFunction(proceedFun.build())\n\n        // Add cancel() override method\n        val cancelFun = FunSpec.builder(\"cancel\")\n                .addOriginatingElement(rpe.element)\n                .addModifiers(KModifier.OVERRIDE)\n        val onDenied = rpe.findOnDeniedForNeeds(needsMethod)\n        if (onDenied != null) {\n            cancelFun\n                    .addStatement(\"val target = %N.get() ?: return\", propName)\n                    .addStatement(\"target.%N()\", onDenied.simpleString())\n        }\n        builder.addFunction(cancelFun.build())\n\n        // For classes with additional parameters, add a \"grant()\" method\n        if (hasParameters) {\n            val grantFun = FunSpec.builder(\"grant\")\n                    .addOriginatingElement(rpe.element)\n                    .addModifiers(KModifier.OVERRIDE)\n                    .addStatement(\"val target = %N.get() ?: return\", propName)\n\n            // Compose the call to the permission-protected method;\n            // since the number of parameters is variable, utilize the low-level CodeBlock here\n            // to compose the method call and its parameters\n            grantFun.addCode(\n                    CodeBlock.builder()\n                            .add(\"target.%N(\", needsMethod.simpleString())\n                            .add(varargsKtParametersCodeBlock(needsMethod))\n                            .addStatement(\")\")\n                            .build()\n            )\n            builder.addFunction(grantFun.build())\n        }\n        return builder.build()\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/KotlinFragmentProcessorUnit.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.FunSpec\nimport permissions.dispatcher.processor.util.typeMirrorOf\nimport javax.lang.model.type.TypeMirror\n\n/**\n * [permissions.dispatcher.processor.KtProcessorUnit] implementation for Fragments.\n */\nclass KotlinFragmentProcessorUnit : KotlinBaseProcessorUnit() {\n\n    override fun getTargetType(): TypeMirror = typeMirrorOf(\"androidx.fragment.app.Fragment\")\n\n    override fun getActivityName(targetParam: String): String = \"$targetParam.requireActivity()\"\n\n    override fun addShouldShowRequestPermissionRationaleCondition(builder: FunSpec.Builder, permissionField: String, isPositiveCondition: Boolean) {\n        val condition = if (isPositiveCondition) \"\" else \"!\"\n        builder.beginControlFlow(\"if (%L%T.shouldShowRequestPermissionRationale(%L, *%N))\", condition, permissionUtils, \"this\" /* Fragment */, permissionField)\n    }\n\n    override fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String, permissionField: String, requestCodeField: String) {\n        builder.addStatement(\"%L.requestPermissions(%L, %N)\", targetParam, permissionField, requestCodeField)\n    }\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/SensitivePermissionInterface.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.FunSpec\n\ninterface SensitivePermissionInterface {\n    fun addHasSelfPermissionsCondition(builder: FunSpec.Builder, activity: String, permissionField: String)\n\n    fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String = \"this\", activityVar: String, requestCodeField: String)\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/SystemAlertWindowHelper.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FunSpec\n\nclass SystemAlertWindowHelper : SensitivePermissionInterface {\n    private val permissionUtils = ClassName(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val settings = ClassName(\"android.provider\", \"Settings\")\n    private val intent = ClassName(\"android.content\", \"Intent\")\n    private val uri = ClassName(\"android.net\", \"Uri\")\n\n    override fun addHasSelfPermissionsCondition(builder: FunSpec.Builder, activity: String, permissionField: String) {\n        builder.beginControlFlow(\"if (%T.hasSelfPermissions(%L, *%N) || %T.canDrawOverlays(%L))\", permissionUtils, activity, permissionField, settings, activity)\n    }\n\n    override fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String, activityVar: String, requestCodeField: String) {\n        builder.addStatement(\"val intent = %T(%T.ACTION_MANAGE_OVERLAY_PERMISSION, %T.parse(\\\"package:\\\" + %L.getPackageName()))\", intent, settings, uri, activityVar)\n        builder.addStatement(\"%L.startActivityForResult(intent, %N)\", targetParam, requestCodeField)\n    }\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/impl/kotlin/WriteSettingsHelper.kt",
    "content": "package permissions.dispatcher.processor.impl.kotlin\n\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.FunSpec\n\nclass WriteSettingsHelper : SensitivePermissionInterface {\n    private val permissionUtils = ClassName(\"permissions.dispatcher\", \"PermissionUtils\")\n    private val settings = ClassName(\"android.provider\", \"Settings\")\n    private val intent = ClassName(\"android.content\", \"Intent\")\n    private val uri = ClassName(\"android.net\", \"Uri\")\n\n    override fun addHasSelfPermissionsCondition(builder: FunSpec.Builder, activity: String, permissionField: String) {\n        builder.beginControlFlow(\"if (%T.hasSelfPermissions(%L, *%N) || %T.System.canWrite(%L))\", permissionUtils, activity, permissionField, settings, activity)\n    }\n\n    override fun addRequestPermissionsStatement(builder: FunSpec.Builder, targetParam: String, activityVar: String, requestCodeField: String) {\n        builder.addStatement(\"val intent = %T(%T.ACTION_MANAGE_WRITE_SETTINGS, %T.parse(\\\"package:\\\" + %L.getPackageName()))\", intent, settings, uri, activityVar)\n        builder.addStatement(\"%L.startActivityForResult(intent, %N)\", targetParam, requestCodeField)\n    }\n}"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/util/Constants.kt",
    "content": "package permissions.dispatcher.processor.util\n\nconst val FILE_COMMENT = \"This file was generated by PermissionsDispatcher. Do not modify!\"\nconst val GEN_CLASS_SUFFIX = \"PermissionsDispatcher\"\nconst val GEN_REQUEST_CODE_PREFIX = \"REQUEST_\"\nconst val GEN_PERMISSION_PREFIX = \"PERMISSION_\"\nconst val GEN_PENDING_PREFIX = \"PENDING_\"\nconst val GEN_WITH_PERMISSION_CHECK_SUFFIX = \"WithPermissionCheck\"\nconst val GEN_PERMISSION_REQUEST_SUFFIX = \"PermissionRequest\"\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/util/Extensions.kt",
    "content": "package permissions.dispatcher.processor.util\n\nimport com.squareup.kotlinpoet.*\nimport com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.OnNeverAskAgain\nimport permissions.dispatcher.OnPermissionDenied\nimport permissions.dispatcher.OnShowRationale\nimport permissions.dispatcher.processor.TYPE_UTILS\nimport javax.lang.model.element.*\nimport javax.lang.model.type.TypeMirror\n\n/**\n * Returns the package name of a TypeElement.\n */\nfun TypeElement.packageName() = enclosingElement.packageName()\n\nprivate fun Element?.packageName(): String {\n    return when (this) {\n        is TypeElement -> packageName()\n        is PackageElement -> qualifiedName.toString()\n        else -> this?.enclosingElement?.packageName() ?: \"\"\n    }\n}\n\n// to address kotlin internal method try to remove `$module_name_build_variant` from element info.\n// ex: showCamera$sample_kotlin_debug → showCamera\ninternal fun String.trimDollarIfNeeded(): String {\n    val index = indexOf(\"$\")\n    return if (index == -1) this else substring(0, index)\n}\n\n/**\n * Returns the simple name of an Element as a string.\n */\nfun Element.simpleString() = this.simpleName.toString().trimDollarIfNeeded()\n\n/**\n * Returns the simple name of a TypeMirror as a string.\n */\nfun TypeMirror.simpleString(): String {\n    val toString: String = this.toString()\n    val indexOfDot: Int = toString.lastIndexOf('.')\n    return if (indexOfDot == -1) toString else toString.substring(indexOfDot + 1)\n}\n\n/**\n * Returns whether or not an Element is annotated with the provided Annotation class.\n */\nfun <A : Annotation> Element.hasAnnotation(annotationType: Class<A>): Boolean =\n        this.getAnnotation(annotationType) != null\n\n/**\n * Returns whether a variable is nullable by inspecting its annotations.\n */\nfun VariableElement.isNullable(): Boolean =\n        this.annotationMirrors\n                .asSequence()\n                .map { it.annotationType.simpleString() }\n                .toList()\n                .contains(\"Nullable\")\n\n/**\n * Maps a variable to its TypeName, applying necessary transformations\n * for Java primitive types & mirroring the variable's nullability settings.\n */\nfun VariableElement.asPreparedType(): TypeName =\n        this.asType()\n                .asTypeName()\n                .correctJavaTypeToKotlinType()\n                .mapToNullableTypeIf(this.isNullable())\n\n/**\n * Returns the inherent value() of a permission Annotation.\n * <p>\n * If this is invoked on an Annotation that's not defined by PermissionsDispatcher, this returns an empty list.\n */\nfun Annotation.permissionValue(): List<String> {\n    when (this) {\n        is NeedsPermission -> return this.value.asList()\n        is OnShowRationale -> return this.value.asList()\n        is OnPermissionDenied -> return this.value.asList()\n        is OnNeverAskAgain -> return this.value.asList()\n    }\n    return emptyList()\n}\n\n/**\n * Returns a list of enclosed elements annotated with the provided Annotations.\n */\nfun <A : Annotation> Element.childElementsAnnotatedWith(annotationClass: Class<A>): List<ExecutableElement> =\n        this.enclosedElements\n                .asSequence()\n                .filter { it.hasAnnotation(annotationClass) }\n                .map { it as ExecutableElement }\n                .toList()\n\n/**\n * Returns whether or not a TypeMirror is a subtype of the provided other TypeMirror.\n */\nfun TypeMirror.isSubtypeOf(ofType: TypeMirror): Boolean = TYPE_UTILS.isSubtype(this, ofType)\n\nfun FileSpec.Builder.addProperties(properties: List<PropertySpec>): FileSpec.Builder {\n    properties.forEach { addProperty(it) }\n    return this\n}\n\nfun FileSpec.Builder.addFunctions(functions: List<FunSpec>): FileSpec.Builder {\n    functions.forEach { addFunction(it) }\n    return this\n}\n\nfun FileSpec.Builder.addTypes(types: List<TypeSpec>): FileSpec.Builder {\n    types.forEach { addType(it) }\n    return this\n}\n\n/**\n * To avoid KotlinPoet bugs return java.lang.class when type name is in kotlin package.\n * TODO: Remove this method after being addressed on KotlinPoet side.\n */\nfun TypeName.correctJavaTypeToKotlinType(): TypeName {\n    return if (this is ParameterizedTypeName) {\n        val typeArguments = this.typeArguments.map { it.correctJavaTypeToKotlinType() }.toTypedArray()\n        val rawType = ClassName.bestGuess(this.rawType.correctJavaTypeToKotlinType().toString())\n        return rawType.parameterizedBy(*typeArguments)\n    } else when (toString()) {\n        \"java.lang.Byte\" -> ClassName(\"kotlin\", \"Byte\")\n        \"java.lang.Double\" -> ClassName(\"kotlin\", \"Double\")\n        \"java.lang.Object\" -> ClassName(\"kotlin\", \"Any\")\n        \"java.lang.String\" -> ClassName(\"kotlin\", \"String\")\n        \"java.util.Set\" -> ClassName(\"kotlin.collections\", \"MutableSet\")\n        \"java.util.List\" -> ClassName(\"kotlin.collections\", \"MutableList\")\n        // https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/599\n        // https://github.com/permissions-dispatcher/PermissionsDispatcher/issues/619\n        \"kotlin.ByteArray\", \"kotlin.collections.List\", \"kotlin.collections.Set\",\n        \"kotlin.collections.MutableList\", \"kotlin.collections.MutableSet\" -> this\n        else -> this\n    }\n}\n\n/**\n * Returns this TypeName as nullable or non-nullable based on the given condition.\n */\nfun TypeName.mapToNullableTypeIf(nullable: Boolean) = copy(nullable = nullable)\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/util/Helpers.kt",
    "content": "package permissions.dispatcher.processor.util\n\nimport com.squareup.javapoet.CodeBlock\nimport com.squareup.javapoet.TypeName\nimport kotlinx.metadata.ClassName\nimport kotlinx.metadata.Flag\nimport kotlinx.metadata.Flags\nimport kotlinx.metadata.KmClassVisitor\nimport kotlinx.metadata.jvm.KotlinClassHeader\nimport kotlinx.metadata.jvm.KotlinClassMetadata\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.processor.ELEMENT_UTILS\nimport permissions.dispatcher.processor.RuntimePermissionsElement\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.type.TypeMirror\n\nfun typeMirrorOf(className: String): TypeMirror = ELEMENT_UTILS.getTypeElement(className).asType()\n\nfun typeNameOf(it: Element): TypeName = TypeName.get(it.asType())\n\nfun requestCodeFieldName(e: ExecutableElement) = \"$GEN_REQUEST_CODE_PREFIX${e.simpleString().trimDollarIfNeeded().toUpperCase()}\"\n\nfun permissionFieldName(e: ExecutableElement) = \"$GEN_PERMISSION_PREFIX${e.simpleString().trimDollarIfNeeded().toUpperCase()}\"\n\nfun pendingRequestFieldName(e: ExecutableElement) = \"$GEN_PENDING_PREFIX${e.simpleString().trimDollarIfNeeded().toUpperCase()}\"\n\nfun withPermissionCheckMethodName(e: ExecutableElement) = \"${e.simpleString().trimDollarIfNeeded()}$GEN_WITH_PERMISSION_CHECK_SUFFIX\"\n\nfun Element.kotlinMetadata(): KotlinClassMetadata? =\n        getAnnotation(Metadata::class.java)?.run {\n            KotlinClassMetadata.read(KotlinClassHeader(kind, metadataVersion, data1, data2, extraString, packageName, extraInt))\n        }\n\nval Element.isInternal: Boolean\n    get() {\n        val classMetadata = kotlinMetadata()\n                as? KotlinClassMetadata.Class\n                ?: return false\n\n        var returnValue = false\n        classMetadata.accept(object : KmClassVisitor() {\n            override fun visit(flags: Flags, name: ClassName) {\n                if (Flag.IS_INTERNAL(flags)) {\n                    returnValue = true\n                }\n            }\n        })\n        return returnValue\n    }\n\nfun ExecutableElement.argumentFieldName(arg: Element) = \"${simpleString()}${arg.simpleString().capitalize()}\"\n\nfun ExecutableElement.proceedOnShowRationaleMethodName() = \"proceed${simpleString().trimDollarIfNeeded().capitalize()}$GEN_PERMISSION_REQUEST_SUFFIX\"\n\nfun ExecutableElement.cancelOnShowRationaleMethodName() = \"cancel${simpleString().trimDollarIfNeeded().capitalize()}$GEN_PERMISSION_REQUEST_SUFFIX\"\n\nfun permissionRequestTypeName(rpe: RuntimePermissionsElement, e: ExecutableElement) =\n        \"${rpe.inputClassName}${e.simpleString().trimDollarIfNeeded().capitalize()}$GEN_PERMISSION_REQUEST_SUFFIX\"\n\nfun <A : Annotation> findMatchingMethodForNeeds(needsElement: ExecutableElement, otherElements: List<ExecutableElement>, annotationType: Class<A>): ExecutableElement? {\n    val value: List<String> = needsElement.getAnnotation(NeedsPermission::class.java).permissionValue()\n    return otherElements.firstOrNull {\n        it.getAnnotation(annotationType).permissionValue() == value\n    }\n}\n\nfun varargsParametersCodeBlock(needsElement: ExecutableElement, withCache: Boolean = false): CodeBlock {\n    val varargsCall = CodeBlock.builder()\n    needsElement.parameters.forEachIndexed { i, it ->\n        val name = if (withCache) needsElement.argumentFieldName(it) else it.simpleString()\n        varargsCall.add(\"\\$L\", name)\n        if (i < needsElement.parameters.size - 1) {\n            varargsCall.add(\", \")\n        }\n    }\n    return varargsCall.build()\n}\n\nfun varargsKtParametersCodeBlock(needsElement: ExecutableElement, withCache: Boolean = false): com.squareup.kotlinpoet.CodeBlock {\n    val varargsCall = com.squareup.kotlinpoet.CodeBlock.builder()\n    needsElement.parameters.forEachIndexed { i, it ->\n        val name = if (withCache) \"${needsElement.argumentFieldName(it)}!!\" else it.simpleString()\n        varargsCall.add(\"%L\", name)\n        if (i < needsElement.parameters.size - 1) {\n            varargsCall.add(\", \")\n        }\n    }\n    return varargsCall.build()\n}\n"
  },
  {
    "path": "processor/src/main/kotlin/permissions/dispatcher/processor/util/Validators.kt",
    "content": "package permissions.dispatcher.processor.util\n\nimport permissions.dispatcher.OnNeverAskAgain\nimport permissions.dispatcher.processor.ProcessorUnit\nimport permissions.dispatcher.processor.RuntimePermissionsElement\nimport permissions.dispatcher.processor.TYPE_UTILS\nimport permissions.dispatcher.processor.exception.*\nimport java.util.*\nimport javax.lang.model.element.Element\nimport javax.lang.model.element.ExecutableElement\nimport javax.lang.model.element.Modifier\nimport javax.lang.model.type.TypeKind\nimport javax.lang.model.type.TypeMirror\n\nprivate const val WRITE_SETTINGS = \"android.permission.WRITE_SETTINGS\"\nprivate const val SYSTEM_ALERT_WINDOW = \"android.permission.SYSTEM_ALERT_WINDOW\"\n\n/**\n * Obtains the [ProcessorUnit] implementation for the provided element.\n * Raises an exception if no suitable implementation exists\n */\nfun <K> findAndValidateProcessorUnit(units: List<ProcessorUnit<K>>, element: Element): ProcessorUnit<K> {\n    val type = element.asType()\n    try {\n        return units.first { type.isSubtypeOf(it.getTargetType()) }\n    } catch (ex: NoSuchElementException) {\n        throw WrongClassException(type)\n    }\n}\n\n/**\n * Checks the elements in the provided list annotated with an annotation against duplicate values.\n * <p>\n * Raises an exception if any annotation value is found multiple times.\n */\nfun <A : Annotation> checkDuplicatedValue(items: List<ExecutableElement>, annotationClass: Class<A>) {\n    val allItems: HashSet<List<String>> = hashSetOf()\n    items.forEach {\n        val permissionValue = it.getAnnotation(annotationClass).permissionValue().sorted()\n        if (allItems.contains(permissionValue)) {\n            throw DuplicatedValueException(permissionValue, it, annotationClass)\n        } else {\n            allItems.add(permissionValue)\n        }\n    }\n}\n\n/**\n * Checks the elements in the provided list for elements.\n * <p>\n * Raises an exception if it doesn't contain any elements.\n */\nfun <A : Annotation> checkNotEmpty(items: List<ExecutableElement>, rpe: RuntimePermissionsElement, annotationClass: Class<A>) {\n    if (items.isEmpty()) {\n        throw NoAnnotatedMethodsException(rpe, annotationClass)\n    }\n}\n\n/**\n * Checks the elements in the provided list annotated with an annotation\n * against private modifiers.\n * <p>\n * Raises an exception if any element contains the \"private\" modifier.\n */\nfun <A : Annotation> checkPrivateMethods(items: List<ExecutableElement>, annotationClass: Class<A>) {\n    items.forEach {\n        if (it.modifiers.contains(Modifier.PRIVATE)) {\n            throw PrivateMethodException(it, annotationClass)\n        }\n    }\n}\n\n/**\n * Checks the return type of the elements in the provided list.\n * <p>\n * Raises an exception if any element specifies a return type other than 'void'.\n */\nfun checkMethodSignature(items: List<ExecutableElement>) {\n    items.forEach {\n        // Allow 'void' return type only\n        if (it.returnType.kind != TypeKind.VOID) {\n            throw WrongReturnTypeException(it)\n        }\n        // Allow methods without 'throws' declaration only\n        if (it.thrownTypes.isNotEmpty()) {\n            throw NoThrowsAllowedException(it)\n        }\n    }\n}\n\nfun checkMethodParameters(items: List<ExecutableElement>, numParams: Int, requiredType: TypeMirror? = null) {\n    items.forEach {\n        val params = it.parameters\n        if (numParams == 0 && params.isNotEmpty()) {\n            throw NoParametersAllowedException(it)\n        }\n        if (requiredType == null) {\n            return\n        }\n        if (numParams < params.size) {\n            throw WrongParametersException(it, numParams, requiredType)\n        }\n        // maximum params size is 1\n        params.forEach { param ->\n            if (!TYPE_UTILS.isSameType(param.asType(), requiredType)) {\n                throw WrongParametersException(it, numParams, requiredType)\n            }\n        }\n    }\n}\n\nfun <A : Annotation> checkMixPermissionType(items: List<ExecutableElement>, annotationClass: Class<A>) {\n    items.forEach {\n        val permissionValue = it.getAnnotation(annotationClass).permissionValue()\n        if (permissionValue.size > 1) {\n            if (permissionValue.contains(WRITE_SETTINGS)) {\n                throw MixPermissionTypeException(it, WRITE_SETTINGS)\n            } else if (permissionValue.contains(SYSTEM_ALERT_WINDOW)) {\n                throw MixPermissionTypeException(it, SYSTEM_ALERT_WINDOW)\n            }\n        }\n    }\n}\n\nfun checkSpecialPermissionsWithNeverAskAgain(items: List<ExecutableElement>, annotationClass: Class<OnNeverAskAgain> = OnNeverAskAgain::class.java) {\n    items.forEach {\n        val permissionValue = it.getAnnotation(annotationClass).permissionValue()\n        if (permissionValue.contains(WRITE_SETTINGS) || permissionValue.contains(SYSTEM_ALERT_WINDOW)) {\n            throw SpecialPermissionsWithNeverAskAgainException()\n        }\n    }\n}\n\nfun checkDuplicatedMethodName(items: List<ExecutableElement>) {\n    items.forEach { item ->\n        items.firstOrNull { it != item && it.simpleName == item.simpleName }?.let {\n            throw DuplicatedMethodNameException(item)\n        }\n    }\n}\n"
  },
  {
    "path": "processor/src/main/resources/META-INF/gradle/incremental.annotation.processors",
    "content": "permissions.dispatcher.processor.PermissionsProcessor,isolating"
  },
  {
    "path": "processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor",
    "content": "permissions.dispatcher.processor.PermissionsProcessor"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/KtProcessorTestSuite.kt",
    "content": "package permissions.dispatcher.processor\n\nimport kompile.testing.kotlinc\nimport org.intellij.lang.annotations.Language\nimport org.junit.Test\n\nclass KtProcessorTestSuite {\n    @Test\n    fun noPermissionActivity() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n\n        @RuntimePermissions\n        class MyActivity: Activity()\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Annotated class 'MyActivity' doesn't have any method annotated with '@NeedsPermission'\")\n    }\n\n    @Test\n    fun permissionWithNonVoidReturnType() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera(): Int {\n                return 0\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'showCamera()' must specify return type 'void', not 'int'\")\n    }\n\n    @Test\n    fun rationaleWithNonVoidReturnType() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnShowRationale\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            fun cameraRationale(): Int {\n                return 0\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraRationale()' must specify return type 'void', not 'int'\")\n    }\n\n    @Test\n    fun deniedWithNonVoidReturnType() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnPermissionDenied\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnPermissionDenied(Manifest.permission.CAMERA)\n            fun cameraDenied(): Int {\n                return 0\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraDenied()' must specify return type 'void', not 'int'\")\n    }\n\n    @Test\n    fun neverAskWithNonVoidReturnType() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.CAMERA)\n            fun cameraNeverAskAgain(): Int {\n                return 0\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraNeverAskAgain()' must specify return type 'void', not 'int'\")\n    }\n\n    @Test\n    fun rationaleWithWrongParameters() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnShowRationale\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            fun cameraRationale(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraRationale()' must has less than or equal to 1 size parameter and type of it is supposed to be 'PermissionRequest'\")\n    }\n\n    @Test\n    fun rationaleWithOneMoreParameters() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnShowRationale\n        import permissions.dispatcher.PermissionRequest\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            fun cameraRationale(request: PermissionRequest, request2: PermissionRequest) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraRationale()' must has less than or equal to 1 size parameter and type of it is supposed to be 'PermissionRequest'\")\n    }\n\n    @Test\n    fun deniedWithParameters() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnPermissionDenied\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnPermissionDenied(Manifest.permission.CAMERA)\n            fun cameraDenied(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraDenied()' must not have any parameters\")\n    }\n\n    @Test\n    fun neverAskWithParameters() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.CAMERA)\n            fun cameraNeverAskAgain(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraNeverAskAgain()' must not have any parameters\")\n    }\n\n    @Test\n    fun privatePermission() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            private fun showCamera() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'showCamera()' annotated with '@NeedsPermission' must not be private\")\n    }\n\n    @Test\n    fun privateRationale() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnShowRationale\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            private fun cameraRationale() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraRationale()' annotated with '@OnShowRationale' must not be private\")\n    }\n\n    @Test\n    fun privateDenied() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnPermissionDenied\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnPermissionDenied(Manifest.permission.CAMERA)\n            private fun cameraDenied(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraDenied()' annotated with '@OnPermissionDenied' must not be private\")\n    }\n\n    @Test\n    fun privateNeverAskAgain() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.CAMERA)\n            private fun cameraNeverAskAgain() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Method 'cameraNeverAskAgain()' annotated with '@OnNeverAskAgain' must not be private\")\n    }\n\n    @Test\n    fun wrongAnnotatedClass() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Service\n        import android.content.Intent\n        import android.os.IBinder\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n\n        @RuntimePermissions\n        class MyService: Service() {\n            override fun onBind(intent: Intent?): IBinder? = null\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"Class 'MyService' can't be annotated with '@RuntimePermissions'\")\n    }\n\n    @Test\n    fun duplicatedRationale() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnShowRationale\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            fun cameraRationale() {\n            }\n            @OnShowRationale(Manifest.permission.CAMERA)\n            fun cameraRationale2() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"[android.permission.CAMERA] is duplicated in 'cameraRationale2()' annotated with '@OnShowRationale'\")\n    }\n\n    @Test\n    fun duplicatedDenied() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnPermissionDenied\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnPermissionDenied(Manifest.permission.CAMERA)\n            fun cameraDenied(value: Int) {\n            }\n            @OnPermissionDenied(Manifest.permission.CAMERA)\n            fun cameraDenied2(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"[android.permission.CAMERA] is duplicated in 'cameraDenied2()' annotated with '@OnPermissionDenied'\")\n    }\n\n    @Test\n    fun duplicatedNeverAsk() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.CAMERA)\n            private fun cameraNeverAskAgain() {\n            }\n            @OnNeverAskAgain(Manifest.permission.CAMERA)\n            private fun cameraNeverAskAgain2() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"[android.permission.CAMERA] is duplicated in 'cameraNeverAskAgain2()' annotated with '@OnNeverAskAgain'\")\n    }\n\n    @Test\n    fun needsPermissionMethodOverload() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera(value: Int) {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"'showCamera()' has duplicated '@NeedsPermission' method. The method annotated with '@NeedsPermission' must has the unique name.\")\n    }\n\n    @Test\n    fun systemAlertWindowOnNerverAskAgain() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.SYSTEM_ALERT_WINDOW)\n            fun cameraNeverAskAgain() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"'@NeverAskAgain' annotated method never being called with 'WRITE_SETTINGS' or 'SYSTEM_ALERT_WINDOW' permission.\")\n    }\n\n    @Test\n    fun writeSettingsWithOnNeverAskAgain() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n        import permissions.dispatcher.OnNeverAskAgain\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\n            fun showCamera() {\n            }\n            @OnNeverAskAgain(Manifest.permission.WRITE_SETTINGS)\n            fun cameraNeverAskAgain() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .failed()\n                .withErrorContaining(\"'@NeverAskAgain' annotated method never being called with 'WRITE_SETTINGS' or 'SYSTEM_ALERT_WINDOW' permission.\")\n    }\n\n    @Test\n    fun compileValidCodeSuccessful() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import android.app.Activity\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n\n        @RuntimePermissions\n        class MyActivity: Activity() {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n        }\n        \"\"\".trimMargin()\n\n        @Language(\"kotlin\") val expected = \"\"\"\n        // This file was generated by PermissionsDispatcher. Do not modify!\n        @file:JvmName(\"MyActivityPermissionsDispatcher\")\n\n        import androidx.core.app.ActivityCompat\n        import kotlin.Array\n        import kotlin.Int\n        import kotlin.IntArray\n        import kotlin.String\n        import permissions.dispatcher.PermissionUtils\n\n        private const val REQUEST_SHOWCAMERA: Int = 0\n\n        private val PERMISSION_SHOWCAMERA: Array<String> = arrayOf(\"android.permission.CAMERA\")\n\n        fun MyActivity.showCameraWithPermissionCheck() {\n          if (PermissionUtils.hasSelfPermissions(this, *PERMISSION_SHOWCAMERA)) {\n            showCamera()\n          } else {\n            ActivityCompat.requestPermissions(this, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA)\n          }\n        }\n\n        fun MyActivity.onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {\n          when (requestCode) {\n            REQUEST_SHOWCAMERA ->\n             {\n              if (PermissionUtils.verifyPermissions(*grantResults)) {\n                showCamera()\n              }\n            }\n          }\n        }\n\n        \"\"\".trimIndent()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .succeededWithoutWarnings()\n                .generatedFile(\"MyActivityPermissionsDispatcher.kt\")\n                .hasSourceEquivalentTo(expected)\n    }\n\n    @Test\n    fun validInternalFragment() {\n        @Language(\"kotlin\") val source = \"\"\"\n        import android.Manifest\n        import androidx.fragment.app.Fragment\n        import permissions.dispatcher.RuntimePermissions\n        import permissions.dispatcher.NeedsPermission\n\n        @RuntimePermissions\n        internal class MyFragment : Fragment {\n            @NeedsPermission(Manifest.permission.CAMERA)\n            fun showCamera() {\n            }\n\n            @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n            fun systemAlertWindow() {\n            }\n        }\n        \"\"\".trimIndent()\n\n        @Language(\"kotlin\") val expected = \"\"\"\n        // This file was generated by PermissionsDispatcher. Do not modify!\n        @file:JvmName(\"MyFragmentPermissionsDispatcher\")\n\n        import android.content.Intent\n        import android.net.Uri\n        import android.provider.Settings\n        import kotlin.Array\n        import kotlin.Int\n        import kotlin.IntArray\n        import kotlin.String\n        import permissions.dispatcher.PermissionUtils\n\n        private const val REQUEST_SHOWCAMERA: Int = 0\n\n        private val PERMISSION_SHOWCAMERA: Array<String> = arrayOf(\"android.permission.CAMERA\")\n\n        private const val REQUEST_SYSTEMALERTWINDOW: Int = 1\n\n        private val PERMISSION_SYSTEMALERTWINDOW: Array<String> =\n            arrayOf(\"android.permission.SYSTEM_ALERT_WINDOW\")\n\n        internal fun MyFragment.showCameraWithPermissionCheck() {\n          if (PermissionUtils.hasSelfPermissions(this.requireActivity(), *PERMISSION_SHOWCAMERA)) {\n            showCamera()\n          } else {\n            this.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA)\n          }\n        }\n\n        internal fun MyFragment.systemAlertWindowWithPermissionCheck() {\n          if (PermissionUtils.hasSelfPermissions(this.requireActivity(), *PERMISSION_SYSTEMALERTWINDOW) ||\n              Settings.canDrawOverlays(this.requireActivity())) {\n            systemAlertWindow()\n          } else {\n            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\"package:\" +\n                this.requireActivity().getPackageName()))\n            this.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW)\n          }\n        }\n\n        internal fun MyFragment.onRequestPermissionsResult(requestCode: Int, grantResults: IntArray) {\n          when (requestCode) {\n            REQUEST_SHOWCAMERA ->\n             {\n              if (PermissionUtils.verifyPermissions(*grantResults)) {\n                showCamera()\n              }\n            }\n          }\n        }\n\n        internal fun MyFragment.onActivityResult(requestCode: Int) {\n          when (requestCode) {\n            REQUEST_SYSTEMALERTWINDOW -> {\n              if (PermissionUtils.hasSelfPermissions(this.requireActivity(), *PERMISSION_SYSTEMALERTWINDOW)\n                  || Settings.canDrawOverlays(this.requireActivity())) {\n                systemAlertWindow()\n              }\n            }\n          }\n        }\n\n        \"\"\".trimIndent()\n\n        kotlinc()\n                .withProcessors(PermissionsProcessor())\n                .addKotlin(\"sources.kt\", source)\n                .compile()\n                .succeededWithoutWarnings()\n                .generatedFile(\"MyFragmentPermissionsDispatcher.kt\")\n                .hasSourceEquivalentTo(expected)\n    }\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/ProcessorTestSuite.java",
    "content": "package permissions.dispatcher.processor;\n\nimport org.junit.Test;\nimport permissions.dispatcher.processor.base.TestSuite;\nimport permissions.dispatcher.processor.data.Source;\n\npublic class ProcessorTestSuite extends TestSuite {\n    @Test public void noPermissionActivity() {\n        expectRuntimeException(\"Annotated class 'MyActivity' doesn't have any method annotated with '@NeedsPermission'\");\n        assertJavaSource(Source.NoPermissionActivity);\n    }\n\n    @Test public void permissionWithNonVoidReturnType() {\n        expectRuntimeException(\"Method 'showCamera()' must specify return type 'void', not 'int'\");\n        assertJavaSource(Source.PermissionWithNonVoidReturnType);\n    }\n\n    @Test public void rationaleWithNonVoidReturnType() {\n        expectRuntimeException(\"Method 'cameraRationale()' must specify return type 'void', not 'int'\");\n        assertJavaSource(Source.RationaleWithNonVoidReturnType);\n    }\n\n    @Test public void deniedWithNonVoidReturnType() {\n        expectRuntimeException(\"Method 'onCameraDenied()' must specify return type 'void', not 'int'\");\n        assertJavaSource(Source.DeniedWithNonVoidReturnType);\n    }\n\n    @Test public void neverAskWithNonVoidReturnType() {\n        expectRuntimeException(\"Method 'onNeverAskForCamera()' must specify return type 'void', not 'int'\");\n        assertJavaSource(Source.NeverAskWithNonVoidReturnType);\n    }\n\n    @Test public void rationaleWithWrongParameters() {\n        expectRuntimeException(\"Method 'cameraRationale()' must has less than or equal to 1 size parameter and type of it is supposed to be 'PermissionRequest'\");\n        assertJavaSource(Source.RationaleWithWrongParameters);\n    }\n\n    @Test public void rationaleWithOneMoreParameters() {\n        expectRuntimeException(\"Method 'cameraRationale()' must has less than or equal to 1 size parameter and type of it is supposed to be 'PermissionRequest'\");\n        assertJavaSource(Source.RationaleWithOneMoreParameters);\n    }\n\n    @Test public void deniedWithParameters() {\n        expectRuntimeException(\"Method 'onCameraDenied()' must not have any parameters\");\n        assertJavaSource(Source.DeniedWithParameters);\n    }\n\n    @Test public void neverAskWithParameters() {\n        expectRuntimeException(\"Method 'onNeverAskForCamera()' must not have any parameters\");\n        assertJavaSource(Source.NeverAskWithParameters);\n    }\n\n    @Test public void permissionWithThrows() {\n        expectRuntimeException(\"Method 'showCamera()' must not have any 'throws' declaration in its signature\");\n        assertJavaSource(Source.PermissionWithThrows);\n    }\n\n    @Test public void rationaleWithThrows() {\n        expectRuntimeException(\"Method 'cameraRationale()' must not have any 'throws' declaration in its signature\");\n        assertJavaSource(Source.RationaleWithThrows);\n    }\n\n    @Test public void deniedWithThrows() {\n        expectRuntimeException(\"Method 'onCameraDenied()' must not have any 'throws' declaration in its signature\");\n        assertJavaSource(Source.DeniedWithThrows);\n    }\n\n    @Test public void neverAskWithThrows() {\n        expectRuntimeException(\"Method 'onNeverAskForCamera()' must not have any 'throws' declaration in its signature\");\n        assertJavaSource(Source.NeverAskWithThrows);\n    }\n\n    @Test public void privatePermission() {\n        expectRuntimeException(\"Method 'showCamera()' annotated with '@NeedsPermission' must not be private\");\n        assertJavaSource(Source.PrivatePermission);\n    }\n\n    @Test public void privateRationale() {\n        expectRuntimeException(\"Method 'cameraRationale()' annotated with '@OnShowRationale' must not be private\");\n        assertJavaSource(Source.PrivateRationale);\n    }\n\n    @Test public void privateDenied() {\n        expectRuntimeException(\"Method 'onCameraDenied()' annotated with '@OnPermissionDenied' must not be private\");\n        assertJavaSource(Source.PrivateDenied);\n    }\n\n    @Test public void privateNeverAsk() {\n        expectRuntimeException(\"Method 'onNeverAskForCamera()' annotated with '@OnNeverAskAgain' must not be private\");\n        assertJavaSource(Source.PrivateNeverAsk);\n    }\n\n    @Test public void wrongAnnotatedClass() {\n        expectRuntimeException(\"Class 'tests.MyService' can't be annotated with '@RuntimePermissions'\");\n        assertJavaSource(Source.WrongAnnotatedClass);\n    }\n\n    @Test public void duplicatedRationale() {\n        expectRuntimeException(\"[android.permission.CAMERA] is duplicated in 'cameraRationale2()' annotated with '@OnShowRationale'\");\n        assertJavaSource(Source.DuplicatedRationale);\n    }\n\n    @Test public void duplicatedDenied() {\n        expectRuntimeException(\"[android.permission.CAMERA] is duplicated in 'onCameraDenied2()' annotated with '@OnPermissionDenied'\");\n        assertJavaSource(Source.DuplicatedDenied);\n    }\n\n    @Test public void duplicatedNeverAsk() {\n        expectRuntimeException(\"[android.permission.CAMERA] is duplicated in 'onNeverAskForCamera2()' annotated with '@OnNeverAskAgain'\");\n        assertJavaSource(Source.DuplicatedNeverAsk);\n    }\n\n    @Test public void needsPermissionMethodOverload() {\n        expectRuntimeException(\"'showCamera()' has duplicated '@NeedsPermission' method. The method annotated with '@NeedsPermission' must has the unique name.\");\n        assertJavaSource(Source.needsPermissionMethodOverload);\n    }\n\n    @Test public void systemAlertWindowWithOnNeverAskAgain() {\n        expectRuntimeException(\"'@NeverAskAgain' annotated method never being called with 'WRITE_SETTINGS' or 'SYSTEM_ALERT_WINDOW' permission.\");\n        assertJavaSource(Source.systemAlertWindowWithOnNeverAskAgain);\n    }\n\n    @Test public void writeSettingsWithOnNeverAskAgain() {\n        expectRuntimeException(\"'@NeverAskAgain' annotated method never being called with 'WRITE_SETTINGS' or 'SYSTEM_ALERT_WINDOW' permission.\");\n        assertJavaSource(Source.writeSettingsWithOnNeverAskAgain);\n    }\n\n    @Test public void onePermissionActivity() {\n        assertJavaSource(Source.OnePermissionActivity);\n    }\n\n    @Test public void onePermissionSupportFragment() {\n        assertJavaSource(Source.OnePermissionSupportFragment);\n    }\n\n    @Test public void onePermissionWithParametersActivity() {\n        assertJavaSource(Source.OnePermissionWithParametersActivity);\n    }\n\n    @Test public void onePermissionWithParametersAndRationaleActivity() {\n        assertJavaSource(Source.OnePermissionWithParametersAndRationaleActivity);\n    }\n\n    @Test public void onePermissionWithParametersAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithParametersAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithParametersRationaleAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithParametersRationaleAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithParametersFragment() {\n        assertJavaSource(Source.OnePermissionWithParametersFragment);\n    }\n\n    @Test public void onePermissionWithParametersAndRationaleFragment() {\n        assertJavaSource(Source.OnePermissionWithParametersAndRationaleFragment);\n    }\n\n    @Test public void onePermissionWithParametersAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithParametersAndDeniedFragment);\n    }\n\n    @Test public void onePermissionWithParametersRationaleAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithParametersRationaleAndDeniedFragment);\n    }\n\n    @Test public void onePermissionWithNeverAskActivity() {\n        assertJavaSource(Source.OnePermissionWithNeverAskActivity);\n    }\n\n    @Test public void onePermissionWithNeverAskAndRationaleActivity() {\n        assertJavaSource(Source.OnePermissionWithNeverAskAndRationaleActivity);\n    }\n\n    @Test public void onePermissionWithNeverAskRationaleAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithNeverAskRationaleAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithNeverAskAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithNeverAskAndDeniedActivity);\n    }\n\n    @Test public void twoPermissionsWithNeverAskActivity() {\n        assertJavaSource(Source.TwoPermissionsWithNeverAskActivity);\n    }\n\n    @Test public void twoPermissionsActivity() {\n        assertJavaSource(Source.TwoPermissionsActivity);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureActivity() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureActivity);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureAndRationaleActivity() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureAndRationaleActivity);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureAndDeniedActivity() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureAndDeniedActivity);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureRationaleAndDeniedActivity() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureRationaleAndDeniedActivity);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureFragment() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureFragment);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureAndRationaleFragment() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureAndRationaleFragment);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureAndDeniedFragment() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureAndDeniedFragment);\n    }\n\n    @Test public void twoPermissionsWithSameSignatureRationaleAndDeniedFragment() {\n        assertJavaSource(Source.TwoPermissionsWithSameSignatureRationaleAndDeniedFragment);\n    }\n\n    @Test public void twoPermissionsAtOnceActivity() {\n        assertJavaSource(Source.TwoPermissionsAtOnceActivity);\n    }\n\n    @Test public void twoPermissionsFragment() {\n        assertJavaSource(Source.TwoPermissionsFragment);\n    }\n\n    @Test public void onePermissionWithNeverAskAndRationaleFragment() {\n        assertJavaSource(Source.OnePermissionWithNeverAskAndRationaleFragment);\n    }\n\n    @Test public void onePermissionWithNeverAskRationaleAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithNeverAskRationaleAndDeniedFragment);\n    }\n\n    @Test public void onePermissionWithNeverAskFragment() {\n        assertJavaSource(Source.OnePermissionWithNeverAskFragment);\n    }\n\n    @Test public void onePermissionWithNeverAskAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithNeverAskAndDeniedFragment);\n    }\n\n    @Test public void twoPermissionsWithTwoRationalesActivity() {\n        assertJavaSource(Source.TwoPermissionsWithTwoRationalesActivity);\n    }\n\n    @Test public void twoPermissionsWithTwoRationalesFragment() {\n        assertJavaSource(Source.TwoPermissionsWithTwoRationalesFragment);\n    }\n\n    @Test public void onePermissionWithOtherRationaleActivity() {\n        assertJavaSource(Source.OnePermissionWithOtherRationaleActivity);\n    }\n\n    @Test public void onePermissionWithOtherRationaleFragment() {\n        assertJavaSource(Source.OnePermissionWithOtherRationaleFragment);\n    }\n\n    @Test public void onePermissionWithOtherDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithOtherDeniedActivity);\n    }\n\n    @Test public void onePermissionWithOtherDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithOtherDeniedFragment);\n    }\n\n    @Test public void onePermissionWithRationaleAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithRationaleAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithRationaleAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithRationaleAndDeniedFragment);\n    }\n\n    @Test public void noDuplicatesDespiteRepeatedValuesActivity() {\n        // https://github.com/hotchemi/PermissionsDispatcher/issues/63\n        assertJavaSource(Source.NoDuplicatesDespiteRepeatedValuesActivity);\n    }\n\n    @Test public void validMaxSdkVersion() {\n        assertJavaSource(Source.ValidMaxSdkVersion);\n    }\n\n    @Test public void invalidMaxSdkVersion() {\n        assertJavaSource(Source.InValidMaxSdkVersion);\n    }\n\n    @Test public void writeSettingsFragment() {\n        assertJavaSource(Source.WriteSettingsFragment);\n    }\n\n    @Test public void writeSettingsActivity() {\n        assertJavaSource(Source.WriteSettingsActivity);\n    }\n\n    @Test public void systemAlertWindowFragment() {\n        assertJavaSource(Source.SystemAlertWindowFragment);\n    }\n\n    @Test public void systemAlertWindowActivity() {\n        assertJavaSource(Source.SystemAlertWindowActivity);\n    }\n\n    @Test public void mixSystemAlertWindowAndNormalPermissionCompileError() {\n        expectRuntimeException(\"Method 'systemAlertWindow()' defines 'android.permission.SYSTEM_ALERT_WINDOW' with other permissions at the same time.\");\n        assertJavaSource(Source.SystemAlertWindowMixPermissionCase);\n    }\n\n    @Test public void mixWriteSettingsAndNormalPermissionCompileError() {\n        expectRuntimeException(\"Method 'systemAlertWindow()' defines 'android.permission.WRITE_SETTINGS' with other permissions at the same time.\");\n        assertJavaSource(Source.WriteSettingsMixPermissionCase);\n    }\n\n    @Test public void mixSystemAlertWindowAndWriteSettingsPermissionCompileError() {\n        expectRuntimeException(\"Method 'systemAlertWindow()' defines 'android.permission.WRITE_SETTINGS' with other permissions at the same time.\");\n        assertJavaSource(Source.SystemAlertWindowAndWriteSettingsMixPermissionCase);\n    }\n\n    @Test public void systemAlertWindowGenericsActivity() {\n        assertJavaSource(Source.SystemAlertWindowGenericsActivity);\n    }\n\n    @Test public void systemAlertWindowSupportGenericsFragment() {\n        assertJavaSource(Source.SystemAlertWindowSupportGenericsFragment);\n    }\n\n    @Test public void nestedActivity() {\n        assertJavaSource(Source.NestedActivity);\n    }\n\n    @Test\n    public void nestedStaticActivity() {\n        assertJavaSource(Source.NestedStaticActivity);\n    }\n\n    @Test\n    public void nestedActivityWithDefaultPackage() {\n        assertJavaSource(Source.NestedActivityWithDefaultPackage);\n    }\n\n    @Test\n    public void nestedFragment() {\n        assertJavaSource(Source.NestedFragment);\n    }\n\n    @Test\n    public void nestedStaticFragment() {\n        assertJavaSource(Source.NestedStaticFragment);\n    }\n\n    @Test public void onePermissionWithNoArgumentRationaleActivity() {\n        assertJavaSource(Source.OnePermissionWithNoArgumentRationaleActivity);\n    }\n\n    @Test public void onePermissionWithNoArgumentRationaleAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithNoArgumentRationaleAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithParamNoArgumentRationaleAndDeniedActivity() {\n        assertJavaSource(Source.OnePermissionWithParamNoArgumentRationaleAndDeniedActivity);\n    }\n\n    @Test public void onePermissionWithNoArgumentRationaleFragment() {\n        assertJavaSource(Source.OnePermissionWithNoArgumentRationaleFragment);\n    }\n\n    @Test public void onePermissionWithNoArgumentRationaleAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithNoArgumentRationaleAndDeniedFragment);\n    }\n\n    @Test public void onePermissionWithParamNoArgumentRationaleAndDeniedFragment() {\n        assertJavaSource(Source.OnePermissionWithParamNoArgumentRationaleAndDeniedFragment);\n    }\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/base/AndroidAwareClassLoader.java",
    "content": "package permissions.dispatcher.processor.base;\n\nimport org.apache.commons.io.IOUtils;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.net.URLClassLoader;\nimport java.nio.charset.Charset;\n\n/**\n * Configures and provides access to a ClassLoader\n * which is used by our processor's unit tests, and\n * extends the system ClassLoader with Android-specific classes\n * provided through a test resource file.\n * <p>\n * It works closely with our AarToJarDependencyPlugin\n * and consumes the resource file generated by that plugin\n * to inject Android-specific code into the code generation tests,\n * so that they will compile properly.\n */\nfinal class AndroidAwareClassLoader {\n\n    private static final String TEST_CLASSPATH_FILE_NAME = \"/additional-test-classpath.txt\";\n\n    private AndroidAwareClassLoader() {\n        throw new AssertionError();\n    }\n\n    static ClassLoader create() {\n        try {\n            InputStream stream = AndroidAwareClassLoader.class.getResourceAsStream(TEST_CLASSPATH_FILE_NAME);\n            URL[] urls = IOUtils.readLines(stream, Charset.forName(\"UTF-8\"))\n                    .stream()\n                    .map(AndroidAwareClassLoader::unsafeToURL)\n                    .toArray(URL[]::new);\n\n            return new URLClassLoader(urls, ClassLoader.getSystemClassLoader());\n\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private static URL unsafeToURL(String spec) {\n        try {\n            return new URL(spec);\n        } catch (MalformedURLException e) {\n            throw new RuntimeException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/base/BaseTest.java",
    "content": "package permissions.dispatcher.processor.base;\n\nimport com.google.testing.compile.JavaFileObjects;\n\nimport javax.tools.JavaFileObject;\n\npublic abstract class BaseTest {\n\n    final JavaFileObject actual() {\n        return JavaFileObjects.forSourceLines(getName(), getActualSource());\n    }\n\n    final JavaFileObject expect() {\n        return JavaFileObjects.forSourceLines(getName() + \"PermissionsDispatcher\", getExpectSource());\n    }\n\n    protected abstract String getName();\n    protected abstract String[] getActualSource();\n    protected abstract String[] getExpectSource();\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/base/StringEquals.java",
    "content": "package permissions.dispatcher.processor.base;\n\nimport org.hamcrest.core.SubstringMatcher;\n\nfinal class StringEquals extends SubstringMatcher {\n\n    StringEquals(String substring) {\n        super(substring);\n    }\n\n    @Override\n    protected boolean evalSubstringOf(String string) {\n        // Strip Exception prefix from the string to only include the actual message\n        string = string.substring(string.indexOf(':') + 2);\n        return substring != null && substring.equals(string);\n    }\n\n    @Override\n    protected String relationship() {\n        return \"equals\";\n    }\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/base/TestSuite.java",
    "content": "package permissions.dispatcher.processor.base;\n\nimport org.junit.Rule;\nimport org.junit.rules.ExpectedException;\n\nimport permissions.dispatcher.processor.PermissionsProcessor;\n\nimport static com.google.common.truth.Truth.assert_;\nimport static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;\n\npublic abstract class TestSuite {\n\n    /* System ClassLoader, enhanced with Android support libraries */\n    private static final ClassLoader ANDROID_AWARE_CLASSLOADER = AndroidAwareClassLoader.create();\n\n    @Rule\n    public final ExpectedException expectedException = ExpectedException.none();\n\n    protected final void expectRuntimeException(final String message) {\n        expectedException.expect(RuntimeException.class);\n        expectedException.expectMessage(new StringEquals(message));\n    }\n\n    protected final void assertJavaSource(BaseTest test) {\n        assert_()\n                .about(javaSource())\n                .that(test.actual())\n                .withClasspathFrom(ANDROID_AWARE_CLASSLOADER)\n                .processedWith(new PermissionsProcessor())\n                .compilesWithoutError()\n                .and()\n                .generatesSources(test.expect());\n    }\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/data/Source.java",
    "content": "package permissions.dispatcher.processor.data;\n\nimport permissions.dispatcher.processor.base.BaseTest;\n\npublic final class Source {\n\n    private Source() {\n    }\n\n    private static final String[] EMPTY_SOURCE = {};\n\n    public static final BaseTest NoPermissionActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PermissionWithNonVoidReturnType = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   int showCamera() {\",\n                    \"       return 0;\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest RationaleWithNonVoidReturnType = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   int cameraRationale(PermissionRequest request) {\",\n                    \"       return 0;\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest NeverAskWithNonVoidReturnType = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   int onNeverAskForCamera() {\",\n                    \"       return 0;\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DeniedWithNonVoidReturnType = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   int onCameraDenied() {\",\n                    \"       return 0;\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest RationaleWithWrongParameters = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(int value) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest RationaleWithOneMoreParameters = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request, PermissionRequest request2) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DeniedWithParameters = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied(int value) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest NeverAskWithParameters = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera(int value) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PermissionWithThrows = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() throws Exception {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest RationaleWithThrows = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) throws Exception {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DeniedWithThrows = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied() throws Exception {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest NeverAskWithThrows = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() throws Exception {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PrivatePermission = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   private void showCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PrivateRationale = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   private void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PrivateDenied = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   private void onCameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest PrivateNeverAsk = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   private void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest WrongAnnotatedClass = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyService\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Service;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyService extends Service {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DuplicatedRationale = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale2(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DuplicatedDenied = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied2() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest DuplicatedNeverAsk = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera2() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest OnePermissionActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionSupportFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target, int value) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyActivityShowCameraPermissionRequest(target, value);\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target, int value) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"            this.value = value;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersAndRationaleActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target, int value) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyActivityShowCameraPermissionRequest(target, value);\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(PENDING_SHOWCAMERA);\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target, int value) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"            this.value = value;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target, int value) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyActivityShowCameraPermissionRequest(target, value);\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target, int value) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"            this.value = value;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target, int value) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyActivityShowCameraPermissionRequest(target, value);\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(PENDING_SHOWCAMERA);\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target, int value) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"            this.value = value;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskAndRationaleActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   } else {\",\n                    \"                       target.cameraDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   } else {\",\n                    \"                       target.cameraDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithNeverAskActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.READ_CONTACTS)\",\n                    \"   void accessContacts() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.READ_CONTACTS)\",\n                    \"   void onNeverAskForContacts() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_ACCESSCONTACTS = 0;\",\n                    \"   private static final String[] PERMISSION_ACCESSCONTACTS = new String[] {\\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void accessContactsWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"           target.accessContacts();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_ACCESSCONTACTS:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.accessContacts();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"                       target.onNeverAskForContacts();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.READ_CONTACTS)\",\n                    \"   void accessContacts() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_ACCESSCONTACTS = 0;\",\n                    \"   private static final String[] PERMISSION_ACCESSCONTACTS = new String[] {\\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void accessContactsWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"           target.accessContacts();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_ACCESSCONTACTS:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.accessContacts();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsAtOnceActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission({Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS})\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\", \\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.READ_CONTACTS)\",\n                    \"   void accessContacts() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_ACCESSCONTACTS = 0;\",\n                    \"   private static final String[] PERMISSION_ACCESSCONTACTS = new String[] {\\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void accessContactsWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_ACCESSCONTACTS)) {\",\n                    \"           target.accessContacts();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_ACCESSCONTACTS:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.accessContacts();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureAndRationaleActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCamera2PermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCamera2PermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCamera2PermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCamera2PermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCamera2PermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCamera2PermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskAndRationaleFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   } else {\",\n                    \"                       target.cameraDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNeverAskAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.CAMERA)\",\n                    \"   void onNeverAskForCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onNeverAskForCamera();\",\n                    \"                   } else {\",\n                    \"                       target.cameraDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value, String name) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target, int value, String name) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value, name);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyFragmentShowCameraPermissionRequest(target, value, name);\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private final String name;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target, int value, String name) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"            this.value = value;\",\n                    \"            this.name = name;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value, name);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersAndRationaleFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value, String name) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target, int value, String name) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value, name);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyFragmentShowCameraPermissionRequest(target, value, name);\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(PENDING_SHOWCAMERA);\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private final String name;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target, int value, String name) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"            this.value = value;\",\n                    \"            this.name = name;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value, name);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value, String name) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target, int value, String name) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value, name);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyFragmentShowCameraPermissionRequest(target, value, name);\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private final String name;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target, int value, String name) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"            this.value = value;\",\n                    \"            this.name = name;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value, name);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParametersRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(int value, String name) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.GrantableRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static GrantableRequest PENDING_SHOWCAMERA;\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target, int value, String name) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(value, name);\",\n                    \"       } else {\",\n                    \"           PENDING_SHOWCAMERA = new MyFragmentShowCameraPermissionRequest(target, value, name);\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(PENDING_SHOWCAMERA);\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   if (PENDING_SHOWCAMERA != null) {\",\n                    \"                       PENDING_SHOWCAMERA.grant();\",\n                    \"                   }\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               PENDING_SHOWCAMERA = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements GrantableRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private final int value;\",\n                    \"        private final String name;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target, int value, String name) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"            this.value = value;\",\n                    \"            this.name = name;\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void grant() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.showCamera(value, name);\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureAndRationaleFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCamera2PermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCamera2PermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCamera2PermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithSameSignatureRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera2() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA2 = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA2 = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showCamera2WithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA2)) {\",\n                    \"           target.showCamera2();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA2)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCamera2PermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWCAMERA2:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera2();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCamera2PermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCamera2PermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA2, REQUEST_SHOWCAMERA2);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.cameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithTwoRationalesActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.READ_CONTACTS)\",\n                    \"   void accessContacts() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.READ_CONTACTS)\",\n                    \"   void contactsRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_ACCESSCONTACTS = 0;\",\n                    \"   private static final String[] PERMISSION_ACCESSCONTACTS = new String[] {\\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void accessContactsWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"           target.accessContacts();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"               target.contactsRationale(new MyActivityAccessContactsPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_ACCESSCONTACTS:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.accessContacts();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyActivityAccessContactsPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityAccessContactsPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest TwoPermissionsWithTwoRationalesFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.READ_CONTACTS)\",\n                    \"   void accessContacts() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.READ_CONTACTS)\",\n                    \"   void contactsRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_ACCESSCONTACTS = 0;\",\n                    \"   private static final String[] PERMISSION_ACCESSCONTACTS = new String[] {\\\"android.permission.READ_CONTACTS\\\"};\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void accessContactsWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_ACCESSCONTACTS)) {\",\n                    \"           target.accessContacts();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_ACCESSCONTACTS)) {\",\n                    \"               target.contactsRationale(new MyFragmentAccessContactsPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_ACCESSCONTACTS:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.accessContacts();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentAccessContactsPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentAccessContactsPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_ACCESSCONTACTS, REQUEST_ACCESSCONTACTS);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithOtherRationaleActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.READ_CONTACTS)\",\n                    \"   void contactsRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithOtherRationaleFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.READ_CONTACTS)\",\n                    \"   void contactsRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithOtherDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.READ_CONTACTS)\",\n                    \"   void onContactsDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithOtherDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.READ_CONTACTS)\",\n                    \"   void onContactsDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyActivityShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.onCameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyActivityShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyActivity> weakTarget;\",\n                    \"        private MyActivityShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"            this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyActivity target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.onCameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale(PermissionRequest request) {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void onCameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale(new MyFragmentShowCameraPermissionRequest(target));\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.onCameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"   private static final class MyFragmentShowCameraPermissionRequest implements PermissionRequest {\",\n                    \"        private final WeakReference<MyFragment> weakTarget;\",\n                    \"        private MyFragmentShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"            this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void proceed() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"        }\",\n                    \"        @Override\",\n                    \"        public void cancel() {\",\n                    \"            MyFragment target = weakTarget.get();\",\n                    \"            if (target == null) return;\",\n                    \"            target.onCameraDenied();\",\n                    \"        }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest NoDuplicatesDespiteRepeatedValuesActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})\",\n                    \"   public void showCamera() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})\",\n                    \"   void onShowCameraDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})\",\n                    \"   void onShowCameraNeverAsk() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void showGetStorage() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageNeverAsk() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\", \\\"android.permission.WRITE_EXTERNAL_STORAGE\\\"};\",\n                    \"   private static final int REQUEST_SHOWGETSTORAGE = 1;\",\n                    \"   private static final String[] PERMISSION_SHOWGETSTORAGE = new String[] {\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void showGetStorageWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"           target.showGetStorage();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWGETSTORAGE, REQUEST_SHOWGETSTORAGE);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"                       target.onShowCameraNeverAsk();\",\n                    \"                   } else {\",\n                    \"                       target.onShowCameraDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           case REQUEST_SHOWGETSTORAGE:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showGetStorage();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"                       target.onGetStorageNeverAsk();\",\n                    \"                   } else {\",\n                    \"                       target.onGetStorageDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest ValidMaxSdkVersion = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)\",\n                    \"   void showGetStorage() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageNeverAsk() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.os.Build;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWGETSTORAGE = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWGETSTORAGE = new String[] {\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showGetStorageWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (Build.VERSION.SDK_INT > 18) {\",\n                    \"           target.showGetStorage();\",\n                    \"           return;\",\n                    \"       }\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"           target.showGetStorage();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWGETSTORAGE, REQUEST_SHOWGETSTORAGE);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWGETSTORAGE:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showGetStorage();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"                       target.onGetStorageNeverAsk();\",\n                    \"                   } else {\",\n                    \"                       target.onGetStorageDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest InValidMaxSdkVersion = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 0)\",\n                    \"   void showGetStorage() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageDenied() {\",\n                    \"   }\",\n                    \"   @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)\",\n                    \"   void onGetStorageNeverAsk() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWGETSTORAGE = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWGETSTORAGE = new String[] {\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showGetStorageWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"           target.showGetStorage();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWGETSTORAGE, REQUEST_SHOWGETSTORAGE);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWGETSTORAGE:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showGetStorage();\",\n                    \"               } else {\",\n                    \"                   if (!PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWGETSTORAGE)) {\",\n                    \"                       target.onGetStorageNeverAsk();\",\n                    \"                   } else {\",\n                    \"                       target.onGetStorageDenied();\",\n                    \"                   }\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest WriteSettingsFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettings() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_WRITESETTINGS = 0;\",\n                    \"  private static final String[] PERMISSION_WRITESETTINGS = new String[] {\\\"android.permission.WRITE_SETTINGS\\\"};\",\n                    \"  private MyFragmentPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static void writeSettingsWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_WRITESETTINGS) || Settings.System.canWrite(target.requireActivity())) {\",\n                    \"      target.writeSettings();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_WRITESETTINGS)) {\",\n                    \"        target.writeSettingOnShowRationale(new MyFragmentWriteSettingsPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_WRITESETTINGS);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static void onActivityResult(@NonNull MyFragment target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_WRITESETTINGS:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_WRITESETTINGS) || Settings.System.canWrite(target.requireActivity())) {\",\n                    \"        target.writeSettings();\",\n                    \"      } else {\",\n                    \"        target.writeSettingOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyFragmentWriteSettingsPermissionRequest implements PermissionRequest {\",\n                    \"    private final WeakReference<MyFragment> weakTarget;\",\n                    \"    private MyFragmentWriteSettingsPermissionRequest(@NonNull MyFragment target) {\",\n                    \"      this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyFragment target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_WRITESETTINGS);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyFragment target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.writeSettingOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_SYSTEMALERTWINDOW = 0;\",\n                    \"  private static final String[] PERMISSION_SYSTEMALERTWINDOW = new String[] {\\\"android.permission.SYSTEM_ALERT_WINDOW\\\"};\",\n                    \"  private MyFragmentPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static void systemAlertWindowWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target.requireActivity())) {\",\n                    \"      target.systemAlertWindow();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SYSTEMALERTWINDOW)) {\",\n                    \"        target.systemAlertWindowOnShowRationale(new MyFragmentSystemAlertWindowPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static void onActivityResult(@NonNull MyFragment target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_SYSTEMALERTWINDOW:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target.requireActivity())) {\",\n                    \"        target.systemAlertWindow();\",\n                    \"      } else {\",\n                    \"        target.systemAlertWindowOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyFragmentSystemAlertWindowPermissionRequest implements PermissionRequest {\",\n                    \"    private final WeakReference<MyFragment> weakTarget;\",\n                    \"    private MyFragmentSystemAlertWindowPermissionRequest(@NonNull MyFragment target) {\",\n                    \"      this.weakTarget = new WeakReference<MyFragment>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyFragment target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyFragment target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.systemAlertWindowOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\",\n            };\n        }\n    };\n\n    public static final BaseTest WriteSettingsActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettings() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingsOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingsOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_WRITESETTINGS = 0;\",\n                    \"  private static final String[] PERMISSION_WRITESETTINGS = new String[] {\\\"android.permission.WRITE_SETTINGS\\\"};\",\n                    \"  private MyActivityPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static void writeSettingsWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target, PERMISSION_WRITESETTINGS) || Settings.System.canWrite(target)) {\",\n                    \"      target.writeSettings();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_WRITESETTINGS)) {\",\n                    \"        target.writeSettingsOnShowRationale(new MyActivityWriteSettingsPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_WRITESETTINGS);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static void onActivityResult(@NonNull MyActivity target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_WRITESETTINGS:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target, PERMISSION_WRITESETTINGS) || Settings.System.canWrite(target)) {\",\n                    \"        target.writeSettings();\",\n                    \"      } else {\",\n                    \"        target.writeSettingsOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyActivityWriteSettingsPermissionRequest implements PermissionRequest {\",\n                    \"    private final WeakReference<MyActivity> weakTarget;\",\n                    \"    private MyActivityWriteSettingsPermissionRequest(@NonNull MyActivity target) {\",\n                    \"      this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyActivity target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_WRITESETTINGS);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyActivity target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.writeSettingsOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_SYSTEMALERTWINDOW = 0;\",\n                    \"  private static final String[] PERMISSION_SYSTEMALERTWINDOW = new String[] {\\\"android.permission.SYSTEM_ALERT_WINDOW\\\"};\",\n                    \"  private MyActivityPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static void systemAlertWindowWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target)) {\",\n                    \"      target.systemAlertWindow();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SYSTEMALERTWINDOW)) {\",\n                    \"        target.systemAlertWindowOnShowRationale(new MyActivitySystemAlertWindowPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static void onActivityResult(@NonNull MyActivity target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_SYSTEMALERTWINDOW:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target)) {\",\n                    \"        target.systemAlertWindow();\",\n                    \"      } else {\",\n                    \"        target.systemAlertWindowOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyActivitySystemAlertWindowPermissionRequest implements PermissionRequest {\",\n                    \"    private final WeakReference<MyActivity> weakTarget;\",\n                    \"    private MyActivitySystemAlertWindowPermissionRequest(@NonNull MyActivity target) {\",\n                    \"      this.weakTarget = new WeakReference<MyActivity>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyActivity target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyActivity target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.systemAlertWindowOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowSupportGenericsFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import java.lang.annotation.Annotation;\",\n                    \"import java.util.Map;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment<T, U extends Integer, V extends Map<? extends Annotation, ?>> extends Fragment {\",\n                    \"    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Integer;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.annotation.Annotation;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import java.util.Map;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_SYSTEMALERTWINDOW = 0;\",\n                    \"  private static final String[] PERMISSION_SYSTEMALERTWINDOW = new String[] {\\\"android.permission.SYSTEM_ALERT_WINDOW\\\"};\",\n                    \"  private MyFragmentPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static <T, U extends Integer, V extends Map<? extends Annotation, ?>> void systemAlertWindowWithPermissionCheck(@NonNull MyFragment<T, U, V> target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target.requireActivity())) {\",\n                    \"      target.systemAlertWindow();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SYSTEMALERTWINDOW)) {\",\n                    \"        target.systemAlertWindowOnShowRationale(new MyFragmentSystemAlertWindowPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static <T, U extends Integer, V extends Map<? extends Annotation, ?>> void onActivityResult(@NonNull MyFragment<T, U, V> target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_SYSTEMALERTWINDOW:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target.requireActivity())) {\",\n                    \"        target.systemAlertWindow();\",\n                    \"      } else {\",\n                    \"        target.systemAlertWindowOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyFragmentSystemAlertWindowPermissionRequest<T, U extends Integer, V extends Map<? extends Annotation, ?>> implements PermissionRequest {\",\n                    \"    private final WeakReference<MyFragment<T, U, V>> weakTarget;\",\n                    \"    private MyFragmentSystemAlertWindowPermissionRequest(@NonNull MyFragment<T, U, V> target) {\",\n                    \"      this.weakTarget = new WeakReference<MyFragment<T, U, V>>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyFragment<T, U, V> target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.requireActivity().getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyFragment<T, U, V> target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.systemAlertWindowOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\",\n            };\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowGenericsActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import java.lang.annotation.Annotation;\",\n                    \"import java.util.Map;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity<T, U extends Integer, V extends Map<? extends Annotation, ?>> extends Activity {\",\n                    \"    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.content.Intent;\",\n                    \"import android.net.Uri;\",\n                    \"import android.provider.Settings;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.Integer;\",\n                    \"import java.lang.Override;\",\n                    \"import java.lang.String;\",\n                    \"import java.lang.annotation.Annotation;\",\n                    \"import java.lang.ref.WeakReference;\",\n                    \"import java.util.Map;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"  private static final int REQUEST_SYSTEMALERTWINDOW = 0;\",\n                    \"  private static final String[] PERMISSION_SYSTEMALERTWINDOW = new String[] {\\\"android.permission.SYSTEM_ALERT_WINDOW\\\"};\",\n                    \"  private MyActivityPermissionsDispatcher() {\",\n                    \"  }\",\n                    \"  static <T, U extends Integer, V extends Map<? extends Annotation, ?>> void systemAlertWindowWithPermissionCheck(@NonNull MyActivity<T, U, V> target) {\",\n                    \"    if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target)) {\",\n                    \"      target.systemAlertWindow();\",\n                    \"    } else {\",\n                    \"      if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SYSTEMALERTWINDOW)) {\",\n                    \"        target.systemAlertWindowOnShowRationale(new MyActivitySystemAlertWindowPermissionRequest(target));\",\n                    \"      } else {\",\n                    \"        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"        target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"  static <T, U extends Integer, V extends Map<? extends Annotation, ?>> void onActivityResult(@NonNull MyActivity<T, U, V> target, int requestCode) {\",\n                    \"    switch (requestCode) {\",\n                    \"      case REQUEST_SYSTEMALERTWINDOW:\",\n                    \"      if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SYSTEMALERTWINDOW) || Settings.canDrawOverlays(target)) {\",\n                    \"        target.systemAlertWindow();\",\n                    \"      } else {\",\n                    \"        target.systemAlertWindowOnPermissionDenied();\",\n                    \"      }\",\n                    \"      break;\",\n                    \"      default:\",\n                    \"      break;\",\n                    \"    }\",\n                    \"  }\",\n                    \"  private static final class MyActivitySystemAlertWindowPermissionRequest<T, U extends Integer, V extends Map<? extends Annotation, ?>> implements PermissionRequest {\",\n                    \"    private final WeakReference<MyActivity<T, U, V>> weakTarget;\",\n                    \"    private MyActivitySystemAlertWindowPermissionRequest(@NonNull MyActivity<T, U, V> target) {\",\n                    \"      this.weakTarget = new WeakReference<MyActivity<T, U, V>>(target);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void proceed() {\",\n                    \"      MyActivity<T, U, V> target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\\\"package:\\\" + target.getPackageName()));\",\n                    \"      target.startActivityForResult(intent, REQUEST_SYSTEMALERTWINDOW);\",\n                    \"    }\",\n                    \"    @Override\",\n                    \"    public void cancel() {\",\n                    \"      MyActivity<T, U, V> target = weakTarget.get();\",\n                    \"      if (target == null) return;\",\n                    \"      target.systemAlertWindowOnPermissionDenied();\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowMixPermissionCase = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"    @NeedsPermission({Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.INTERNET})\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return null;\n        }\n    };\n\n    public static final BaseTest WriteSettingsMixPermissionCase = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"    @NeedsPermission({Manifest.permission.WRITE_SETTINGS, Manifest.permission.INTERNET})\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return null;\n        }\n    };\n\n    public static final BaseTest SystemAlertWindowAndWriteSettingsMixPermissionCase = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"    @NeedsPermission({Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.WRITE_SETTINGS})\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return null;\n        }\n    };\n\n    public static final BaseTest NestedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"Foo\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"public class Foo {\",\n                    \"  public class Bar {\",\n                    \"    @RuntimePermissions\",\n                    \"    public class MyActivity extends Activity {\",\n                    \"      @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"      void showCamera() {\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull Foo.Bar.MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull Foo.Bar.MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest NestedStaticActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"Foo\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"public class Foo {\",\n                    \"  @RuntimePermissions\",\n                    \"  public static class MyActivity extends Activity {\",\n                    \"    @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"    void showCamera() {\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull Foo.MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull Foo.MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest NestedActivityWithDefaultPackage = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"Foo\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"public class Foo {\",\n                    \"  public class Bar {\",\n                    \"    @RuntimePermissions\",\n                    \"    public class MyActivity extends Activity {\",\n                    \"      @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"      void showCamera() {\",\n                    \"      }\",\n                    \"    }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull Foo.Bar.MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull Foo.Bar.MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest NestedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"Foo\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"public class Foo {\",\n                    \"  @RuntimePermissions\",\n                    \"  public class MyFragment extends Fragment {\",\n                    \"     @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"     void showCamera() {\",\n                    \"     }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull Foo.MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull Foo.MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest NestedStaticFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"Foo\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"public class Foo {\",\n                    \"  @RuntimePermissions\",\n                    \"  public static class MyFragment extends Fragment {\",\n                    \"     @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"     void showCamera() {\",\n                    \"     }\",\n                    \"  }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private  MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull Foo.MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull Foo.MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest needsPermissionMethodOverload = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   public void showCamera() {\",\n                    \"   }\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   public void showCamera(int foo) {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest systemAlertWindowWithOnNeverAskAgain = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindow() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnNeverAskAgain(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnNeverAskAgain() {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\",\n                    \"    void systemAlertWindowOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest writeSettingsWithOnNeverAskAgain = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package test;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnNeverAskAgain;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.PermissionRequest;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettings() {\",\n                    \"    }\",\n                    \"    @OnShowRationale(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingOnShowRationale(PermissionRequest request) {\",\n                    \"    }\",\n                    \"    @OnNeverAskAgain(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingOnNeverAskAgain() {\",\n                    \"    }\",\n                    \"    @OnPermissionDenied(Manifest.permission.WRITE_SETTINGS)\",\n                    \"    void writeSettingOnPermissionDenied() {\",\n                    \"    }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return EMPTY_SOURCE;\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNoArgumentRationaleActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"       ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNoArgumentRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"       ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void cancelShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"       target.cameraDenied();\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithParamNoArgumentRationaleAndDeniedActivity = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyActivity\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import android.app.Activity;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyActivity extends Activity {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(String arg) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import androidx.core.app.ActivityCompat;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyActivityPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static String showCameraArg;\",\n                    \"   private MyActivityPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyActivity target, String arg) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(arg);\",\n                    \"       } else {\",\n                    \"           showCameraArg = arg;\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"       ActivityCompat.requestPermissions(target, PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void cancelShowCameraPermissionRequest(@NonNull MyActivity target) {\",\n                    \"       target.cameraDenied();\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyActivity target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera(showCameraArg);\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               showCameraArg = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNoArgumentRationaleFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"       target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n\n    public static final BaseTest OnePermissionWithNoArgumentRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera() {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera();\",\n                    \"       } else {\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"       target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void cancelShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"       target.cameraDenied();\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera();\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n    public static final BaseTest OnePermissionWithParamNoArgumentRationaleAndDeniedFragment = new BaseTest() {\n        @Override\n        protected String getName() {\n            return \"MyFragment\";\n        }\n\n        @Override\n        protected String[] getActualSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import android.Manifest;\",\n                    \"import androidx.fragment.app.Fragment;\",\n                    \"import permissions.dispatcher.RuntimePermissions;\",\n                    \"import permissions.dispatcher.NeedsPermission;\",\n                    \"import permissions.dispatcher.OnShowRationale;\",\n                    \"import permissions.dispatcher.OnPermissionDenied;\",\n                    \"@RuntimePermissions\",\n                    \"public class MyFragment extends Fragment {\",\n                    \"   @NeedsPermission(Manifest.permission.CAMERA)\",\n                    \"   void showCamera(String arg) {\",\n                    \"   }\",\n                    \"   @OnShowRationale(Manifest.permission.CAMERA)\",\n                    \"   void cameraRationale() {\",\n                    \"   }\",\n                    \"   @OnPermissionDenied(Manifest.permission.CAMERA)\",\n                    \"   void cameraDenied() {\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n\n        @Override\n        protected String[] getExpectSource() {\n            return new String[]{\n                    \"package tests;\",\n                    \"import androidx.annotation.NonNull;\",\n                    \"import java.lang.String;\",\n                    \"import permissions.dispatcher.PermissionUtils;\",\n                    \"final class MyFragmentPermissionsDispatcher {\",\n                    \"   private static final int REQUEST_SHOWCAMERA = 0;\",\n                    \"   private static final String[] PERMISSION_SHOWCAMERA = new String[] {\\\"android.permission.CAMERA\\\"};\",\n                    \"   private static String showCameraArg;\",\n                    \"   private MyFragmentPermissionsDispatcher() {\",\n                    \"   }\",\n                    \"   static void showCameraWithPermissionCheck(@NonNull MyFragment target, String arg) {\",\n                    \"       if (PermissionUtils.hasSelfPermissions(target.requireActivity(), PERMISSION_SHOWCAMERA)) {\",\n                    \"           target.showCamera(arg);\",\n                    \"       } else {\",\n                    \"           showCameraArg = arg;\",\n                    \"           if (PermissionUtils.shouldShowRequestPermissionRationale(target, PERMISSION_SHOWCAMERA)) {\",\n                    \"               target.cameraRationale();\",\n                    \"           } else {\",\n                    \"               target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"           }\",\n                    \"       }\",\n                    \"   }\",\n                    \"   static void proceedShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"       target.requestPermissions(PERMISSION_SHOWCAMERA, REQUEST_SHOWCAMERA);\",\n                    \"   }\",\n                    \"   static void cancelShowCameraPermissionRequest(@NonNull MyFragment target) {\",\n                    \"       target.cameraDenied();\",\n                    \"   }\",\n                    \"   static void onRequestPermissionsResult(@NonNull MyFragment target, int requestCode, int[] grantResults) {\",\n                    \"       switch (requestCode) {\",\n                    \"           case REQUEST_SHOWCAMERA:\",\n                    \"               if (PermissionUtils.verifyPermissions(grantResults)) {\",\n                    \"                   target.showCamera(showCameraArg);\",\n                    \"               } else {\",\n                    \"                   target.cameraDenied();\",\n                    \"               }\",\n                    \"               showCameraArg = null;\",\n                    \"               break;\",\n                    \"           default:\",\n                    \"               break;\",\n                    \"       }\",\n                    \"   }\",\n                    \"}\"\n            };\n        }\n    };\n}\n"
  },
  {
    "path": "processor/src/test/java/permissions/dispatcher/processor/util/ExtensionsTest.kt",
    "content": "package permissions.dispatcher.processor.util\n\nimport com.squareup.kotlinpoet.ClassName\nimport com.squareup.kotlinpoet.ParameterizedTypeName\nimport com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy\nimport com.squareup.kotlinpoet.TypeName\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.mockito.Mockito.`when`\nimport org.mockito.Mockito.mock\n\nclass ExtensionsTest {\n    @Test\n    fun `java Byte being converted into kotlin Byte`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"java.lang.Byte\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.Byte\")\n    }\n\n    @Test\n    fun `java Double being converted into kotlin Double`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"java.lang.Double\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.Double\")\n    }\n\n    @Test\n    fun `java Object being converted into kotlin Any`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"java.lang.Object\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.Any\")\n    }\n\n    @Test\n    fun `java String being converted into kotlin String`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"java.lang.String\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.String\")\n    }\n\n    @Test\n    fun `java String in parameter being converted into kotlin String`() {\n        val parameterizedTypeName = mock(ParameterizedTypeName::class.java)\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"java.lang.String\")\n        `when`(parameterizedTypeName.rawType).thenReturn(ClassName.bestGuess(\"kotlin.collections.List\"))\n        `when`(parameterizedTypeName.typeArguments).thenReturn(listOf(typeName))\n\n        val expected = parameterizedTypeName.correctJavaTypeToKotlinType() as ParameterizedTypeName\n        expected.typeArguments.first().toString()\n        assertEquals( expected.typeArguments.first().toString(), \"kotlin.String\")\n    }\n\n    @Test\n    fun `kotlin ByteArray retains its type`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"kotlin.ByteArray\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.ByteArray\")\n    }\n\n    @Test\n    fun `kotlin List retains its type`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"kotlin.collections.List\")\n        val expected = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(expected, \"kotlin.collections.List\")\n    }\n\n    @Test\n    fun `kotlin Set retains its type`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"kotlin.collections.Set\")\n        val actual = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(\"kotlin.collections.Set\", actual)\n    }\n\n    @Test\n    fun `kotlin MutableList retains its type`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"kotlin.collections.MutableList\")\n        val actual = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(\"kotlin.collections.MutableList\", actual)\n    }\n\n    @Test\n    fun `kotlin MutableSet retains its type`() {\n        val typeName = mock(TypeName::class.java)\n        `when`(typeName.toString()).thenReturn(\"kotlin.collections.MutableSet\")\n        val actual = typeName.correctJavaTypeToKotlinType().toString()\n        assertEquals(\"kotlin.collections.MutableSet\", actual)\n    }\n\n    @Test\n    fun `java List being converted into kotlin MutableList`() {\n        val string = ClassName.bestGuess(\"kotlin.String\")\n        val set = ClassName(\"java.util\", \"List\")\n        val actual = set.parameterizedBy(string).correctJavaTypeToKotlinType().toString()\n        assertEquals(\"kotlin.collections.MutableList<kotlin.String>\", actual)\n    }\n\n    @Test\n    fun `java Set being converted into kotlin MutableSet`() {\n        val string = ClassName.bestGuess(\"kotlin.String\")\n        val set = ClassName(\"java.util\", \"Set\")\n        val actual = set.parameterizedBy(string).correctJavaTypeToKotlinType().toString()\n        assertEquals(\"kotlin.collections.MutableSet<kotlin.String>\", actual)\n    }\n\n}"
  },
  {
    "path": "processor/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker",
    "content": "mock-maker-inline"
  },
  {
    "path": "sample/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "sample/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\n\nandroid {\n    compileSdkVersion COMPILE_SDK_VERSION\n    defaultConfig {\n        applicationId \"permissions.dispatcher.sample\"\n        targetSdkVersion TARGET_SDK_VERSION\n        minSdkVersion MIN_SDK_VERSION\n        versionCode 1\n        versionName \"1.0\"\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    sourceSets {\n        main.java.srcDirs += \"src/main/kotlin\"\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION\"\n    implementation \"androidx.appcompat:appcompat:$ANDROIDX_LIBRARY_VERSION\"\n    implementation project(':library')\n    kapt project(':processor')\n}\n"
  },
  {
    "path": "sample/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"permissions.dispatcher.sample\">\n\n    <uses-permission android:name=\"android.permission.CAMERA\" />\n    <uses-permission android:name=\"android.permission.READ_CONTACTS\" />\n    <uses-permission android:name=\"android.permission.WRITE_CONTACTS\" />\n\n    <application\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\"\n        tools:ignore=\"GoogleAppIndexingWarning\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "sample/src/main/kotlin/permissions/dispatcher/sample/MainActivity.kt",
    "content": "package permissions.dispatcher.sample\n\nimport android.Manifest\nimport android.os.Bundle\nimport android.widget.Button\nimport android.widget.Toast\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\nimport permissions.dispatcher.sample.camera.CameraPreviewFragment\nimport permissions.dispatcher.sample.contacts.ContactsFragment\n\n@RuntimePermissions\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        val buttonCamera: Button = findViewById(R.id.button_camera)\n        buttonCamera.setOnClickListener {\n            showCameraWithPermissionCheck()\n        }\n        val buttonContacts: Button = findViewById(R.id.button_contacts)\n        buttonContacts.setOnClickListener {\n            showContactsWithPermissionCheck()\n        }\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        // NOTE: delegate the permission handling to generated method\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera() {\n        // NOTE: Perform action that requires the permission. If this is run by PermissionsDispatcher, the permission will have been granted\n        supportFragmentManager.beginTransaction()\n                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())\n                .addToBackStack(\"camera\")\n                .commitAllowingStateLoss()\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    fun onCameraDenied() {\n        // NOTE: Deal with a denied permission, e.g. by showing specific UI\n        // or disabling certain functionality\n        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show()\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    fun showRationaleForCamera(request: PermissionRequest) {\n        // NOTE: Show a rationale to explain why the permission is needed, e.g. with a dialog.\n        // Call proceed() or cancel() on the provided PermissionRequest to continue or abort\n        showRationaleDialog(R.string.permission_camera_rationale, request)\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    fun onCameraNeverAskAgain() {\n        Toast.makeText(this, R.string.permission_camera_never_ask_again, Toast.LENGTH_SHORT).show()\n    }\n\n    @NeedsPermission(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)\n    fun showContacts() {\n        // NOTE: Perform action that requires the permission.\n        // If this is run by PermissionsDispatcher, the permission will have been granted\n        supportFragmentManager.beginTransaction()\n                .replace(R.id.sample_content_fragment, ContactsFragment.newInstance())\n                .addToBackStack(\"contacts\")\n                .commitAllowingStateLoss()\n    }\n\n    @OnPermissionDenied(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)\n    fun onContactsDenied() {\n        // NOTE: Deal with a denied permission, e.g. by showing specific UI\n        // or disabling certain functionality\n        Toast.makeText(this, R.string.permission_contacts_denied, Toast.LENGTH_SHORT).show()\n    }\n\n    @OnShowRationale(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)\n    fun showRationaleForContacts(request: PermissionRequest) {\n        // NOTE: Show a rationale to explain why the permission is needed, e.g. with a dialog.\n        // Call proceed() or cancel() on the provided PermissionRequest to continue or abort\n        showRationaleDialog(R.string.permission_contacts_rationale, request)\n    }\n\n    @OnNeverAskAgain(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)\n    fun onContactsNeverAskAgain() {\n        Toast.makeText(this, R.string.permission_contacts_never_ask_again, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun showRationaleDialog(@StringRes messageResId: Int, request: PermissionRequest) {\n        AlertDialog.Builder(this)\n                .setPositiveButton(R.string.button_allow) { _, _ -> request.proceed() }\n                .setNegativeButton(R.string.button_deny) { _, _ -> request.cancel() }\n                .setCancelable(false)\n                .setMessage(messageResId)\n                .show()\n    }\n}\n"
  },
  {
    "path": "sample/src/main/kotlin/permissions/dispatcher/sample/camera/CameraPreview.kt",
    "content": "package permissions.dispatcher.sample.camera\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.hardware.Camera\nimport android.util.Log\nimport android.view.Surface\nimport android.view.SurfaceHolder\nimport android.view.SurfaceView\n\nimport java.io.IOException\nimport kotlin.properties.Delegates\n\n/**\n * Camera preview that displays a [Camera].\n\n * Handles basic lifecycle methods to display and stop the preview.\n *\n *\n * Implementation is based directly on the documentation at\n * http://developer.android.com/guide/topics/media/camera.html\n */\n@SuppressLint(\"ViewConstructor\")\nclass CameraPreview(context: Context,\n                    camera: Camera,\n                    cameraInfo: Camera.CameraInfo,\n                    displayOrientation: Int) : SurfaceView(context), SurfaceHolder.Callback {\n    private val mHolder: SurfaceHolder\n    private var mCamera: Camera by Delegates.notNull()\n    private var mCameraInfo: Camera.CameraInfo by Delegates.notNull()\n    private var mDisplayOrientation: Int = 0\n\n    init {\n        setCamera(camera, cameraInfo, displayOrientation)\n\n        // Install a SurfaceHolder.Callback so we get notified when the\n        // underlying surface is created and destroyed.\n        mHolder = holder\n        mHolder.addCallback(this)\n    }\n\n    override fun surfaceCreated(holder: SurfaceHolder) {\n        // The Surface has been created, now tell the camera where to draw the preview.\n        try {\n            mCamera.setPreviewDisplay(holder)\n            mCamera.startPreview()\n            Log.d(TAG, \"Camera preview started.\")\n        } catch (e: IOException) {\n            Log.d(TAG, \"Error setting camera preview: \" + e.message)\n        }\n\n    }\n\n    override fun surfaceDestroyed(holder: SurfaceHolder) {\n        // empty. Take care of releasing the Camera preview in your activity.\n    }\n\n    override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {\n        // If your preview can change or rotate, take care of those events here.\n        // Make sure to stop the preview before resizing or reformatting it.\n\n        mHolder.takeIf { it.surface != null }?.let{\n            // stop preview before making changes\n            try {\n                mCamera.stopPreview()\n                Log.d(TAG, \"Preview stopped.\")\n            } catch (e: Exception) {\n                // ignore: tried to stop a non-existent preview\n                Log.d(TAG, \"Error starting camera preview: \" + e.message)\n            }\n\n            val orientation = calculatePreviewOrientation(mCameraInfo, mDisplayOrientation)\n            mCamera.setDisplayOrientation(orientation)\n\n            try {\n                mCamera.setPreviewDisplay(it)\n                mCamera.startPreview()\n                Log.d(TAG, \"Camera preview started.\")\n            } catch (e: Exception) {\n                Log.d(TAG, \"Error starting camera preview: \" + e.message)\n            }\n        } ?: let {\n            // preview surface does not exist\n            Log.d(TAG, \"Preview surface does not exist\")\n        }\n    }\n\n    fun setCamera(camera: Camera,\n                  cameraInfo: Camera.CameraInfo,\n                  displayOrientation: Int) {\n        mCamera = camera\n        mCameraInfo = cameraInfo\n        mDisplayOrientation = displayOrientation\n    }\n\n    companion object {\n        private const val TAG = \"CameraPreview\"\n\n        /**\n         * Calculate the correct orientation for a [Camera] preview that is displayed on screen.\n\n         * Implementation is based on the sample code provided in\n         * [Camera.setDisplayOrientation].\n         */\n        fun calculatePreviewOrientation(info: Camera.CameraInfo, rotation: Int) = when {\n                info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ->\n                    // compensate the mirror\n                    (360 - (info.orientation + degrees(rotation)) % 360) % 360\n                // back-facing\n                else -> (info.orientation - degrees(rotation) + 360) % 360\n            }\n\n        private fun degrees(rotation: Int) = when (rotation) {\n            Surface.ROTATION_90 -> 90\n            Surface.ROTATION_180 -> 180\n            Surface.ROTATION_270 -> 270\n            else -> 0\n        }\n    }\n}\n"
  },
  {
    "path": "sample/src/main/kotlin/permissions/dispatcher/sample/camera/CameraPreviewFragment.kt",
    "content": "package permissions.dispatcher.sample.camera\n\nimport android.annotation.SuppressLint\nimport android.hardware.Camera\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.FrameLayout\nimport androidx.fragment.app.Fragment\nimport permissions.dispatcher.sample.R\n\n/**\n * Displays a [CameraPreview] of the first [Camera].\n * An error message is displayed if the Camera is not available.\n *\n *\n * This Fragment is only used to illustrate that access to the Camera API has been granted (or\n * denied) as part of the runtime permissions model. It is not relevant for the use of the\n * permissions API.\n *\n *\n * Implementation is based directly on the documentation at\n * http://developer.android.com/guide/topics/media/camera.html\n */\nclass CameraPreviewFragment : Fragment() {\n\n    private var preview: CameraPreview? = null\n    private var camera: Camera? = null\n\n    @SuppressLint(\"InflateParams\")\n    override fun onCreateView(inflater: LayoutInflater,\n                              container: ViewGroup?,\n                              savedInstanceState: Bundle?): View? =\n            inflater.inflate(R.layout.fragment_camera, null)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val button: Button? = view.findViewById(R.id.back)\n        button?.setOnClickListener {\n            fragmentManager?.popBackStack()\n        }\n        initCamera()\n    }\n\n    private fun initCamera() {\n        camera = getCameraInstance(CAMERA_ID)?.also { camera ->\n            val cameraInfo = Camera.CameraInfo().also { Camera.getCameraInfo(CAMERA_ID, it) }\n            // Get the rotation of the screen to adjust the preview image accordingly.\n            val displayRotation = activity?.windowManager?.defaultDisplay?.rotation\n            val previewFrameLayout: FrameLayout? = view?.findViewById(R.id.camera_preview)\n            previewFrameLayout?.removeAllViews()\n            if (displayRotation == null) {\n                return\n            }\n            preview?.setCamera(camera, cameraInfo, displayRotation) ?: run {\n                // Create the Preview view and set it as the content of this Activity.\n                context?.let {\n                    preview = CameraPreview(it, camera, cameraInfo, displayRotation)\n                }\n            }\n            previewFrameLayout?.addView(preview)\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        camera ?: initCamera()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        // Stop camera access\n        releaseCamera()\n    }\n\n    private fun releaseCamera() {\n        camera?.release()?.run { camera = null }\n        // release destroyed preview\n        preview = null\n    }\n\n    companion object {\n        private const val TAG = \"CameraPreview\"\n\n        /**\n         * Id of the camera to access. 0 is the first camera.\n         */\n        private const val CAMERA_ID = 0\n\n        fun newInstance(): CameraPreviewFragment = CameraPreviewFragment()\n\n        /** A safe way to get an instance of the Camera object.  */\n        fun getCameraInstance(cameraId: Int): Camera? = try {\n                // attempt to get a Camera instance\n                Camera.open(cameraId)\n            } catch (e: Exception) {\n                // Camera is not available (in use or does not exist)\n                Log.d(TAG, \"Camera \" + cameraId + \" is not available: \" + e.message)\n                null\n            }\n    }\n}\n"
  },
  {
    "path": "sample/src/main/kotlin/permissions/dispatcher/sample/contacts/ContactsFragment.kt",
    "content": "package permissions.dispatcher.sample.contacts\n\nimport android.content.ContentProviderOperation\nimport android.content.OperationApplicationException\nimport android.database.Cursor\nimport android.os.Bundle\nimport android.os.RemoteException\nimport android.provider.ContactsContract\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.TextView\nimport androidx.fragment.app.Fragment\nimport androidx.loader.app.LoaderManager\nimport androidx.loader.content.CursorLoader\nimport androidx.loader.content.Loader\nimport permissions.dispatcher.sample.R\nimport kotlin.properties.Delegates\n\n/**\n * Displays the first contact stored on the device and contains an option to add a dummy contact.\n *\n *\n * This Fragment is only used to illustrate that access to the Contacts ContentProvider API has\n * been granted (or denied) as part of the runtime permissions model. It is not relevant for the\n * use\n * of the permissions API.\n *\n *\n * This fragments demonstrates a basic use case for accessing the Contacts Provider. The\n * implementation is based on the training guide available here:\n * https://developer.android.com/training/contacts-provider/retrieve-names.html\n */\nclass ContactsFragment : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {\n\n    private var messageText: TextView by Delegates.notNull()\n\n    override fun onCreateView(inflater: LayoutInflater,\n                              container: ViewGroup?,\n                              savedInstanceState: Bundle?) = inflater.inflate(R.layout.fragment_contacts, container, false)!!\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n\n        messageText = view.findViewById(R.id.contact_message)\n\n        val button: Button? = view.findViewById(R.id.back)\n        button?.setOnClickListener {\n            fragmentManager?.popBackStack()\n        }\n\n        val addButton: Button = view.findViewById(R.id.contact_add)\n        addButton.setOnClickListener {\n            insertDummyContact()\n        }\n        val loadButton: Button = view.findViewById(R.id.contact_load)\n        loadButton.setOnClickListener {\n            loadContact()\n        }\n    }\n\n    /**\n     * Restart the Loader to query the Contacts content provider to display the first contact.\n     */\n    private fun loadContact() = loaderManager.restartLoader(0, null, this)\n\n    /**\n     * Initialises a new [CursorLoader] that queries the [ContactsContract].\n     */\n    override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor> = CursorLoader(activity!!.applicationContext, ContactsContract.Contacts.CONTENT_URI, PROJECTION, null, null, ORDER)\n\n    /**\n     * Dislays either the name of the first contact or a message.\n     */\n    override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor?) {\n        cursor?.let {\n            val totalCount: Int = it.count\n            if (totalCount > 0) {\n                it.moveToFirst()\n                val name = it.getString(it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))\n                messageText.text = resources.getString(R.string.contacts_string, totalCount, name)\n\n                Log.d(TAG, \"First contact loaded: $name\")\n                Log.d(TAG, \"Total number of contacts: $totalCount\")\n                Log.d(TAG, \"Total number of contacts: $totalCount\")\n            } else {\n                Log.d(TAG, \"List of contacts is empty.\")\n                messageText.setText(R.string.contacts_empty)\n            }\n        }\n    }\n\n    override fun onLoaderReset(loader: Loader<Cursor>) = messageText.setText(R.string.contacts_empty)\n\n    /**\n     * Accesses the Contacts content provider directly to insert a new contact.\n     *\n     *\n     * The contact is called \"__DUMMY ENTRY\" and only contains a name.\n     */\n    private fun insertDummyContact() {\n        // Two operations are needed to insert a new contact.\n        val operations = arrayListOf<ContentProviderOperation>()\n\n        // First, set up a new raw contact.\n        ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)\n                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)\n                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)\n                .build().let { operations.add(it) }\n\n\n        // Next, set the name for the contact.\n        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)\n                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)\n                .withValue(ContactsContract.Data.MIMETYPE,\n                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)\n                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,\n                        DUMMY_CONTACT_NAME)\n                .build().let { operations.add(it) }\n\n        // Apply the operations.\n        try {\n            activity?.contentResolver?.applyBatch(ContactsContract.AUTHORITY, operations)\n        } catch (e: RemoteException) {\n            Log.d(TAG, \"Could not add a new contact: \" + e.message)\n        } catch (e: OperationApplicationException) {\n            Log.d(TAG, \"Could not add a new contact: \" + e.message)\n        }\n    }\n\n    companion object {\n        private const val TAG = \"Contacts\"\n\n        private const val DUMMY_CONTACT_NAME = \"__DUMMY CONTACT from runtime permissions sample\"\n\n        /**\n         * Projection for the content provider query includes the id and primary name of a contact.\n         */\n        private val PROJECTION = arrayOf(ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)\n        /**\n         * Sort order for the query. Sorted by primary name in ascending order.\n         */\n        private const val ORDER = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + \" ASC\"\n\n        /**\n         * Creates a new instance of a ContactsFragment.\n         */\n        fun newInstance(): ContactsFragment = ContactsFragment()\n    }\n}\n"
  },
  {
    "path": "sample/src/main/res/layout/activity_main.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/vertical_page_margin\"\n    android:paddingLeft=\"@dimen/horizontal_page_margin\"\n    android:paddingRight=\"@dimen/horizontal_page_margin\"\n    android:paddingTop=\"@dimen/vertical_page_margin\"\n    tools:context=\".MainActivity\">\n\n    <Button\n        android:id=\"@+id/button_camera\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/show_camera\" />\n\n    <Button\n        android:id=\"@+id/button_contacts\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/show_contacts\" />\n\n    <FrameLayout\n        android:id=\"@+id/sample_content_fragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0px\"\n        android:layout_weight=\"2\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "sample/src/main/res/layout/fragment_camera.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <Button\n        android:id=\"@+id/back\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:text=\"@string/back\" />\n\n    <FrameLayout\n        android:id=\"@+id/camera_preview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n</LinearLayout>"
  },
  {
    "path": "sample/src/main/res/layout/fragment_contacts.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/vertical_page_margin\"\n    android:paddingLeft=\"@dimen/horizontal_page_margin\"\n    android:paddingRight=\"@dimen/horizontal_page_margin\"\n    android:paddingTop=\"@dimen/vertical_page_margin\">\n\n    <Button\n        android:id=\"@+id/back\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:text=\"@string/back\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/contacts_intro\" />\n\n    <TextView\n        android:id=\"@+id/contact_message\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n    <Button\n        android:id=\"@+id/contact_add\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/add_contact\" />\n\n    <Button\n        android:id=\"@+id/contact_load\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/show_contact\" />\n\n</LinearLayout>"
  },
  {
    "path": "sample/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"margin_medium\">16dp</dimen>\n    <dimen name=\"horizontal_page_margin\">@dimen/margin_medium</dimen>\n    <dimen name=\"vertical_page_margin\">@dimen/margin_medium</dimen>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">PermissionsDispatcher Sample</string>\n    <string name=\"back\">Back</string>\n    <string name=\"button_allow\">Allow</string>\n    <string name=\"button_deny\">Deny</string>\n\n    <string name=\"contacts_string\">Total number of contacts: %1$d\\nFirst contact:<b>%2$s</b></string>\n    <string name=\"contacts_empty\">Contacts not loaded.</string>\n    <string name=\"add_contact\">Add a contact</string>\n    <string name=\"show_contact\">Show first contact</string>\n    <string name=\"contacts_intro\">This fragment demonstrates access to the contact database on the device.\\n\n            Clicking \\\"Add a contact\\\" adds a new contact named \"__DUMMY ENTRY\" directly into the database.\\n\n    Clicking \\\"Show first contact\\\" accesses the contact database to display the name of the first contact.</string>\n\n    <string name=\"show_camera\">Show camera preview</string>\n    <string name=\"show_contacts\">Show and add contacts</string>\n    <string name=\"permission_contacts_denied\">Contacts permissions were denied. Please consider granting it in order to access the camera!</string>\n    <string name=\"permission_contacts_never_ask_again\">Contacts permissions were denied with never ask again.</string>\n\n    <string name=\"permission_camera_rationale\">Camera permission is needed to show the camera preview.</string>\n    <string name=\"permission_contacts_rationale\">Contacts permissions are needed to demonstrate access to the contacts database.</string>\n    <string name=\"permission_camera_denied\">Camera permission was denied. Please consider granting it in order to access the camera!</string>\n    <string name=\"permission_camera_never_ask_again\">Camera permission was denied with never ask again.</string>\n</resources>\n"
  },
  {
    "path": "sample/src/main/res/values/template-styles.xml",
    "content": "<resources>\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\" />\n</resources>\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':library', ':processor', ':lint', ':sample', ':test', ':annotation', ':ktx', ':ktx-sample'"
  },
  {
    "path": "test/.gitignore",
    "content": "/build\n!build/generated/source/apt"
  },
  {
    "path": "test/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\n\nandroid {\n    compileSdkVersion COMPILE_SDK_VERSION\n    defaultConfig {\n        applicationId \"permissions.dispatcher.test\"\n        targetSdkVersion TARGET_SDK_VERSION\n        minSdkVersion 18\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    sourceSets {\n        main.java.srcDirs += \"src/main/kotlin\"\n    }\n\n    testOptions {\n        unitTests.all {\n            testLogging {\n                events \"passed\", \"failed\", \"standardOut\", \"standardError\"\n                outputs.upToDateWhen {false}\n                showStandardStreams = true\n                exceptionFormat \"full\"\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation project(':library')\n    kapt project(':processor')\n\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION\"\n    implementation \"androidx.appcompat:appcompat:$ANDROIDX_LIBRARY_VERSION\"\n\n    testImplementation \"junit:junit:$JUNIT_VERSION\"\n    testImplementation \"org.jetbrains.kotlin:kotlin-reflect:1.3.11\"\n    // TODO: update mockito and powermock\n    testImplementation \"org.mockito:mockito-core:1.10.19\"\n    testImplementation \"org.powermock:powermock-api-mockito:1.6.4\"\n    testImplementation \"org.powermock:powermock-module-junit4:1.6.4\"\n    testImplementation \"org.powermock:powermock-module-junit4-rule:1.6.4\"\n    testImplementation \"org.powermock:powermock-classloading-xstream:1.6.4\"\n    testImplementation \"org.robolectric:robolectric:$ROBOLECTRIC_VERSION\"\n}\n"
  },
  {
    "path": "test/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"permissions.dispatcher.test\">\n\n    <application />\n\n</manifest>"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityOnlyNeedsPermission.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityOnlyNeedsPermission extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithAllAnnotations.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnNeverAskAgain;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.OnShowRationale;\nimport permissions.dispatcher.PermissionRequest;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithAllAnnotations extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    void showRationaleForCamera(final PermissionRequest request) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    void showDeniedForCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    void showNeverAskForCamera() {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithAllAnnotationsKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class ActivityWithAllAnnotationsKt : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera() {\n    }\n\n    /**\n     * PermissionRequest is nullable for testing, but it shouldn't\n     */\n    @OnShowRationale(Manifest.permission.CAMERA)\n    fun showRationaleForCamera(request: PermissionRequest?) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    fun showDeniedForCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    fun showNeverAskForCamera() {\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithNoParameterArgumentKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class ActivityWithNoParameterArgumentKt : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera() {\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    fun showRationaleForCamera() {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    fun showDeniedForCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    fun showNeverAskForCamera() {\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithOnNeverAskAgain.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnNeverAskAgain;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithOnNeverAskAgain extends AppCompatActivity {\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    void showNeverAskForCamera() {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithOnPermissionDenied.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithOnPermissionDenied extends AppCompatActivity {\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    void showDeniedForCamera() {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithParametersKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class ActivityWithParametersKt : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera(arg: Array<out String>) {\n    }\n\n    @NeedsPermission(Manifest.permission.READ_CALENDAR)\n    fun showCalendar(arg: Any) {\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithShowRationale.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnShowRationale;\nimport permissions.dispatcher.PermissionRequest;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithShowRationale extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    void showRationaleForCamera(final PermissionRequest request) {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        ActivityWithShowRationalePermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithSystemAlertWindow.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\nimport android.content.Intent;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithSystemAlertWindow extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindow() {\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        ActivityWithSystemAlertWindowPermissionsDispatcher.onActivityResult(this, requestCode);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowAllAnnotations.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\nimport android.content.Intent;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.OnShowRationale;\nimport permissions.dispatcher.PermissionRequest;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithSystemAlertWindowAllAnnotations extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void systemAlertWindow() {\n    }\n\n    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void showRationaleForSystemAlertWindow(final PermissionRequest request) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    void showDeniedForSystemAlertWindow() {\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcher.onActivityResult(this, requestCode);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\n\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.RuntimePermissions\n\n@RuntimePermissions\nopen class ActivityWithSystemAlertWindowKt : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    internal fun systemAlertWindow() {\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        onActivityResult(requestCode)\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKtAllAnnotations.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class ActivityWithSystemAlertWindowKtAllAnnotations : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    internal fun systemAlertWindow() {\n    }\n\n    @OnShowRationale(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    internal fun showRationaleForSystemAlertWindow(request: PermissionRequest?) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.SYSTEM_ALERT_WINDOW)\n    internal fun showDeniedForSystemAlertWindow() {\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        onActivityResult(requestCode)\n    }\n}"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithWriteSetting.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\nimport android.content.Intent;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithWriteSetting extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\n    void writeSetting() {\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        ActivityWithWriteSettingPermissionsDispatcher.onActivityResult(this, requestCode);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithWriteSettingAllAnnotations.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\nimport android.content.Intent;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.OnShowRationale;\nimport permissions.dispatcher.PermissionRequest;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class ActivityWithWriteSettingAllAnnotations extends AppCompatActivity {\n\n    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\n    void writeSetting() {\n    }\n\n    @OnShowRationale(Manifest.permission.WRITE_SETTINGS)\n    void showRationaleForWriteSettings(final PermissionRequest request) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.WRITE_SETTINGS)\n    void showDeniedForWriteSettings() {\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        ActivityWithWriteSettingAllAnnotationsPermissionsDispatcher.onActivityResult(this, requestCode);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithWriteSettingKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\n\nimport permissions.dispatcher.NeedsPermission\nimport permissions.dispatcher.RuntimePermissions\n\n@RuntimePermissions\nopen class ActivityWithWriteSettingKt : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\n    internal fun writeSetting() {\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        onActivityResult(requestCode)\n    }\n}"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/ActivityWithWriteSettingKtAllAnnotations.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class ActivityWithWriteSettingKtAllAnnotations : AppCompatActivity() {\n\n    @NeedsPermission(Manifest.permission.WRITE_SETTINGS)\n    internal fun writeSetting() {\n    }\n\n    @OnShowRationale(Manifest.permission.WRITE_SETTINGS)\n    internal fun showRationaleForWriteSettings(request: PermissionRequest?) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.WRITE_SETTINGS)\n    internal fun showDeniedForWriteSettings() {\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        onActivityResult(requestCode)\n    }\n}"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/FragmentWithAllAnnotations.java",
    "content": "package permissions.dispatcher.test;\n\nimport android.Manifest;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport permissions.dispatcher.NeedsPermission;\nimport permissions.dispatcher.OnNeverAskAgain;\nimport permissions.dispatcher.OnPermissionDenied;\nimport permissions.dispatcher.OnShowRationale;\nimport permissions.dispatcher.PermissionRequest;\nimport permissions.dispatcher.RuntimePermissions;\n\n@RuntimePermissions\npublic class FragmentWithAllAnnotations extends Fragment {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    void showCamera() {\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    void showRationaleForCamera(final PermissionRequest request) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    void showDeniedForCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    void showNeverAskForCamera() {\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);\n    }\n}\n"
  },
  {
    "path": "test/src/main/java/permissions/dispatcher/test/FragmentWithAllAnnotationsKt.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.Manifest\nimport androidx.fragment.app.Fragment\nimport permissions.dispatcher.*\n\n@RuntimePermissions\nopen class FragmentWithAllAnnotationsKt : Fragment() {\n\n    @NeedsPermission(Manifest.permission.CAMERA)\n    fun showCamera() {\n    }\n\n    @OnShowRationale(Manifest.permission.CAMERA)\n    fun showRationaleForCamera(request: PermissionRequest?) {\n    }\n\n    @OnPermissionDenied(Manifest.permission.CAMERA)\n    fun showDeniedForCamera() {\n    }\n\n    @OnNeverAskAgain(Manifest.permission.CAMERA)\n    fun showNeverAskForCamera() {\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        onRequestPermissionsResult(requestCode, grantResults)\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityOnlyNeedsPermissionPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityOnlyNeedsPermissionPermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityOnlyNeedsPermission\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(ActivityOnlyNeedsPermissionPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityOnlyNeedsPermission::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no method call if request code is not related to the library`() {\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        ActivityOnlyNeedsPermissionPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithAllAnnotationsKtPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers.any\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithAllAnnotationsKtPermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityWithAllAnnotationsKt\n\n    companion object {\n        private var requestCode = 0\n        private lateinit var requestPermissions: Array<String>\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithAllAnnotationsKt::showCameraWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_SHOWCAMERA\") as Int\n            requestPermissions = arrayOf(\"android.permission.CAMERA\")\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithAllAnnotationsKt::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithAllAnnotationsPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers.any\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithAllAnnotationsPermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityWithAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(ActivityWithAllAnnotationsPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithAllAnnotations::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockActivityCompatShouldShowRequestPermissionRationale(true)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockActivityCompatShouldShowRequestPermissionRationale(true)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockActivityCompatShouldShowRequestPermissionRationale(false)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockActivityCompatShouldShowRequestPermissionRationale(false)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockActivityCompatShouldShowRequestPermissionRationale(true)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        ActivityWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        ActivityWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithNoParameterArgumentKtPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithNoParameterArgumentKtPermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityWithNoParameterArgumentKt\n\n    companion object {\n        private var requestCode = 0\n        private lateinit var requestPermissions: Array<String>\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithNoParameterArgumentKt::showCameraWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_SHOWCAMERA\") as Int\n            requestPermissions = arrayOf(\"android.permission.CAMERA\")\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithNoParameterArgumentKt::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showRationaleForCamera()\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        activity.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(activity, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        activity.showCameraWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithOnNeverAskAgainPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithOnNeverAskAgainPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithOnNeverAskAgain\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(ActivityWithOnNeverAskAgainPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithOnNeverAskAgain::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        ActivityWithOnNeverAskAgainPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithOnPermissionDeniedPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithOnPermissionDeniedPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithOnPermissionDenied\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(ActivityWithOnPermissionDeniedPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithOnPermissionDenied::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        ActivityWithOnPermissionDeniedPermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithParametersKtPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithStringParameterKtPermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityWithParametersKt\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithParametersKt::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `call showCameraWithPermissionCheck`() {\n        mockCheckSelfPermission(true)\n        activity.showCameraWithPermissionCheck(arrayOf(\"option\"))\n        Mockito.verify(activity, Mockito.times(1)).showCamera(arrayOf(\"option\"))\n    }\n\n    @Test\n    fun `call showCalendarWithPermissionCheckd`() {\n        mockCheckSelfPermission(true)\n        activity.showCalendarWithPermissionCheck(1)\n        Mockito.verify(activity, Mockito.times(1)).showCalendarWithPermissionCheck(1)\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithShowRationalePermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class)\nclass ActivityWithShowRationalePermissionsDispatcherTest {\n\n    private lateinit var activity: ActivityWithShowRationale\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(ActivityWithShowRationalePermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithShowRationale::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForCamera(Matchers.any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showRationaleForCamera(Matchers.any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        ActivityWithShowRationalePermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        ActivityWithShowRationalePermissionsDispatcher.onRequestPermissionsResult(activity, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no method call if request code is not related to the library`() {\n        ActivityWithShowRationalePermissionsDispatcher.onRequestPermissionsResult(activity, requestCode + 1000, null)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        ActivityWithShowRationalePermissionsDispatcher.showCameraWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showCamera()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.app.AppOpsManagerCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\nimport permissions.dispatcher.test.ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcher.onActivityResult\nimport permissions.dispatcher.test.ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcher.systemAlertWindowWithPermissionCheck\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class,\n        AppOpsManagerCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithSystemAlertWindowAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestSystemAlertWindow(ActivityWithSystemAlertWindowAllAnnotationsPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithSystemAlertWindowAllAnnotations::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canDrawOverlays returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `if permission not granted and no rationale activity, then call startActivityForResult`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `if permission not granted and requires rationale activity, then call method for show rationale`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForSystemAlertWindow(Matchers.any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        onActivityResult(activity, -1)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if canDrawOverlays returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call showDenied method if permission not granted and shouldShowRequestPermissionRationale true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForSystemAlertWindow()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKtAllAnnotationsTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithSystemAlertWindowKtAllAnnotationsTest {\n    \n    private lateinit var activity: ActivityWithSystemAlertWindowKtAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithSystemAlertWindowKtAllAnnotations::systemAlertWindowWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_SYSTEMALERTWINDOW\") as Int\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithSystemAlertWindowKtAllAnnotations::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canDrawOverlays returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `if permission not granted and no rationale activity, then call startActivityForResult`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `if permission not granted and requires rationale activity, then call method for show rationale`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForSystemAlertWindow(Matchers.any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        activity.onActivityResult(-1)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if canDrawOverlays returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call showDenied method if permission not granted and shouldShowRequestPermissionRationale true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForSystemAlertWindow()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowKtTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithSystemAlertWindowKtTest {\n    private lateinit var activity: ActivityWithSystemAlertWindowKt\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithSystemAlertWindowKt::systemAlertWindowWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_SYSTEMALERTWINDOW\") as Int\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithSystemAlertWindowKt::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canDrawOverlays returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `if permission not granted, then start new activity for overlay`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n\n        activity.systemAlertWindowWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        activity.onActivityResult(-1)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if canDrawOverlays returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithSystemAlertWindowPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithSystemAlertWindowPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithSystemAlertWindow\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestSystemAlertWindow(ActivityWithSystemAlertWindowPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithSystemAlertWindow::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canDrawOverlays returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `if permission not granted, then start new activity for overlay`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n        mockUriParse()\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.systemAlertWindowWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        ActivityWithSystemAlertWindowPermissionsDispatcher.onActivityResult(activity, -1)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `call the method if canDrawOverlays returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(true)\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).systemAlertWindow()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanDrawOverlays(false)\n\n        ActivityWithSystemAlertWindowPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).systemAlertWindow()\n    }\n\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithWriteSettingAllAnnotationsPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.test.ActivityWithWriteSettingAllAnnotationsPermissionsDispatcher.onActivityResult\nimport permissions.dispatcher.test.ActivityWithWriteSettingAllAnnotationsPermissionsDispatcher.writeSettingWithPermissionCheck\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithWriteSettingAllAnnotationsPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithWriteSettingAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestWriteSetting(ActivityWithWriteSettingAllAnnotationsPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithWriteSettingAllAnnotations::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings.System::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canWrite returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `if permission not granted, then start new activity for overlay`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockUriParse()\n\n        writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        onActivityResult(activity,-1)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if canWrite returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call showDenied method if permission not granted and shouldShowRequestPermissionRationale true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForWriteSettings()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithWriteSettingKtAllAnnotationsTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings.System::class, Build.VERSION::class, Uri::class)\nclass ActivityWithWriteSettingKtAllAnnotationsTest {\n    \n    private lateinit var activity: ActivityWithWriteSettingKtAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithWriteSettingKtAllAnnotations::writeSettingWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_WRITESETTING\") as Int\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithWriteSettingKtAllAnnotations::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings.System::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canWrite returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `if permission not granted and no rationale activity, then call startActivityForResult`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(false)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `if permission not granted and requires rationale activity, then call method for show rationale`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockUriParse()\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).showRationaleForWriteSettings(Matchers.any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        activity.onActivityResult(-1)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if writeSetting returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call showDenied method if permission not granted and shouldShowRequestPermissionRationale true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockShouldShowRequestPermissionRationaleActivity(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).showDeniedForWriteSettings()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithWriteSettingKtTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings.System::class, Build.VERSION::class, Uri::class)\nclass ActivityWithWriteSettingKtTest {\n    private lateinit var activity: ActivityWithWriteSettingKt\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = ActivityWithWriteSettingKt::writeSettingWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_WRITESETTING\") as Int\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithWriteSettingKt::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings.System::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canDrawOverlays returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `if permission not granted, then start new activity for overlay`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockUriParse()\n\n        activity.writeSettingWithPermissionCheck()\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        activity.onActivityResult(-1)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if writeSetting returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n\n        activity.onActivityResult(requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/ActivityWithWriteSettingPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ActivityCompat::class, ContextCompat::class, Settings::class, Build.VERSION::class, Uri::class)\nclass ActivityWithWriteSettingPermissionsDispatcherTest {\n    private lateinit var activity: ActivityWithWriteSetting\n\n    companion object {\n        private var requestCode = 0\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestWriteSetting(ActivityWithWriteSettingPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        activity = Mockito.mock(ActivityWithWriteSetting::class.java)\n        PowerMockito.mockStatic(ActivityCompat::class.java)\n        PowerMockito.mockStatic(ContextCompat::class.java)\n        PowerMockito.mockStatic(Settings.System::class.java)\n        PowerMockito.mockStatic(Uri::class.java)\n\n        PowerMockito.mockStatic(Build.VERSION::class.java)\n        PowerMockito.field(Build.VERSION::class.java, \"SDK_INT\").setInt(null, 25)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithWriteSettingPermissionsDispatcher.writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `checkSelfPermission returns false but canWrite returns true means granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        ActivityWithWriteSettingPermissionsDispatcher.writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `if permission not granted, then start new activity for overlay`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n        mockUriParse()\n\n        ActivityWithWriteSettingPermissionsDispatcher.writeSettingWithPermissionCheck(activity)\n\n        Mockito.verify(activity, Mockito.times(1)).startActivityForResult(Matchers.any(Intent::class.java), Matchers.eq(requestCode))\n    }\n\n    @Test\n    fun `do nothing if requestCode is wrong one`() {\n        ActivityWithWriteSettingPermissionsDispatcher.onActivityResult(activity, -1)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if permission granted`() {\n        mockCheckSelfPermission(true)\n\n        ActivityWithWriteSettingPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `call the method if canWrite returns true`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(true)\n\n        ActivityWithWriteSettingPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(1)).writeSetting()\n    }\n\n    @Test\n    fun `No call the method if permission not granted`() {\n        mockCheckSelfPermission(false)\n        mockCanWrite(false)\n\n        ActivityWithWriteSettingPermissionsDispatcher.onActivityResult(activity, requestCode)\n\n        Mockito.verify(activity, Mockito.times(0)).writeSetting()\n    }\n}"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/Extensions.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport org.mockito.Matchers.any\nimport org.mockito.Matchers.anyString\nimport org.powermock.api.mockito.PowerMockito\nimport java.lang.reflect.Field\nimport java.lang.reflect.Modifier\nimport kotlin.jvm.internal.CallableReference\nimport kotlin.reflect.KFunction\n\nfun mockShouldShowRequestPermissionRationaleActivity(result: Boolean) {\n    PowerMockito.`when`(ActivityCompat.shouldShowRequestPermissionRationale(any(Activity::class.java), anyString())).thenReturn(result)\n}\n\n@SuppressLint(\"NewApi\")\nfun mockShouldShowRequestPermissionRationaleFragment(fragment: Fragment, result: Boolean) {\n    PowerMockito.`when`(fragment.shouldShowRequestPermissionRationale(anyString())).thenReturn(result)\n}\n\nfun mockActivityCompatShouldShowRequestPermissionRationale(result: Boolean) {\n    PowerMockito.`when`(ActivityCompat.shouldShowRequestPermissionRationale(any(Activity::class.java), anyString())).thenReturn(result)\n}\n\nfun mockCheckSelfPermission(result: Boolean) {\n    val value = if (result) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED\n    PowerMockito.`when`(ContextCompat.checkSelfPermission(any(), anyString())).thenReturn(value)\n}\n\nfun mockCanDrawOverlays(result: Boolean) {\n    PowerMockito.`when`(Settings.canDrawOverlays(any(Context::class.java))).thenReturn(result)\n}\n\nfun mockCanWrite(result: Boolean) {\n    PowerMockito.`when`(Settings.System.canWrite(any(Context::class.java))).thenReturn(result)\n}\n\nprivate fun getPrivateField(clazz: Class<*>, fieldName: String): Field {\n    val field = clazz.getDeclaredField(fieldName)\n    field.isAccessible = true\n    return field\n}\n\nprivate fun getPrivateIntField(clazz: Class<*>, fieldName: String): Int = getPrivateField(clazz, fieldName).getInt(null)\n\nfun getRequestWriteSetting(clazz: Class<*>) = getPrivateIntField(clazz, \"REQUEST_WRITESETTING\")\n\nfun getRequestSystemAlertWindow(clazz: Class<*>) = getPrivateIntField(clazz, \"REQUEST_SYSTEMALERTWINDOW\")\n\nfun getRequestCameraConstant(clazz: Class<*>) = getPrivateIntField(clazz, \"REQUEST_SHOWCAMERA\")\n\nfun getPermissionRequestConstant(clazz: Class<*>) = getPrivateField(clazz, \"PERMISSION_SHOWCAMERA\").get(null) as Array<String>\n\nfun overwriteCustomSdkInt(sdkInt: Int = 23) {\n    val modifiersField = Field::class.java.getDeclaredField(\"modifiers\")\n    modifiersField.isAccessible = true\n\n    val field = Build.VERSION::class.java.getDeclaredField(\"SDK_INT\")\n    field.isAccessible = true\n    modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv())\n    field.set(null, sdkInt)\n}\n\nfun clearCustomSdkInt() {\n    overwriteCustomSdkInt()\n}\n\nfun mockUriParse(result: Uri? = null) {\n    PowerMockito.`when`(Uri.parse(anyString())).thenReturn(result)\n}\n\n/**\n * get other package level property value by other package level function name which is in the same kotlin file\n */\nfun <R> KFunction<R>.packageLevelGetPropertyValueByName(otherPropertyName: String): Any? {\n    return getTopPropertyValueByName(this as CallableReference, otherPropertyName)\n}\n\nfun getTopPropertyValueByName(otherCallableReference: CallableReference, propertyName: String): Any? {\n    val owner = otherCallableReference.owner ?: return null\n    val containerClass: Class<*>\n    try {\n        containerClass = owner::class.members.firstOrNull { it.name == \"jClass\" }?.call(owner) as Class<*>\n    } catch (e: Exception) {\n        throw IllegalArgumentException(\"No such property 'jClass'\")\n    }\n\n    var tobeSearchMethodClass: Class<*>? = containerClass\n    while (tobeSearchMethodClass != null) {\n        tobeSearchMethodClass.declaredFields.forEach {\n            if (it.name == propertyName) {\n                it.isAccessible = true\n                // top property(package property) should be static in java level\n                if (Modifier.isStatic(it.modifiers)) {\n                    return it.get(null)\n                } else {\n                    throw IllegalStateException(\"It is not a top property : $propertyName\")\n                }\n            }\n        }\n        tobeSearchMethodClass = tobeSearchMethodClass.superclass\n    }\n\n    throw IllegalArgumentException(\"Can't find the property named :$propertyName in the same file with ${otherCallableReference.name}\")\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/FragmentWithAllAnnotationsKtPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers.any\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ContextCompat::class, FragmentWithAllAnnotationsKt::class)\nclass FragmentWithAllAnnotationsKtPermissionsDispatcherTest {\n\n    private lateinit var fragment: FragmentWithAllAnnotationsKt\n\n    companion object {\n        private var requestCode = 0\n        private lateinit var requestPermissions: Array<String>\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = FragmentWithAllAnnotationsKt::showCameraWithPermissionCheck.packageLevelGetPropertyValueByName(\"REQUEST_SHOWCAMERA\") as Int\n            requestPermissions = arrayOf(\"android.permission.CAMERA\")\n        }\n    }\n\n    @Before\n    fun setUp() {\n        fragment = PowerMockito.mock(FragmentWithAllAnnotationsKt::class.java)\n\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(1)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, false)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(0)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        fragment.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        fragment.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockShouldShowRequestPermissionRationaleFragment(fragment, false)\n\n        fragment.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        fragment.onRequestPermissionsResult(requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        fragment.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        fragment.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(fragment, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        fragment.onRequestPermissionsResult(requestCode + 1000, intArrayOf())\n\n        Mockito.verify(fragment, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        fragment.showCameraWithPermissionCheck()\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n}\n"
  },
  {
    "path": "test/src/test/java/permissions/dispatcher/test/FragmentWithAllAnnotationsPermissionsDispatcherTest.kt",
    "content": "package permissions.dispatcher.test\n\nimport android.content.pm.PackageManager\nimport androidx.core.content.ContextCompat\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.BeforeClass\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Matchers.any\nimport org.mockito.Mockito\nimport org.powermock.api.mockito.PowerMockito\nimport org.powermock.core.classloader.annotations.PrepareForTest\nimport org.powermock.modules.junit4.PowerMockRunner\nimport permissions.dispatcher.PermissionRequest\n\n@Suppress(\"IllegalIdentifier\")\n@RunWith(PowerMockRunner::class)\n@PrepareForTest(ContextCompat::class, FragmentWithAllAnnotationsKt::class)\nclass FragmentWithAllAnnotationsPermissionsDispatcherTest {\n\n    private lateinit var fragment: FragmentWithAllAnnotations\n\n    companion object {\n        private var requestCode = 0\n        private lateinit var requestPermissions: Array<String>\n\n        @BeforeClass\n        @JvmStatic\n        fun setUpForClass() {\n            requestCode = getRequestCameraConstant(FragmentWithAllAnnotationsPermissionsDispatcher::class.java)\n            requestPermissions = getPermissionRequestConstant(FragmentWithAllAnnotationsPermissionsDispatcher::class.java)\n        }\n    }\n\n    @Before\n    fun setUp() {\n        fragment = PowerMockito.mock(FragmentWithAllAnnotations::class.java)\n\n        PowerMockito.mockStatic(ContextCompat::class.java)\n    }\n\n    @After\n    fun tearDown() {\n        clearCustomSdkInt()\n    }\n\n    @Test\n    fun `already granted call the method`() {\n        mockCheckSelfPermission(true)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `not granted does not call the method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `not granted permission and show rationale is true then call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(1)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `not granted permission and show rationale is false then does not call the rationale method`() {\n        mockCheckSelfPermission(false)\n        mockShouldShowRequestPermissionRationaleFragment(fragment, false)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(0)).showRationaleForCamera(any(PermissionRequest::class.java))\n    }\n\n    @Test\n    fun `the method is called if verifyPermission is true`() {\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode, intArrayOf(PackageManager.PERMISSION_GRANTED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n\n    @Test\n    fun `the method is not called if verifyPermission is false`() {\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `show never ask method is call if verifyPermission is false and shouldShowRequestPermissionRationale is false`() {\n        mockShouldShowRequestPermissionRationaleFragment(fragment, false)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `show deny method is call if verifyPermission is false and shouldShowRequestPermissionRationale is true`() {\n        mockShouldShowRequestPermissionRationaleFragment(fragment, true)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode, intArrayOf(PackageManager.PERMISSION_DENIED))\n\n        Mockito.verify(fragment, Mockito.times(1)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no the method call if request code is not related to the library`() {\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode + 1000, null)\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `no denied method call if request code is not related to the library`() {\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode + 1000, null)\n\n        Mockito.verify(fragment, Mockito.times(0)).showDeniedForCamera()\n    }\n\n    @Test\n    fun `no never ask method call if request code is not related to the library`() {\n        FragmentWithAllAnnotationsPermissionsDispatcher.onRequestPermissionsResult(fragment, requestCode + 1000, null)\n\n        Mockito.verify(fragment, Mockito.times(0)).showNeverAskForCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result false`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(false)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(0)).showCamera()\n    }\n\n    @Test\n    fun `blow M follows checkSelfPermissions result true`() {\n        overwriteCustomSdkInt(22)\n        mockCheckSelfPermission(true)\n\n        FragmentWithAllAnnotationsPermissionsDispatcher.showCameraWithPermissionCheck(fragment)\n\n        Mockito.verify(fragment, Mockito.times(1)).showCamera()\n    }\n}\n"
  }
]