Skip to content

Commit

Permalink
Support for kotlin script as build.gradle files (fixes #20) (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeppeman committed Jul 2, 2020
1 parent 516180d commit 02e46f3
Show file tree
Hide file tree
Showing 14 changed files with 42 additions and 77 deletions.
6 changes: 3 additions & 3 deletions README.md
Expand Up @@ -48,8 +48,8 @@ buildscript {
}
}
dependencies {
classpath "com.android.tools.build:gradle:3.6.1" // Compatible with 3.5 and above
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.2"
classpath "com.android.tools.build:gradle:4.0.0"
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.3"
}
}
Expand Down Expand Up @@ -141,7 +141,7 @@ You can also have a look at the <a href="locallydynamic-android-lib/sample">andr

Compatibility
---
Compatible with Android Studio 3.5 and 3.6 as well as the Android Gradle Plugin 3.5 and 3.6 (support for 4 is coming soon)
Compatible with Android Studio 3.5 and above as well as the Android Gradle Plugin 3.5 and above

Limitations
---
Expand Down
4 changes: 2 additions & 2 deletions locallydynamic-android-lib/README.md
Expand Up @@ -45,8 +45,8 @@ buildscript {
}
}
dependencies {
classpath "com.android.tools.build:gradle:3.5.3" // Compatible with 3.5 and above
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.2"
classpath "com.android.tools.build:gradle:4.0.0"
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.3"
}
}
Expand Down
4 changes: 2 additions & 2 deletions locallydynamic-android-lib/deps.gradle
Expand Up @@ -2,7 +2,7 @@ def versions = [
kotlin : '1.3.60',
appcompat : '1.1.0',
coroutines : '1.3.2',
androidplugin : '3.6.1',
androidplugin : '4.0.0',
lifecycle : '2.1.0',
mockito : '3.1.0',
robolectric : '4.3.1',
Expand All @@ -23,7 +23,7 @@ def versions = [
arch_core_testing : '2.1.0',
play : '1.6.5',
autoservice : '1.0-rc6',
locallydynamic_gradle: '0.2',
locallydynamic_gradle: '0.3',
publish : '3.6.2',
uiautomator : '2.2.0',
]
Expand Down
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="install_time_feature_string">Hi, I am a fragment from an install time feature</string>
<string name="install_time_feature_string" translatable="false">Hi, I am a fragment from an install time feature</string>
</resources>
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="on_demand_feature_string">Hi, I am a fragment from an on demand feature</string>
<string name="on_demand_feature_string" translatable="false">Hi, I am a fragment from an on demand feature</string>
</resources>
10 changes: 5 additions & 5 deletions locallydynamic-gradle-plugin/README.md
@@ -1,7 +1,7 @@
# locallydynamic-gradle-plugin

A gradle plugin that hooks into the bundle build process of the <a href="https://developer.android.com/studio/releases/gradle-plugin">Android Gradle Plugin</a> and uploads produced bundles to a <a href="../locallydynamic-server-library">LocallyDynamic server</a>.<br/>
Compatible with AGP 3.5 and 3.6.
Compatible with AGP 3.5 above

Usage
---
Expand All @@ -13,7 +13,7 @@ buildscript {
}
}
dependencies {
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.2"
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.3"
}
}
Expand All @@ -29,7 +29,7 @@ buildscript {
}
}
dependencies {
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.3-SNAPSHOT"
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.4-SNAPSHOT"
}
}
Expand Down Expand Up @@ -97,8 +97,8 @@ buildscript {
}
}
dependencies {
classpath "com.android.tools.build:gradle:3.6.1" // Compatible with 3.5 and above
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.2"
classpath "com.android.tools.build:gradle:4.0.0"
classpath "com.jeppeman.locallydynamic.gradle:plugin:0.3"
}
}
Expand Down
7 changes: 3 additions & 4 deletions locallydynamic-gradle-plugin/deps.gradle
@@ -1,19 +1,18 @@
def androidPluginVersion = project.hasProperty("agpVersion")
? project.properties.get("agpVersion")
: '3.6.1'
: '4.0.0'

def versions = [
androidplugin : androidPluginVersion,
kotlin : '1.3.60',
kotlin : '1.3.72',
versionsplugin : '0.25.0',
javapoet : '1.11.1',
junit : '5.5.2',
junit_platform : '1.5.2',
truth : '1.1.0',
mockito : '2.23.4',
mockito_kotlin : '2.1.0',
locallydynamic_server: '0.2',
gradle_publish : '0.10.1'
locallydynamic_server: '0.2'
]

