Skip to content

Commit cbdcb35

Browse files
authored
Merge pull request #37 from shiraji/22_add_dependancy
Support features related to PM dependencies
2 parents c052d7f + f9d1abd commit cbdcb35

File tree

7 files changed

+194
-38
lines changed

7 files changed

+194
-38
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.0.4'
2+
ext.kotlin_version = '1.0.6'
33
repositories {
44
mavenCentral()
55
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.github.shiraji.permissionsdispatcherplugin.actions
2+
3+
import com.github.shiraji.permissionsdispatcherplugin.data.AndroidGradleVersion
4+
import com.github.shiraji.permissionsdispatcherplugin.data.PdVersion
5+
import com.github.shiraji.permissionsdispatcherplugin.extentions.generateVersionNumberFrom
6+
import com.intellij.codeInsight.CodeInsightActionHandler
7+
import com.intellij.codeInsight.actions.CodeInsightAction
8+
import com.intellij.notification.Notification
9+
import com.intellij.notification.NotificationType
10+
import com.intellij.notification.Notifications
11+
import com.intellij.openapi.actionSystem.AnActionEvent
12+
import com.intellij.openapi.actionSystem.CommonDataKeys
13+
import com.intellij.openapi.editor.Editor
14+
import com.intellij.openapi.project.Project
15+
import com.intellij.psi.PsiFile
16+
import com.intellij.psi.PsiManager
17+
import com.intellij.psi.search.FilenameIndex
18+
import com.intellij.psi.search.GlobalSearchScope
19+
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
20+
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
21+
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory
22+
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement
23+
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCommandArgumentList
24+
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression
25+
26+
class AddPMDependencies : CodeInsightAction() {
27+
28+
override fun getHandler(): CodeInsightActionHandler {
29+
return AddPMDependenciesHandler()
30+
}
31+
32+
override fun update(e: AnActionEvent?) {
33+
e ?: return
34+
super.update(e)
35+
val project = e.getData(CommonDataKeys.PROJECT) ?: return
36+
FilenameIndex.getAllFilesByExt(project, "gradle", GlobalSearchScope.projectScope(project)).forEach {
37+
val groovyFile = PsiManager.getInstance(project).findFile(it) as? GroovyFile ?: return@forEach
38+
val dependenciesBlock = groovyFile.findDescendantOfType<GrMethodCallExpression> { it.invokedExpression.text == "dependencies" } ?: return@forEach
39+
if (dependenciesBlock.findDescendantOfType<GrCommandArgumentList> { it.text.contains("com.github.hotchemi:permissionsdispatcher:") } != null) {
40+
e.presentation.isEnabledAndVisible = false
41+
return
42+
}
43+
}
44+
}
45+
46+
class AddPMDependenciesHandler : CodeInsightActionHandler {
47+
48+
override fun startInWriteAction() = true
49+
50+
override fun invoke(project: Project, editor: Editor, file: PsiFile) {
51+
var hasAndroidApt = false
52+
var useKapt = false
53+
var androidGradleVersion: AndroidGradleVersion? = null
54+
55+
FilenameIndex.getAllFilesByExt(project, "gradle", GlobalSearchScope.projectScope(project)).forEach {
56+
val groovyFile = PsiManager.getInstance(project).findFile(it) as? GroovyFile ?: return@forEach
57+
if (groovyFile.findDescendantOfType<GrApplicationStatement> { it.text.contains("\'android-apt\'") } != null) hasAndroidApt = true
58+
if (groovyFile.findDescendantOfType<GrApplicationStatement> { it.text.contains("\'kotlin-android\'") } != null) useKapt = true
59+
60+
val androidGradleBuildLine = groovyFile.findDescendantOfType<GrCommandArgumentList> {
61+
it.text.contains("com.android.tools.build:gradle:")
62+
}
63+
64+
androidGradleBuildLine?.text?.let {
65+
text ->
66+
// for now, forget about variables...
67+
val versionText = text.generateVersionNumberFrom()
68+
androidGradleVersion = AndroidGradleVersion(versionText)
69+
}
70+
}
71+
72+
if (file !is GroovyFile) return
73+
74+
val version = androidGradleVersion
75+
when {
76+
version == null ->
77+
Notifications.Bus.notify(Notification(
78+
"PermissionsManager Plugin",
79+
"[PermissionsManager Plugin] No Android Gradle Version found",
80+
"No android gradle version found. To avoid generating wrong dependency, stop 'Add PermissionsDispatcher dependencies'",
81+
NotificationType.INFORMATION))
82+
!useKapt && version.isValid() && !version.isHigherThan2_2() && !hasAndroidApt ->
83+
Notifications.Bus.notify(Notification(
84+
"PermissionsManager Plugin",
85+
"[PermissionsManager Plugin] Missing settings",
86+
"No annotation processing settings found. Use 'android gradle plugin version >= 2.2' or 'android-apt'",
87+
NotificationType.WARNING))
88+
else -> {
89+
val dependenciesBlock = file.findDescendantOfType<GrMethodCallExpression> { it.invokedExpression.text == "dependencies" } ?: return
90+
val factory = GroovyPsiElementFactory.getInstance(project)
91+
val aptRef = when {
92+
useKapt -> "kapt"
93+
hasAndroidApt -> "apt"
94+
else -> "annotationProcessor"
95+
}
96+
val compileExpression = factory.createExpressionFromText("compile 'com.github.hotchemi:permissionsdispatcher:${PdVersion.latestVersion}'")
97+
val annotationProcessorExpression = factory.createExpressionFromText("$aptRef 'com.github.hotchemi:permissionsdispatcher-processor:${PdVersion.latestVersion}'")
98+
dependenciesBlock.closureArguments[0]?.let {
99+
it.addBefore(compileExpression, it.rBrace)
100+
it.addBefore(annotationProcessorExpression, it.rBrace)
101+
}
102+
}
103+
}
104+
}
105+
}
106+
}
107+

src/main/kotlin/com/github/shiraji/permissionsdispatcherplugin/actions/GeneratePMCodeAction.kt

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,21 @@ package com.github.shiraji.permissionsdispatcherplugin.actions
33
import com.github.shiraji.permissionsdispatcherplugin.config.GeneratePMCodeConfig
44
import com.github.shiraji.permissionsdispatcherplugin.data.PdVersion
55
import com.github.shiraji.permissionsdispatcherplugin.data.RebuildType
6+
import com.github.shiraji.permissionsdispatcherplugin.extentions.generateVersionNumberFrom
67
import com.github.shiraji.permissionsdispatcherplugin.handlers.GeneratePMCodeHandlerJava
78
import com.github.shiraji.permissionsdispatcherplugin.handlers.GeneratePMCodeHandlerKt
89
import com.github.shiraji.permissionsdispatcherplugin.models.GeneratePMCodeModel
910
import com.github.shiraji.permissionsdispatcherplugin.views.GeneratePMCodeDialog
1011
import com.intellij.codeInsight.CodeInsightActionHandler
1112
import com.intellij.codeInsight.actions.CodeInsightAction
1213
import com.intellij.compiler.actions.CompileProjectAction
14+
import com.intellij.notification.Notification
15+
import com.intellij.notification.NotificationType
16+
import com.intellij.notification.Notifications
1317
import com.intellij.openapi.actionSystem.AnActionEvent
1418
import com.intellij.openapi.actionSystem.CommonDataKeys
1519
import com.intellij.psi.PsiJavaFile
20+
import com.intellij.psi.PsiManager
1621
import com.intellij.psi.search.FilenameIndex
1722
import com.intellij.psi.search.GlobalSearchScope
1823
import org.jetbrains.kotlin.psi.KtFile
@@ -52,51 +57,64 @@ class GeneratePMCodeAction : CodeInsightAction() {
5257
val project = e?.getData(CommonDataKeys.PROJECT) ?: return
5358
isKotlin = e?.getData(CommonDataKeys.PSI_FILE) is KtFile
5459

55-
var pdVersion: PdVersion = PdVersion.UNKNOWN
60+
var pdVersion: PdVersion = PdVersion.NOTFOUND
5661

57-
// I think it should not be filter build.gradle. Find all .gradle files.
58-
FilenameIndex.getFilesByName(project, "build.gradle", GlobalSearchScope.projectScope(project)).forEach {
59-
if(it is GroovyFile) {
60-
val dependenciesBlock = it.findDescendantOfType<GrMethodCallExpression> {
61-
it.invokedExpression.text == "dependencies"
62-
}
63-
64-
val pdLine = dependenciesBlock?.findDescendantOfType<GrCommandArgumentList> {
65-
it.text.contains("com.github.hotchemi:permissionsdispatcher:")
66-
}
62+
fun updatePdVersion(dependenciesBlock: GrMethodCallExpression) {
63+
val pdLine = dependenciesBlock.findDescendantOfType<GrCommandArgumentList> {
64+
it.text.contains("com.github.hotchemi:permissionsdispatcher:")
65+
}
6766

68-
pdLine?.text?.let {
69-
text ->
70-
// for now, forget about variables...
71-
val versionText = text.substring(text.lastIndexOf(":") + 1).replace("\'", "").replace("\"", "")
72-
pdVersion = PdVersion.fromText(versionText)
73-
return@forEach
74-
}
67+
pdLine?.text?.let {
68+
text ->
69+
// for now, forget about variables...
70+
val versionText = text.generateVersionNumberFrom()
71+
pdVersion = PdVersion.fromText(versionText)
7572
}
7673
}
7774

78-
val dialog = GeneratePMCodeDialog(project, pdVersion)
79-
if (dialog.showAndGet()) {
80-
model = GeneratePMCodeModel(project)
81-
82-
model.apply {
83-
permissions = dialog.selectedPermissions
84-
if (dialog.needsPermissionCheckBox.isSelected) needsPermissionMethodName = dialog.needsPermissionTextField.text
85-
if (dialog.onShowRationaleCheckBox.isSelected) onShowRationaleMethodName = dialog.onShowRationaleTextField.text
86-
if (dialog.onPermissionDeniedCheckBox.isSelected) onPermissionDeniedMethodName = dialog.onPermissionDeniedTextField.text
87-
if (dialog.onNeverAskAgainCheckBox.isSelected) onNeverAskAgainMethodName = dialog.onNeverAskAgainTextField.text
88-
val maxSdkVersionText = dialog.maxSdkVersionTextField.text
89-
if (maxSdkVersionText != null && maxSdkVersionText.isNotBlank()) {
90-
maxSdkVersion = maxSdkVersionText.toInt()
75+
fun generatePMCode() {
76+
val dialog = GeneratePMCodeDialog(project, pdVersion)
77+
if (dialog.showAndGet()) {
78+
model = GeneratePMCodeModel(project)
79+
80+
model.apply {
81+
permissions = dialog.selectedPermissions
82+
if (dialog.needsPermissionCheckBox.isSelected) needsPermissionMethodName = dialog.needsPermissionTextField.text
83+
if (dialog.onShowRationaleCheckBox.isSelected) onShowRationaleMethodName = dialog.onShowRationaleTextField.text
84+
if (dialog.onPermissionDeniedCheckBox.isSelected) onPermissionDeniedMethodName = dialog.onPermissionDeniedTextField.text
85+
if (dialog.onNeverAskAgainCheckBox.isSelected) onNeverAskAgainMethodName = dialog.onNeverAskAgainTextField.text
86+
val maxSdkVersionText = dialog.maxSdkVersionTextField.text
87+
if (maxSdkVersionText != null && maxSdkVersionText.isNotBlank()) {
88+
maxSdkVersion = maxSdkVersionText.toInt()
89+
}
9190
}
91+
92+
super.actionPerformed(e)
93+
rebuildAction(e)
9294
}
95+
}
9396

94-
super.actionPerformed(e)
95-
afterActionPerformed(e)
97+
FilenameIndex.getAllFilesByExt(project, "gradle", GlobalSearchScope.projectScope(project)).forEach {
98+
val groovyFile = PsiManager.getInstance(project).findFile(it) as? GroovyFile ?: return@forEach
99+
val dependenciesBlock = groovyFile.findDescendantOfType<GrMethodCallExpression> {
100+
it.invokedExpression.text == "dependencies"
101+
} ?: return@forEach
102+
updatePdVersion(dependenciesBlock)
103+
}
104+
105+
if (pdVersion == PdVersion.NOTFOUND) {
106+
// no dependencies found for PermissionsDispatcher!
107+
Notifications.Bus.notify(Notification(
108+
"PermissionsManager Plugin",
109+
"No PermissionsDispatcher dependency found",
110+
"Please add PermissionsDispatcher dependency",
111+
NotificationType.WARNING))
112+
} else {
113+
generatePMCode()
96114
}
97115
}
98116

99-
private fun afterActionPerformed(e: AnActionEvent?) {
117+
private fun rebuildAction(e: AnActionEvent?) {
100118
when (RebuildType.fromId(GeneratePMCodeConfig.rebuildTypeId)) {
101119
RebuildType.ALWAYS -> rebuild(e)
102120
RebuildType.PROMPT -> {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.github.shiraji.permissionsdispatcherplugin.data
2+
3+
class AndroidGradleVersion(versionText: String) {
4+
private var major: Int
5+
private var minor: Int
6+
7+
init {
8+
try {
9+
major = versionText.substringBefore(".").toInt()
10+
minor = versionText.substring(versionText.indexOf(".") + 1, versionText.lastIndexOf(".")).toInt()
11+
} catch (e: NumberFormatException) {
12+
major = -1
13+
minor = -1
14+
}
15+
}
16+
17+
fun isHigherThan2_2() = major >= 2 && minor >= 2
18+
19+
fun isValid() = major >= 0 && minor >= 0
20+
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.github.shiraji.permissionsdispatcherplugin.data
22

3-
enum class PdVersion() {
3+
enum class PdVersion {
4+
NOTFOUND,
45
VERSION_2_1_3,
5-
VERSION_2_2_0,
66
UNKNOWN;
77

88
companion object {
99
fun fromText(versionText: String): PdVersion {
1010
return when (versionText) {
1111
"2.1.3" -> VERSION_2_1_3
12-
"2.2.0" -> VERSION_2_2_0
1312
else -> UNKNOWN
1413
}
1514
}
15+
16+
const val latestVersion = "2.3.1"
1617
}
1718
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.github.shiraji.permissionsdispatcherplugin.extentions
2+
3+
fun String.generateVersionNumberFrom() = substring(lastIndexOf(":") + 1).replace("\'", "").replace("\"", "")

src/main/resources/META-INF/plugin.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@
3737
text="Generate Runtime Permissions...">
3838
<add-to-group group-id="JavaGenerateGroup1" anchor="last"/>
3939
</action>
40+
41+
<action id="com.github.shiraji.permissionsdispatcherplugin.actions.AddPMDependencies"
42+
class="com.github.shiraji.permissionsdispatcherplugin.actions.AddPMDependencies"
43+
text="Add PermissionsDispatcher dependencies">
44+
<add-to-group group-id="GroovyGenerateGroup1" anchor="last"/>
45+
</action>
46+
4047
</actions>
4148

4249
</idea-plugin>

0 commit comments

Comments
 (0)