Skip to content

Commit 14f7492

Browse files
authored
Merge pull request #46 from skrzyneckik/feature/groovy-to-kotlin
Converted `androiddevmetrics-plugin` Groovy source code to Kotlin
2 parents 1e0e8fc + 5b8aa3a commit 14f7492

File tree

5 files changed

+128
-78
lines changed

5 files changed

+128
-78
lines changed

androiddevmetrics-plugin/build.gradle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
apply plugin: 'groovy'
1+
apply plugin: 'kotlin'
22
apply plugin: 'com.bmuschko.nexus'
33
apply plugin: 'com.jfrog.bintray'
44

@@ -17,6 +17,8 @@ dependencies {
1717
compile 'com.android.tools.build:gradle:3.0.1'
1818
compile 'org.aspectj:aspectjtools:1.8.8'
1919
compile 'org.aspectj:aspectjrt:1.8.8'
20+
compile "org.jetbrains.kotlin:kotlin-stdlib:1.2.21"
21+
testCompile "junit:junit:4.12"
2022
}
2123

2224
group = GROUP

androiddevmetrics-plugin/src/main/groovy/com/frogermcs/androiddevmetrics/weaving/plugin/AndroidDevMetricsPlugin.groovy

Lines changed: 0 additions & 77 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.frogermcs.androiddevmetrics.weaving.plugin
2+
3+
import com.android.build.gradle.*
4+
import com.android.build.gradle.api.BaseVariant
5+
import org.aspectj.bridge.IMessage
6+
import org.aspectj.bridge.MessageHandler
7+
import org.aspectj.tools.ajc.Main
8+
import org.gradle.api.DomainObjectSet
9+
import org.gradle.api.Plugin
10+
import org.gradle.api.Project
11+
import org.gradle.api.tasks.compile.AbstractCompile
12+
import java.io.File
13+
14+
class AndroidDevMetricsPlugin: Plugin<Project> {
15+
16+
override fun apply(project: Project) {
17+
with(project) {
18+
val hasApp = project.plugins.withType(AppPlugin::class.java).isNotEmpty()
19+
val hasLib = project.plugins.withType(LibraryPlugin::class.java).isNotEmpty()
20+
if (!hasApp && !hasLib) {
21+
throw IllegalStateException("'android' or 'android-library' plugin required.")
22+
}
23+
24+
//TODO can we do it as closure?
25+
project.dependencies.add("releaseCompile", "com.frogermcs.androiddevmetrics:androiddevmetrics-runtime-noop:0.6")
26+
project.dependencies.add("debugCompile", "com.frogermcs.androiddevmetrics:androiddevmetrics-runtime:0.6")
27+
project.dependencies.add("debugCompile", "org.aspectj:aspectjrt:1.8.8")
28+
project.dependencies.add("compile", "com.android.support:support-v4:26.1.0")
29+
30+
val log = project.logger
31+
val variants: DomainObjectSet<BaseVariant>
32+
if (hasApp) {
33+
variants = (project.extensions.getByName("android") as AppExtension).applicationVariants as DomainObjectSet<BaseVariant>
34+
} else {
35+
variants = (project.extensions.getByName("android") as LibraryExtension).libraryVariants as DomainObjectSet<BaseVariant>
36+
}
37+
38+
variants.all { variant ->
39+
if (!variant.buildType.isDebuggable) {
40+
log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
41+
return@all
42+
}
43+
44+
val javaCompiler = variant.javaCompiler as AbstractCompile
45+
javaCompiler.doLast({
46+
val args = arrayOf(
47+
"-showWeaveInfo",
48+
"-1.5",
49+
"-inpath", javaCompiler.destinationDir.toString(),
50+
"-aspectpath", javaCompiler.classpath.asPath,
51+
"-d", javaCompiler.destinationDir.toString(),
52+
"-classpath", javaCompiler.classpath.asPath,
53+
"-bootclasspath", (project.extensions.getByName("android") as BaseExtension).bootClasspath.joinToString(File.pathSeparator)
54+
)
55+
log.debug("ajc args: %s".format(args))
56+
57+
val handler = MessageHandler(true)
58+
Main().run(args, handler)
59+
60+
handler.getMessages(null, true).forEach {
61+
when(it.kind) {
62+
IMessage.ABORT, IMessage.ERROR, IMessage.FAIL -> log.error(it.message, it.thrown)
63+
IMessage.WARNING -> log.warn(it.message, it.thrown)
64+
IMessage.INFO -> log.info(it.message, it.thrown)
65+
IMessage.DEBUG -> log.debug(it.message, it.thrown)
66+
}
67+
}
68+
})
69+
}
70+
}
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.frogermcs.androiddevmetrics.weaving.plugin
2+
3+
import com.android.build.gradle.AppPlugin
4+
import com.android.build.gradle.LibraryPlugin
5+
import org.junit.Assert.assertNotNull
6+
import org.gradle.api.GradleException
7+
import org.gradle.testfixtures.ProjectBuilder
8+
import org.junit.Test
9+
10+
class AndroidDevMetricsPluginTest {
11+
12+
@Test(expected = GradleException::class)
13+
fun `plugin should throw exception when 'android' or 'android-library' plugin unavailable`() {
14+
val project = ProjectBuilder.builder().build()
15+
16+
project.pluginManager.apply(AndroidDevMetricsPlugin::class.java)
17+
}
18+
19+
@Test
20+
fun `plugin should work with 'android' plugin`() {
21+
val project = ProjectBuilder.builder().build()
22+
23+
with(project) {
24+
pluginManager.apply(AppPlugin::class.java)
25+
pluginManager.apply(AndroidDevMetricsPlugin::class.java)
26+
}
27+
}
28+
29+
@Test
30+
fun `plugin should work with 'android-library' plugin`() {
31+
val project = ProjectBuilder.builder().build()
32+
33+
with(project) {
34+
pluginManager.apply(LibraryPlugin::class.java)
35+
pluginManager.apply(AndroidDevMetricsPlugin::class.java)
36+
}
37+
}
38+
39+
@Test
40+
fun `plugin should add dependencies when applied`() {
41+
val project = ProjectBuilder.builder().build()
42+
43+
with(project) {
44+
pluginManager.apply(AppPlugin::class.java)
45+
pluginManager.apply(AndroidDevMetricsPlugin::class.java)
46+
47+
assertNotNull(project.dependencies.components.all { println(it.id) })
48+
49+
//TODO
50+
}
51+
}
52+
}

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ buildscript {
1616
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
1717
classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1'
1818
classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.6'
19+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
1920
}
2021
}
2122

0 commit comments

Comments
 (0)