ext.versions = versions
Expand Down
2 changes: 1 addition & 1 deletion locallydynamic-gradle-plugin/gradle.properties
@@ -1,5 +1,5 @@
GROUP=com.jeppeman.locallydynamic.gradle
VERSION_NAME=0.3-SNAPSHOT
VERSION_NAME=0.4-SNAPSHOT

POM_DESCRIPTION=LocallyDynamic - Gradle plugin to facilitate for local dynamic delivery for Android.

Expand Down
2 changes: 1 addition & 1 deletion locallydynamic-gradle-plugin/plugin/build.gradle
Expand Up @@ -2,7 +2,7 @@ plugins {
id 'java-gradle-plugin'
id 'java'
id 'kotlin'
id 'com.gradle.plugin-publish' version '0.10.1'
id 'com.gradle.plugin-publish' version '0.12.0'
}

dependencies {
Expand Down
@@ -0,0 +1,10 @@
package com.jeppeman.locallydynamic.gradle.extensions

import com.android.build.gradle.internal.dsl.BuildType
import com.jeppeman.locallydynamic.gradle.LocallyDynamicExtension
import org.gradle.api.plugins.ExtensionAware

fun BuildType.locallyDynamic(block: LocallyDynamicExtension.() -> Unit) {
val extension = (this as ExtensionAware).extensions.getByType(LocallyDynamicExtension::class.java)
extension.apply(block)
}
9 changes: 6 additions & 3 deletions locallydynamic-studio-plugin/build.gradle
Expand Up @@ -38,8 +38,7 @@ intellij {
plugins 'android'
type 'IC'
version '193.6911.18'
// alternativeIdePath "${ANDROID_STUDIO_STABLE_PATH}"
//localPath "${ANDROID_STUDIO_PREVIEW_PATH}" // android studio 3.6
// localPath "${System.getenv("ANDROID_STUDIO_PATH")}"
}

publishPlugin {
Expand Down Expand Up @@ -77,7 +76,11 @@ patchPluginXml {
//"""

// 0.5
// changeNotes """
// Make compatible with Android Studio 4.0.
//"""
// 0.6
changeNotes """
Make compatible with Android Studio 4.0.
Add support for kotlin build scripts (build.gradle.kts)
"""
}
2 changes: 1 addition & 1 deletion locallydynamic-studio-plugin/gradle.properties
@@ -1,5 +1,5 @@
GROUP=com.jeppeman.locallydynamic.idea
VERSION_NAME=0.6-SNAPSHOT
VERSION_NAME=0.7-SNAPSHOT

POM_DESCRIPTION=LocallyDynamic Server - Embeds a LocallyDynamic server into Android Studio that apps will download their splits from.

Expand Down
@@ -1,57 +1,10 @@
package com.jeppeman.locallydynamic.idea.extensions

import com.android.tools.idea.gradle.util.GradleUtil
import com.android.tools.idea.gradle.project.facet.gradle.GradleFacet
import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.idea.core.util.toPsiFile
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral
import java.util.HashMap

val Module.hasLocallyDynamicEnabled: Boolean
get() {
GradleUtil.getGradleBuildFile(this)?.let { file ->
file.toPsiFile(project)?.let { psiFile ->
return when (psiFile) {
!is GroovyFile -> false
else -> psiFile.plugins.contains("com.jeppeman.locallydynamic")
}
}
}
return false
}

val GroovyFile.plugins: List<String>
get() = ArrayList<String>().apply {
statements.toList().filterIsInstance<GrMethodCall>()
.filter { "apply" == it.invokedExpression.text }
.forEach { methodCall ->
val values = HashMap<String?, Any?>()
methodCall.argumentList.allArguments.filterIsInstance<GrNamedArgument>().forEach {
values[it.labelName] = it.expression?.parseValueExpression()
}
values["plugin"]?.let { plugin ->
add(plugin.toString())
}
}
}

private fun GrExpression.parseValueExpression(): Any? {
return when (this) {
is GrLiteral -> value
is GrListOrMap -> {
if (isMap) return null
ArrayList<Any>().apply {
initializers.forEach { subexpression ->
subexpression.parseValueExpression()?.let { subValue ->
add(subValue)
}
}
}
}
else -> null
}
}
get() = GradleFacet.getInstance(this)
?.gradleModuleModel
?.gradlePlugins
?.contains("com.jeppeman.locallydynamic.gradle.LocallyDynamicPlugin") == true

0 comments on commit 02e46f3

Please sign in to comment.