Implemented building Kotlin Android projects with Jack toolchain enabled
#KT-13275 Fixed Implemented KotlinJillTask for converting kotlin classes to jace format which could be consumed by Jack transform task
This commit is contained in:
+174
-2
@@ -8,6 +8,8 @@ import java.io.File
|
|||||||
|
|
||||||
class KotlinAndroidGradleCLIOnly : AbstractKotlinAndroidGradleTests(gradleVersion = "2.3", androidGradlePluginVersion = "1.5.+")
|
class KotlinAndroidGradleCLIOnly : AbstractKotlinAndroidGradleTests(gradleVersion = "2.3", androidGradlePluginVersion = "1.5.+")
|
||||||
|
|
||||||
|
class KotlinAndroidWithJackGradleCLIOnly : AbstractKotlinAndroidWithJackGradleTests(gradleVersion = "3.3", androidGradlePluginVersion = "2.3.+")
|
||||||
|
|
||||||
abstract class AbstractKotlinAndroidGradleTests(
|
abstract class AbstractKotlinAndroidGradleTests(
|
||||||
private val gradleVersion: String,
|
private val gradleVersion: String,
|
||||||
private val androidGradlePluginVersion: String
|
private val androidGradlePluginVersion: String
|
||||||
@@ -17,8 +19,6 @@ abstract class AbstractKotlinAndroidGradleTests(
|
|||||||
super.defaultBuildOptions().copy(androidHome = File("../../../dependencies/android-sdk-for-tests"),
|
super.defaultBuildOptions().copy(androidHome = File("../../../dependencies/android-sdk-for-tests"),
|
||||||
androidGradlePluginVersion = androidGradlePluginVersion)
|
androidGradlePluginVersion = androidGradlePluginVersion)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testSimpleCompile() {
|
fun testSimpleCompile() {
|
||||||
val project = Project("AndroidProject", gradleVersion)
|
val project = Project("AndroidProject", gradleVersion)
|
||||||
@@ -197,3 +197,175 @@ fun getSomething() = 10
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
abstract class AbstractKotlinAndroidWithJackGradleTests(
|
||||||
|
private val gradleVersion: String,
|
||||||
|
private val androidGradlePluginVersion: String
|
||||||
|
) : BaseGradleIT() {
|
||||||
|
|
||||||
|
fun getEnvJDK_18() = System.getenv()["JDK_18"]
|
||||||
|
|
||||||
|
override fun defaultBuildOptions() =
|
||||||
|
super.defaultBuildOptions().copy(androidHome = File("../../../dependencies/android-sdk-for-tests"),
|
||||||
|
androidGradlePluginVersion = androidGradlePluginVersion, javaHome = File(getEnvJDK_18()))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSimpleCompile() {
|
||||||
|
val project = Project("AndroidJackProject", gradleVersion)
|
||||||
|
|
||||||
|
project.build("build", "test") {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":Lib:compileReleaseKotlin",
|
||||||
|
|
||||||
|
":compileFlavor1DebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Debug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Debug",
|
||||||
|
|
||||||
|
":compileFlavor2DebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Debug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Debug",
|
||||||
|
|
||||||
|
":compileFlavor1JnidebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Jnidebug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Jnidebug",
|
||||||
|
|
||||||
|
":compileFlavor1ReleaseKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Release",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Release",
|
||||||
|
|
||||||
|
":compileFlavor2JnidebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Jnidebug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Jnidebug",
|
||||||
|
|
||||||
|
":compileFlavor2ReleaseKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Release",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Release",
|
||||||
|
|
||||||
|
":compileFlavor1DebugUnitTestKotlin",
|
||||||
|
"InternalDummyTest PASSED"
|
||||||
|
)
|
||||||
|
checkKotlinGradleBuildServices()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the build second time, assert everything is up-to-date
|
||||||
|
project.build("build") {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":Lib:compileReleaseKotlin UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor1DebugKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor1Debug UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Debug UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor2DebugKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor2Debug UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Debug UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor1JnidebugKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor1Jnidebug UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Jnidebug UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor1ReleaseKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor1Release UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Release UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor2JnidebugKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor2Jnidebug UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Jnidebug UP-TO-DATE",
|
||||||
|
|
||||||
|
":compileFlavor2ReleaseKotlin UP-TO-DATE",
|
||||||
|
":zipKotlinClassesForFlavor2Release UP-TO-DATE",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Release UP-TO-DATE"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
project.build("build", "--rerun-tasks") {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":Lib:compileReleaseKotlin",
|
||||||
|
|
||||||
|
":compileFlavor1DebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Debug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Debug",
|
||||||
|
|
||||||
|
":compileFlavor2DebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Debug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Debug",
|
||||||
|
|
||||||
|
":compileFlavor1JnidebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Jnidebug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Jnidebug",
|
||||||
|
|
||||||
|
":compileFlavor1ReleaseKotlin",
|
||||||
|
":zipKotlinClassesForFlavor1Release",
|
||||||
|
":transformKotlinClassesWithJillForFlavor1Release",
|
||||||
|
|
||||||
|
":compileFlavor2JnidebugKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Jnidebug",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Jnidebug",
|
||||||
|
|
||||||
|
":compileFlavor2ReleaseKotlin",
|
||||||
|
":zipKotlinClassesForFlavor2Release",
|
||||||
|
":transformKotlinClassesWithJillForFlavor2Release",
|
||||||
|
|
||||||
|
":compileFlavor1DebugUnitTestKotlin",
|
||||||
|
"InternalDummyTest PASSED"
|
||||||
|
)
|
||||||
|
checkKotlinGradleBuildServices()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testDagger() {
|
||||||
|
val project = Project("AndroidDaggerJackProject", gradleVersion)
|
||||||
|
val options = defaultBuildOptions().copy(incremental = false)
|
||||||
|
|
||||||
|
project.build("assembleDebug", options = options) {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":kaptDebugKotlin",
|
||||||
|
":compileDebugKotlin",
|
||||||
|
":zipKotlinClassesForDebug",
|
||||||
|
":transformKotlinClassesWithJillForDebug",
|
||||||
|
":transformJackWithJackForDebug"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testAndroidExtensions() {
|
||||||
|
val project = Project("AndroidExtensionsJackProject", gradleVersion)
|
||||||
|
val options = defaultBuildOptions().copy(incremental = false)
|
||||||
|
|
||||||
|
project.build("assembleDebug", options = options) {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":compileDebugKotlin",
|
||||||
|
":zipKotlinClassesForDebug",
|
||||||
|
":transformKotlinClassesWithJillForDebug",
|
||||||
|
":transformJackWithJackForDebug"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testIcepick() {
|
||||||
|
val project = Project("AndroidIcepickJackProject", gradleVersion)
|
||||||
|
val options = defaultBuildOptions().copy(incremental = false)
|
||||||
|
|
||||||
|
project.build("assembleDebug", options = options) {
|
||||||
|
assertSuccessful()
|
||||||
|
assertContains(
|
||||||
|
":kaptDebugKotlin",
|
||||||
|
":compileDebugKotlin",
|
||||||
|
":zipKotlinClassesForDebug",
|
||||||
|
":transformKotlinClassesWithJillForDebug",
|
||||||
|
":transformJackWithJackForDebug"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
+39
-9
@@ -24,6 +24,7 @@ abstract class BaseGradleIT {
|
|||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
workingDir = FileUtil.createTempDirectory("BaseGradleIT", null)
|
workingDir = FileUtil.createTempDirectory("BaseGradleIT", null)
|
||||||
|
acceptAndroidSdkLicenses()
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -31,34 +32,59 @@ abstract class BaseGradleIT {
|
|||||||
workingDir.deleteRecursively()
|
workingDir.deleteRecursively()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://developer.android.com/studio/intro/update.html#download-with-gradle
|
||||||
|
fun acceptAndroidSdkLicenses() = defaultBuildOptions().androidHome?.let {
|
||||||
|
val sdkLicenses = File(it, "licenses")
|
||||||
|
sdkLicenses.mkdirs()
|
||||||
|
|
||||||
|
val sdkLicense = File(sdkLicenses, "android-sdk-license")
|
||||||
|
if (!sdkLicense.exists()) {
|
||||||
|
sdkLicense.createNewFile()
|
||||||
|
sdkLicense.writeText("8933bad161af4178b1185d1a37fbf41ea5269c55")
|
||||||
|
}
|
||||||
|
|
||||||
|
val sdkPreviewLicense = File(sdkLicenses, "android-sdk-preview-license")
|
||||||
|
if (!sdkPreviewLicense.exists()) {
|
||||||
|
sdkPreviewLicense.writeText("84831b9409646a918e30573bab4c9c91346d8abd")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
protected val ranDaemonVersions = hashMapOf<String, Int>()
|
protected val ranDaemonVersions = hashMapOf<String, Int>()
|
||||||
|
|
||||||
val resourcesRootFile = File("src/test/resources")
|
val resourcesRootFile = File("src/test/resources")
|
||||||
val MAX_DAEMON_RUNS = 30
|
val MAX_DAEMON_RUNS = 30
|
||||||
|
|
||||||
|
fun getEnvJDK_18() = System.getenv()["JDK_18"]
|
||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@Synchronized
|
@Synchronized
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
fun tearDownAll() {
|
fun tearDownAll() {
|
||||||
ranDaemonVersions.keys.forEach { stopDaemon(it) }
|
// Latest gradle requires Java > 7
|
||||||
|
val environmentVariables = hashMapOf<String, String>()
|
||||||
|
getEnvJDK_18()?.let { environmentVariables["JAVA_HOME"] = it }
|
||||||
|
|
||||||
|
ranDaemonVersions.keys.forEach { stopDaemon(it, environmentVariables) }
|
||||||
ranDaemonVersions.clear()
|
ranDaemonVersions.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun stopDaemon(ver: String) {
|
fun stopDaemon(ver: String, environmentVariables: Map<String, String> = mapOf()) {
|
||||||
println("Stopping gradle daemon v$ver")
|
println("Stopping gradle daemon v$ver")
|
||||||
val wrapperDir = File(resourcesRootFile, "GradleWrapper-$ver")
|
val wrapperDir = File(resourcesRootFile, "GradleWrapper-$ver")
|
||||||
val cmd = createGradleCommand(arrayListOf("-stop"))
|
val cmd = createGradleCommand(arrayListOf("-stop"))
|
||||||
val result = runProcess(cmd, wrapperDir)
|
val result = runProcess(cmd, wrapperDir, environmentVariables)
|
||||||
assert(result.isSuccessful) { "Could not stop daemon: $result" }
|
assert(result.isSuccessful) { "Could not stop daemon: $result" }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun prepareDaemon(version: String) {
|
fun prepareDaemon(version: String, environmentVariables: Map<String, String> = mapOf()) {
|
||||||
val useCount = ranDaemonVersions.get(version)
|
val useCount = ranDaemonVersions.get(version)
|
||||||
if (useCount == null || useCount > MAX_DAEMON_RUNS) {
|
if (useCount == null || useCount > MAX_DAEMON_RUNS) {
|
||||||
stopDaemon(version)
|
stopDaemon(version, environmentVariables)
|
||||||
ranDaemonVersions.put(version, 1)
|
ranDaemonVersions.put(version, 1)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -73,6 +99,7 @@ abstract class BaseGradleIT {
|
|||||||
val daemonOptionSupported: Boolean = true,
|
val daemonOptionSupported: Boolean = true,
|
||||||
val incremental: Boolean? = null,
|
val incremental: Boolean? = null,
|
||||||
val androidHome: File? = null,
|
val androidHome: File? = null,
|
||||||
|
val javaHome: File? = null,
|
||||||
val androidGradlePluginVersion: String? = null,
|
val androidGradlePluginVersion: String? = null,
|
||||||
val forceOutputToStdout: Boolean = false,
|
val forceOutputToStdout: Boolean = false,
|
||||||
val debug: Boolean = false,
|
val debug: Boolean = false,
|
||||||
@@ -140,7 +167,7 @@ abstract class BaseGradleIT {
|
|||||||
val env = createEnvironmentVariablesMap(options)
|
val env = createEnvironmentVariablesMap(options)
|
||||||
|
|
||||||
if (options.withDaemon) {
|
if (options.withDaemon) {
|
||||||
prepareDaemon(wrapperVersion)
|
prepareDaemon(wrapperVersion, env)
|
||||||
}
|
}
|
||||||
|
|
||||||
println("<=== Test build: ${this.projectName} $cmd ===>")
|
println("<=== Test build: ${this.projectName} $cmd ===>")
|
||||||
@@ -284,13 +311,16 @@ abstract class BaseGradleIT {
|
|||||||
addAll(options.freeCommandLineArgs)
|
addAll(options.freeCommandLineArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Project.createEnvironmentVariablesMap(options: BuildOptions): Map<String, String> =
|
private fun createEnvironmentVariablesMap(options: BuildOptions): Map<String, String> =
|
||||||
hashMapOf<String, String>().apply {
|
hashMapOf<String, String>().apply {
|
||||||
val sdkDir = options.androidHome
|
options.androidHome?.let { sdkDir ->
|
||||||
if (sdkDir != null) {
|
|
||||||
sdkDir.parentFile.mkdirs()
|
sdkDir.parentFile.mkdirs()
|
||||||
put("ANDROID_HOME", sdkDir.canonicalPath)
|
put("ANDROID_HOME", sdkDir.canonicalPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
options.javaHome?.let {
|
||||||
|
put("JAVA_HOME", it.canonicalPath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR)
|
private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR)
|
||||||
|
|||||||
BIN
Binary file not shown.
+6
@@ -0,0 +1,6 @@
|
|||||||
|
#Mon Jan 23 22:08:28 MSK 2017
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
|
||||||
Vendored
+172
@@ -0,0 +1,172 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
##
|
||||||
|
## Gradle start up script for UN*X
|
||||||
|
##
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
PRG="$0"
|
||||||
|
# Need this for relative symlinks.
|
||||||
|
while [ -h "$PRG" ] ; do
|
||||||
|
ls=`ls -ld "$PRG"`
|
||||||
|
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||||
|
if expr "$link" : '/.*' > /dev/null; then
|
||||||
|
PRG="$link"
|
||||||
|
else
|
||||||
|
PRG=`dirname "$PRG"`"/$link"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
SAVED="`pwd`"
|
||||||
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
|
APP_HOME="`pwd -P`"
|
||||||
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS=""
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn ( ) {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die ( ) {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
NONSTOP* )
|
||||||
|
nonstop=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="java"
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||||
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
|
MAX_FD="$MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
ulimit -n $MAX_FD
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Darwin, add options to specify how the application appears in the dock
|
||||||
|
if $darwin; then
|
||||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; then
|
||||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
|
SEP=""
|
||||||
|
for dir in $ROOTDIRSRAW ; do
|
||||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||||
|
SEP="|"
|
||||||
|
done
|
||||||
|
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||||
|
# Add a user-defined pattern to the cygpath arguments
|
||||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||||
|
fi
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
i=0
|
||||||
|
for arg in "$@" ; do
|
||||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||||
|
|
||||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||||
|
else
|
||||||
|
eval `echo args$i`="\"$arg\""
|
||||||
|
fi
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
case $i in
|
||||||
|
(0) set -- ;;
|
||||||
|
(1) set -- "$args0" ;;
|
||||||
|
(2) set -- "$args0" "$args1" ;;
|
||||||
|
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Escape application args
|
||||||
|
save ( ) {
|
||||||
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
|
echo " "
|
||||||
|
}
|
||||||
|
APP_ARGS=$(save "$@")
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS=
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:init
|
||||||
|
@rem Get command-line arguments, handling Windows variants
|
||||||
|
|
||||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||||
|
|
||||||
|
:win9xME_args
|
||||||
|
@rem Slurp the command line arguments.
|
||||||
|
set CMD_LINE_ARGS=
|
||||||
|
set _SKIP=2
|
||||||
|
|
||||||
|
:win9xME_args_slurp
|
||||||
|
if "x%~1" == "x" goto execute
|
||||||
|
|
||||||
|
set CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
apply plugin: 'kotlin-kapt'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 25
|
||||||
|
buildToolsVersion "25.0.1"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.example.dagger.kotlin"
|
||||||
|
minSdkVersion 14
|
||||||
|
targetSdkVersion 25
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
|
||||||
|
jackOptions {
|
||||||
|
enabled true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
compile 'com.android.support:appcompat-v7:25.1.0'
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
|
||||||
|
compile 'com.google.dagger:dagger:2.2'
|
||||||
|
kapt 'com.google.dagger:dagger-compiler:2.2'
|
||||||
|
provided 'org.glassfish:javax.annotation:10.0-b28'
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in /Users/yan/Library/Android/sdk/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the proguardFiles
|
||||||
|
# directive in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.dagger.kotlin">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:label="app_name"
|
||||||
|
android:name=".DemoApplication">
|
||||||
|
<activity
|
||||||
|
android:label="app_name"
|
||||||
|
android:name=".ui.HomeActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Square, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Context.LOCATION_SERVICE
|
||||||
|
import android.location.LocationManager
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A module for Android-specific dependencies which require a [Context] or
|
||||||
|
* [android.app.Application] to create.
|
||||||
|
*/
|
||||||
|
@Module class AndroidModule(private val application: BaseApplication) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow the application context to be injected but require that it be annotated with
|
||||||
|
* [@Annotation][ForApplication] to explicitly differentiate it from an activity context.
|
||||||
|
*/
|
||||||
|
@Provides @Singleton @ForApplication
|
||||||
|
fun provideApplicationContext(): Context {
|
||||||
|
return application
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides @Singleton
|
||||||
|
fun provideLocationManager(): LocationManager {
|
||||||
|
return application.getSystemService(LOCATION_SERVICE) as LocationManager
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import com.example.dagger.kotlin.ui.HomeActivity
|
||||||
|
import dagger.Component
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
@Component(modules = arrayOf(AndroidModule::class))
|
||||||
|
interface ApplicationComponent {
|
||||||
|
fun inject(application: BaseApplication)
|
||||||
|
fun inject(homeActivity: HomeActivity)
|
||||||
|
fun inject(demoActivity: DemoActivity)
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
|
||||||
|
abstract class BaseApplication : Application() {
|
||||||
|
|
||||||
|
protected fun initDaggerComponent(): ApplicationComponent {
|
||||||
|
return DaggerApplicationComponent.builder().androidModule(AndroidModule(this)).build()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.os.Bundle
|
||||||
|
|
||||||
|
abstract class DemoActivity : Activity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
// Perform injection so that when this call returns all dependencies will be available for use.
|
||||||
|
(application as DemoApplication).component.inject(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
class DemoApplication : BaseApplication() {
|
||||||
|
lateinit var component: ApplicationComponent
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
val component = initDaggerComponent()
|
||||||
|
component.inject(this) // As of now, LocationManager should be injected into this.
|
||||||
|
this.component = component
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import javax.inject.Qualifier
|
||||||
|
|
||||||
|
@Qualifier
|
||||||
|
annotation class ForApplication
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
|
||||||
|
class UseRJavaActivity : Activity() {
|
||||||
|
fun useRJava() {
|
||||||
|
val app_name = getResources().getString(R.string.app_name)
|
||||||
|
}
|
||||||
|
}
|
||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Square, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.example.dagger.kotlin.ui
|
||||||
|
|
||||||
|
import android.location.LocationManager
|
||||||
|
import android.os.Bundle
|
||||||
|
import com.example.dagger.kotlin.DemoActivity
|
||||||
|
import com.example.dagger.kotlin.DemoApplication
|
||||||
|
import com.example.dagger.kotlin.R
|
||||||
|
import kotlinx.android.synthetic.main.activity_main.locationInfo
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class HomeActivity : DemoActivity() {
|
||||||
|
@Inject
|
||||||
|
lateinit var locationManager: LocationManager
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main)
|
||||||
|
(application as DemoApplication).component.inject(this)
|
||||||
|
|
||||||
|
// TODO do something with the injected dependencies here!
|
||||||
|
locationInfo.text = "Injected LocationManager:\n$locationManager"
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example.dagger.kotlin
|
||||||
|
|
||||||
|
fun useBuildConfigJava() {
|
||||||
|
if (BuildConfig.APPLICATION_ID != "com.example.dagger.kotlin") throw AssertionError()
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" tools:context=".ui.HomeActivity">
|
||||||
|
|
||||||
|
<TextView android:id="@+id/locationInfo"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="16dp" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">kotlin</string>
|
||||||
|
</resources>
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "com.android.tools.build:gradle:$android_tools_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
# Project-wide Gradle settings.
|
||||||
|
|
||||||
|
# IDE (e.g. Android Studio) users:
|
||||||
|
# Gradle settings configured through the IDE *will override*
|
||||||
|
# any settings specified in this file.
|
||||||
|
|
||||||
|
# For more details on how to configure your build environment visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
|
||||||
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
# Default value: -Xmx10248m -XX:MaxPermSize=256m
|
||||||
|
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||||
|
|
||||||
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
# org.gradle.parallel=true
|
||||||
|
org.gradle.jvmargs=-Xmx1536M
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
include ':app'
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 23
|
||||||
|
buildToolsVersion "25.0.1"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.example.dagger.kotlin"
|
||||||
|
minSdkVersion 14
|
||||||
|
targetSdkVersion 23
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
|
||||||
|
jackOptions { enabled true }
|
||||||
|
}
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
compile 'com.android.support:appcompat-v7:23.1.1'
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidextensions">
|
||||||
|
|
||||||
|
<application android:label="app_name">
|
||||||
|
<activity
|
||||||
|
android:label="app_name"
|
||||||
|
android:name="com.example.androidextensions.MyActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.androidextensions
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.app.Activity
|
||||||
|
import kotlinx.android.synthetic.main.activity_main.textView
|
||||||
|
|
||||||
|
class HomeActivity : Activity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main)
|
||||||
|
|
||||||
|
this.textView.setText("Hello, world!")
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<TextView android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">kotlin</string>
|
||||||
|
</resources>
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "com.android.tools.build:gradle:$android_tools_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.gradle.jvmargs=-ea -XX:MaxPermSize=512m
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
include ':app'
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply plugin: 'kotlin-kapt'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile "frankiesardo:icepick:3.2.0"
|
||||||
|
kapt "frankiesardo:icepick-processor:3.2.0"
|
||||||
|
|
||||||
|
compile 'org.parceler:parceler-api:1.1.5'
|
||||||
|
kapt 'org.parceler:parceler:1.1.5'
|
||||||
|
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 23
|
||||||
|
buildToolsVersion "25.0.1"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.example.icepick.kotlin"
|
||||||
|
minSdkVersion 14
|
||||||
|
targetSdkVersion 23
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
|
||||||
|
jackOptions { enabled true }
|
||||||
|
}
|
||||||
|
|
||||||
|
lintOptions {
|
||||||
|
abortOnError false
|
||||||
|
}
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven {
|
||||||
|
url "https://clojars.org/repo/"
|
||||||
|
}
|
||||||
|
mavenLocal()
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.github.frankiesardo.icepick"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@android:style/Theme.Holo.Light">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:label="@string/app_name">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
package com.github.frankiesardo.icepick
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import com.sample.icepick.lib.BaseCustomView
|
||||||
|
import icepick.State
|
||||||
|
|
||||||
|
class CustomView : BaseCustomView {
|
||||||
|
@JvmField @State
|
||||||
|
var textColor: Int? = null
|
||||||
|
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
|
||||||
|
|
||||||
|
fun setTextColorWithAnotherMethod(color: Int) {
|
||||||
|
this.textColor = color
|
||||||
|
setTextColor(textColor!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRestoreInstanceState(state: Parcelable) {
|
||||||
|
super.onRestoreInstanceState(state)
|
||||||
|
if (textColor != null) {
|
||||||
|
setTextColorWithAnotherMethod(textColor!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
package com.github.frankiesardo.icepick
|
||||||
|
|
||||||
|
import org.parceler.Parcel
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
class Example {
|
||||||
|
lateinit var name: String
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
var age: Int = 0
|
||||||
|
|
||||||
|
constructor() { /*Required empty bean constructor*/
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(age: Int, name: String) {
|
||||||
|
this.age = age
|
||||||
|
this.name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.github.frankiesardo.icepick
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Parcelable
|
||||||
|
|
||||||
|
import org.parceler.Parcels
|
||||||
|
|
||||||
|
import icepick.Bundler
|
||||||
|
|
||||||
|
class ExampleBundler : Bundler<Any> {
|
||||||
|
override fun put(s: String, example: Any, bundle: Bundle) {
|
||||||
|
bundle.putParcelable(s, Parcels.wrap(example))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun get(s: String, bundle: Bundle): Any {
|
||||||
|
return Parcels.unwrap<Any>(bundle.getParcelable<Parcelable>(s))
|
||||||
|
}
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
package com.github.frankiesardo.icepick
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import com.sample.icepick.lib.BaseActivity
|
||||||
|
import icepick.State
|
||||||
|
|
||||||
|
class MainActivity : BaseActivity() {
|
||||||
|
@JvmField @State(MyBundler::class)
|
||||||
|
var message: String? = null
|
||||||
|
|
||||||
|
lateinit var customView: CustomView
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main)
|
||||||
|
customView = findViewById(R.id.custom_view) as CustomView
|
||||||
|
updateText()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateText() {
|
||||||
|
val defaultText = if (message == null || baseMessage == null) {
|
||||||
|
"Use the menu to add some state"
|
||||||
|
} else {
|
||||||
|
baseMessage + message
|
||||||
|
}
|
||||||
|
customView.text = defaultText
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
menuInflater.inflate(R.menu.main, menu)
|
||||||
|
return super.onPrepareOptionsMenu(menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onMenuItemSelected(featureId: Int, item: MenuItem): Boolean {
|
||||||
|
if (item.itemId == R.id.action_add_state) {
|
||||||
|
customView.setBackgroundColorWithAnotherMethod(Color.BLUE)
|
||||||
|
customView.setTextColorWithAnotherMethod(Color.WHITE)
|
||||||
|
|
||||||
|
baseMessage = "This state will be automagically "
|
||||||
|
message = "saved and restored"
|
||||||
|
updateText()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return super.onMenuItemSelected(featureId, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package com.github.frankiesardo.icepick
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
|
||||||
|
import icepick.Bundler
|
||||||
|
|
||||||
|
class MyBundler : Bundler<String> {
|
||||||
|
override fun put(key: String, value: String?, bundle: Bundle) {
|
||||||
|
if (value != null) {
|
||||||
|
bundle.putString(key, value + "*")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun get(key: String, bundle: Bundle): String? {
|
||||||
|
return bundle.getString(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
package com.sample.icepick.lib
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Parcelable
|
||||||
|
import icepick.Icepick
|
||||||
|
import icepick.State
|
||||||
|
import android.util.Log
|
||||||
|
|
||||||
|
open class BaseActivity : Activity() {
|
||||||
|
@JvmField @State
|
||||||
|
var baseMessage: String? = null
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
Icepick.restoreInstanceState(this, savedInstanceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
|
super.onSaveInstanceState(outState)
|
||||||
|
Icepick.saveInstanceState(this, outState)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
package com.sample.icepick.lib
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Parcelable
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.widget.TextView
|
||||||
|
|
||||||
|
import icepick.Icepick
|
||||||
|
import icepick.State
|
||||||
|
|
||||||
|
open class BaseCustomView : TextView {
|
||||||
|
@JvmField @State
|
||||||
|
var backgroundColor: Int? = null
|
||||||
|
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
|
||||||
|
|
||||||
|
fun setBackgroundColorWithAnotherMethod(color: Int) {
|
||||||
|
this.backgroundColor = color
|
||||||
|
setBackgroundColor(color)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSaveInstanceState(): Parcelable {
|
||||||
|
return Icepick.saveInstanceState(this, super.onSaveInstanceState())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRestoreInstanceState(state: Parcelable) {
|
||||||
|
super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state))
|
||||||
|
if (backgroundColor != null) {
|
||||||
|
setBackgroundColorWithAnotherMethod(backgroundColor!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.github.frankiesardo.icepick.CustomView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:id="@+id/custom_view"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_add_state"
|
||||||
|
android:title="@string/action_add_state"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Icepick</string>
|
||||||
|
<string name="action_add_state">Add some state</string>
|
||||||
|
</resources>
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath "com.android.tools.build:gradle:$android_tools_version"
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.gradle.jvmargs=-ea -XX:MaxPermSize=512m
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
include 'app'
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile project(':Lib')
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||||
|
testCompile 'junit:junit:4.12'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 22
|
||||||
|
buildToolsVersion "25.0.1"
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/java2'
|
||||||
|
main.kotlin.srcDirs += 'root/kotlin'
|
||||||
|
test.kotlin.srcDirs += 'src/test/kotlin'
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 7
|
||||||
|
targetSdkVersion 22
|
||||||
|
|
||||||
|
jackOptions { enabled true }
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
jnidebug.initWith(buildTypes.debug)
|
||||||
|
jnidebug {
|
||||||
|
applicationIdSuffix ".jnidebug"
|
||||||
|
jniDebuggable true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
productFlavors {
|
||||||
|
flavor1 {
|
||||||
|
applicationId "com.example.flavor1"
|
||||||
|
versionCode 20
|
||||||
|
}
|
||||||
|
|
||||||
|
flavor2 {
|
||||||
|
applicationId "com.example.flavor2"
|
||||||
|
minSdkVersion 14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publishNonDefault true
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
noJdk = true
|
||||||
|
}
|
||||||
|
}
|
||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.test.androidalfa
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.app.Activity
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.Button
|
||||||
|
import org.jetbrains.kotlin.gradle.test.androidalfa.R
|
||||||
|
import lib.*
|
||||||
|
|
||||||
|
open class MainActivity2: Activity() {
|
||||||
|
|
||||||
|
protected override fun onCreate(savedInstanceState: Bundle?): Unit {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_main2)
|
||||||
|
libUtil()
|
||||||
|
|
||||||
|
var next: Button = findViewById(R.id.Button02) as Button
|
||||||
|
next.setOnClickListener(object: View.OnClickListener {
|
||||||
|
public override fun onClick(view: View): Unit {
|
||||||
|
val intent: Intent = Intent()
|
||||||
|
setResult(Activity.RESULT_OK, intent)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
public override fun onCreateOptionsMenu(menu: Menu?): Boolean {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.main_activity2, menu);
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.test.ApplicationTestCase
|
||||||
|
|
||||||
|
class InternalDummyApplicationTest : ApplicationTestCase<Application>(Application::class.java) {
|
||||||
|
init {
|
||||||
|
val dummy = InternalDummy("World")
|
||||||
|
assert("Hello World!" == dummy.greeting) { "Expected: 'Hello World!'. Actual value: ${dummy.greeting}" }
|
||||||
|
}
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.jetbrains.kotlin.gradle.test.androidalfa"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="7"
|
||||||
|
android:targetSdkVersion="16" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/AppTheme" >
|
||||||
|
<activity
|
||||||
|
android:name="org.jetbrains.kotlin.gradle.test.androidalfa.MainActivity"
|
||||||
|
android:label="@string/title_activity_main_activity1" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name="org.jetbrains.kotlin.gradle.test.androidalfa.MainActivity2"
|
||||||
|
android:label="@string/title_activity_main_activity2" >
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package foo;
|
||||||
|
|
||||||
|
import bar.*;
|
||||||
|
|
||||||
|
public class FooJavaClass {
|
||||||
|
void f() {
|
||||||
|
new FooKotlinClass();
|
||||||
|
new BarJavaClass();
|
||||||
|
new BarKotlinClass();
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
import bar.*
|
||||||
|
|
||||||
|
class FooKotlinClass {
|
||||||
|
fun f() {
|
||||||
|
FooJavaClass()
|
||||||
|
BarJavaClass()
|
||||||
|
BarKotlinClass()
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
|
internal class InternalDummy(private val name: String) {
|
||||||
|
internal val greeting: String
|
||||||
|
get() = "Hello $name!"
|
||||||
|
}
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.test.androidalfa;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.test.androidalfa.R;
|
||||||
|
|
||||||
|
public class MainActivity extends Activity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
Button next = (Button) findViewById(R.id.Button01);
|
||||||
|
next.setOnClickListener(new View.OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
Intent myIntent = new Intent(view.getContext(), MainActivity2.class);
|
||||||
|
startActivityForResult(myIntent, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.main, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package bar;
|
||||||
|
|
||||||
|
import foo.*;
|
||||||
|
|
||||||
|
public class BarJavaClass {
|
||||||
|
void f() {
|
||||||
|
new BarKotlinClass();
|
||||||
|
new FooJavaClass();
|
||||||
|
new FooKotlinClass();
|
||||||
|
}
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package bar
|
||||||
|
|
||||||
|
import foo.*
|
||||||
|
|
||||||
|
class BarKotlinClass {
|
||||||
|
fun f() {
|
||||||
|
BarJavaClass()
|
||||||
|
FooJavaClass()
|
||||||
|
FooKotlinClass()
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Activity 1" />
|
||||||
|
|
||||||
|
<Button android:text="Next"
|
||||||
|
android:id="@+id/Button01"
|
||||||
|
android:layout_width="250px"
|
||||||
|
android:textSize="18px"
|
||||||
|
android:layout_height="55px">
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
tools:context=".MainActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Activity 2" />
|
||||||
|
|
||||||
|
<Button android:text="Next"
|
||||||
|
android:id="@+id/Button02"
|
||||||
|
android:layout_width="250px"
|
||||||
|
android:textSize="18px"
|
||||||
|
android:layout_height="55px">
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/action_settings"
|
||||||
|
android:title="@string/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/action_settings"
|
||||||
|
android:title="@string/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
</resources>
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">AndroidAlfa</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
<string name="hello_world">Hello world!</string>
|
||||||
|
<string name="title_activity_main_activity1">MainActivity1</string>
|
||||||
|
<string name="title_activity_main_activity2">MainActivity2</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme, dependent on API level. This theme is replaced
|
||||||
|
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Light">
|
||||||
|
<!--
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Application theme. -->
|
||||||
|
<style name="AppTheme" parent="AppBaseTheme">
|
||||||
|
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle
|
||||||
|
|
||||||
|
import org.junit.Assert
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class InternalDummyTest {
|
||||||
|
@Test
|
||||||
|
fun testInternalDummy() {
|
||||||
|
val dummy = InternalDummy("World")
|
||||||
|
Assert.assertEquals("Hello World!", dummy.greeting)
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
apply plugin: 'com.android.library'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile files('libs/android-support-v4.jar')
|
||||||
|
// unused but needed for IncrementalCompilationMultiProjectIT.testAndroid to check if non-local dependency affects IC
|
||||||
|
compile 'io.reactivex:rxjava:1.1.9'
|
||||||
|
compile 'com.loopj.android:android-async-http:1.4.9'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 22
|
||||||
|
buildToolsVersion "25.0.1"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 7
|
||||||
|
targetSdkVersion 22
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Binary file not shown.
+27
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.jetbrains.kotlin.gradle.test.android.libalfa"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0" >
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="17"
|
||||||
|
android:targetSdkVersion="17" />
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/AppTheme" >
|
||||||
|
<activity
|
||||||
|
android:name="org.jetbrains.kotlin.gradle.test.android.libalfa.LibMainActivity"
|
||||||
|
android:label="@string/app_name" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
+39
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.test.android.libalfa;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.view.Menu;
|
||||||
|
|
||||||
|
public class LibMainActivity extends Activity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.lib_activity_main);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.lib_main, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package lib
|
||||||
|
|
||||||
|
fun libUtil(): String = "libUtil"
|
||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
tools:context=".LibMainActivity">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/hello_world" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/action_settings"
|
||||||
|
android:title="@string/action_settings"
|
||||||
|
android:orderInCategory="100"
|
||||||
|
android:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||||
|
screen margins) for sw600dp devices (e.g. 7" tablets) here. -->
|
||||||
|
</resources>
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Customize dimensions originally defined in res/values/dimens.xml (such as
|
||||||
|
screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. -->
|
||||||
|
<dimen name="activity_horizontal_margin">128dp</dimen>
|
||||||
|
</resources>
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme for API 11+. This theme completely replaces
|
||||||
|
AppBaseTheme from res/values/styles.xml on API 11+ devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
|
||||||
|
<!-- API 11 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme for API 14+. This theme completely replaces
|
||||||
|
AppBaseTheme from BOTH res/values/styles.xml and
|
||||||
|
res/values-v11/styles.xml on API 14+ devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
|
||||||
|
<!-- API 14 theme customizations can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||||
|
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||||
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
</resources>
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">LibAlfa</string>
|
||||||
|
<string name="action_settings">Settings</string>
|
||||||
|
<string name="hello_world">Hello world!</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Base application theme, dependent on API level. This theme is replaced
|
||||||
|
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||||
|
-->
|
||||||
|
<style name="AppBaseTheme" parent="android:Theme.Light">
|
||||||
|
<!--
|
||||||
|
Theme customizations available in newer API levels can go in
|
||||||
|
res/values-vXX/styles.xml, while customizations related to
|
||||||
|
backward-compatibility can go here.
|
||||||
|
-->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Application theme. -->
|
||||||
|
<style name="AppTheme" parent="AppBaseTheme">
|
||||||
|
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
classpath "com.android.tools.build:gradle:$android_tools_version"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.gradle.jvmargs=-XX:MaxPermSize=512m
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
include ':Android', ':Lib'
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.android.tools.build</groupId>
|
<groupId>com.android.tools.build</groupId>
|
||||||
<artifactId>gradle</artifactId>
|
<artifactId>gradle</artifactId>
|
||||||
<version>1.1.0</version>
|
<version>2.0.0</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
+11
@@ -213,6 +213,11 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
// Add generated source dir as a source root for kotlinCompile and javaCompile
|
// Add generated source dir as a source root for kotlinCompile and javaCompile
|
||||||
kotlinCompile.source(sourcesOutputDir)
|
kotlinCompile.source(sourcesOutputDir)
|
||||||
javaCompile.source(sourcesOutputDir)
|
javaCompile.source(sourcesOutputDir)
|
||||||
|
variantData?.let {
|
||||||
|
if (AndroidGradleWrapper.isJackEnabled(it)) {
|
||||||
|
AndroidGradleWrapper.addSourceToJack(it, sourcesOutputDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val pluginOptions = kaptTask.pluginOptions
|
val pluginOptions = kaptTask.pluginOptions
|
||||||
val compilerPluginId = getCompilerPluginId()
|
val compilerPluginId = getCompilerPluginId()
|
||||||
@@ -226,6 +231,12 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
|
|||||||
val options = javaCompile.options
|
val options = javaCompile.options
|
||||||
options.compilerArgs = options.compilerArgs.filter { !it.startsWith("-proc:") } + "-proc:none"
|
options.compilerArgs = options.compilerArgs.filter { !it.startsWith("-proc:") } + "-proc:none"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variantData?.let {
|
||||||
|
if (AndroidGradleWrapper.isJackEnabled(it)) {
|
||||||
|
AndroidGradleWrapper.disableJackAnnotationProcessing(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
private val BaseVariantData<*>.sourceProviders: List<SourceProvider>
|
||||||
|
|||||||
+28
-1
@@ -17,6 +17,7 @@ import org.gradle.api.plugins.JavaPlugin
|
|||||||
import org.gradle.api.plugins.JavaPluginConvention
|
import org.gradle.api.plugins.JavaPluginConvention
|
||||||
import org.gradle.api.tasks.Delete
|
import org.gradle.api.tasks.Delete
|
||||||
import org.gradle.api.tasks.SourceSet
|
import org.gradle.api.tasks.SourceSet
|
||||||
|
import org.gradle.api.tasks.bundling.Zip
|
||||||
import org.gradle.api.tasks.compile.AbstractCompile
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
import org.gradle.api.tasks.compile.JavaCompile
|
import org.gradle.api.tasks.compile.JavaCompile
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
|
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
|
||||||
@@ -25,6 +26,7 @@ import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin
|
|||||||
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin
|
||||||
import org.jetbrains.kotlin.gradle.internal.initKapt
|
import org.jetbrains.kotlin.gradle.internal.initKapt
|
||||||
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.android.KotlinJillTask
|
||||||
import org.jetbrains.kotlin.gradle.tasks.*
|
import org.jetbrains.kotlin.gradle.tasks.*
|
||||||
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
import org.jetbrains.kotlin.incremental.configureMultiProjectIncrementalCompilation
|
||||||
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProviderAndroidWrapper
|
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProviderAndroidWrapper
|
||||||
@@ -364,7 +366,8 @@ internal open class KotlinAndroidPlugin(
|
|||||||
val variantDataName = variantData.name
|
val variantDataName = variantData.name
|
||||||
logger.kotlinDebug("Process variant [$variantDataName]")
|
logger.kotlinDebug("Process variant [$variantDataName]")
|
||||||
|
|
||||||
val javaTask = AndroidGradleWrapper.getJavaCompile(variantData)
|
val javaTask = AndroidGradleWrapper.getJavaTask(variantData)
|
||||||
|
|
||||||
if (javaTask == null) {
|
if (javaTask == null) {
|
||||||
logger.info("KOTLIN: javaTask is missing for $variantDataName, so Kotlin files won't be compiled for it")
|
logger.info("KOTLIN: javaTask is missing for $variantDataName, so Kotlin files won't be compiled for it")
|
||||||
continue
|
continue
|
||||||
@@ -434,6 +437,30 @@ internal open class KotlinAndroidPlugin(
|
|||||||
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
configureMultiProjectIncrementalCompilation(project, kotlinTask, javaTask, kotlinAfterJavaTask,
|
||||||
artifactDifferenceRegistryProvider, artifactFile)
|
artifactDifferenceRegistryProvider, artifactFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (AndroidGradleWrapper.isJackEnabled(variantData)) {
|
||||||
|
val scope = variantData.scope
|
||||||
|
val kotlinDestinationDir = kotlinTask.destinationDir
|
||||||
|
val jarPath = File(kotlinDestinationDir.parent, kotlinDestinationDir.name + ".jar")
|
||||||
|
val zipTaskName = scope.getTaskName("zipKotlinClassesFor")
|
||||||
|
project.tasks.create(zipTaskName, Zip::class.java) { zipTask ->
|
||||||
|
zipTask.from(kotlinDestinationDir)
|
||||||
|
zipTask.destinationDir = File(jarPath.parent)
|
||||||
|
zipTask.archiveName = jarPath.name
|
||||||
|
zipTask.dependsOn(kotlinTask)
|
||||||
|
}
|
||||||
|
|
||||||
|
val kotlinJillTaskName = scope.getTaskName("transformKotlinClassesWithJillFor")
|
||||||
|
val jillOutputFilePath = File(jarPath.absolutePath + ".jill")
|
||||||
|
project.tasks.create(kotlinJillTaskName, KotlinJillTask::class.java) { jillTask ->
|
||||||
|
jillTask.buildTools = variantData.scope.globalScope.androidBuilder.targetInfo.buildTools
|
||||||
|
jillTask.inputJarFile = jarPath
|
||||||
|
jillTask.outputJillFile = jillOutputFilePath
|
||||||
|
jillTask.dependsOn(zipTaskName)
|
||||||
|
}
|
||||||
|
|
||||||
|
AndroidGradleWrapper.configureJackTask(variantData, jillOutputFilePath, kotlinJillTaskName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+82
-2
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin.android
|
package org.jetbrains.kotlin.gradle.plugin.android
|
||||||
|
|
||||||
|
import com.android.build.api.transform.*
|
||||||
import com.android.build.gradle.BaseExtension
|
import com.android.build.gradle.BaseExtension
|
||||||
import com.android.build.gradle.BasePlugin
|
import com.android.build.gradle.BasePlugin
|
||||||
import com.android.build.gradle.api.AndroidSourceSet
|
import com.android.build.gradle.api.AndroidSourceSet
|
||||||
@@ -23,8 +24,9 @@ import com.android.build.gradle.api.ApkVariant
|
|||||||
import com.android.build.gradle.api.BaseVariant
|
import com.android.build.gradle.api.BaseVariant
|
||||||
import com.android.build.gradle.api.TestVariant
|
import com.android.build.gradle.api.TestVariant
|
||||||
import com.android.build.gradle.internal.VariantManager
|
import com.android.build.gradle.internal.VariantManager
|
||||||
|
import com.android.build.gradle.internal.pipeline.OriginalStream
|
||||||
|
import com.android.build.gradle.internal.pipeline.TransformTask
|
||||||
import com.android.build.gradle.internal.variant.BaseVariantData
|
import com.android.build.gradle.internal.variant.BaseVariantData
|
||||||
import com.android.builder.dependency.LibraryDependency
|
|
||||||
import com.android.builder.model.SourceProvider
|
import com.android.builder.model.SourceProvider
|
||||||
import org.gradle.api.file.ConfigurableFileTree
|
import org.gradle.api.file.ConfigurableFileTree
|
||||||
import org.gradle.api.internal.DefaultDomainObjectSet
|
import org.gradle.api.internal.DefaultDomainObjectSet
|
||||||
@@ -64,7 +66,85 @@ class AndroidGradleWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
static AbstractCompile getJavaCompile(Object baseVariantData) {
|
private static getJackOptions(@NotNull Object variantData) {
|
||||||
|
def variantConfiguration = variantData.variantConfiguration
|
||||||
|
if (variantConfiguration.getMetaClass().getMetaMethod("getJackOptions")) {
|
||||||
|
return variantConfiguration.getJackOptions()
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isJackEnabled(@NotNull Object variantData) {
|
||||||
|
return getJackOptions(variantData)?.enabled ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
static AbstractCompile getJavaTask(@NotNull Object variantData) {
|
||||||
|
if (isJackEnabled(variantData)) {
|
||||||
|
return getJavacTask(variantData)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return getJavaCompile(variantData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static AbstractCompile getJavacTask(@NotNull Object baseVariantData) {
|
||||||
|
if (baseVariantData.getMetaClass().getMetaProperty("javacTask")) {
|
||||||
|
return baseVariantData.javacTask
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static TransformTask getJackTask(@NotNull Object variantData) {
|
||||||
|
def compilerTask = variantData.javaCompilerTask
|
||||||
|
if (compilerTask instanceof TransformTask) {
|
||||||
|
return compilerTask
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static getJackTransform(@NotNull Object variantData) {
|
||||||
|
return getJackTask(variantData)?.transform
|
||||||
|
}
|
||||||
|
|
||||||
|
static addSourceToJack(@NotNull Object variantData, @NotNull File sourceFolder) {
|
||||||
|
getJackTransform(variantData)?.addSource(sourceFolder)
|
||||||
|
}
|
||||||
|
|
||||||
|
static disableJackAnnotationProcessing(@NotNull Object variantData) {
|
||||||
|
def jackOptions = getJackTransform(variantData)?.options
|
||||||
|
jackOptions?.setAnnotationProcessorOutputDirectory(null)
|
||||||
|
jackOptions?.setAnnotationProcessorNames([])
|
||||||
|
jackOptions?.setAnnotationProcessorClassPath([])
|
||||||
|
jackOptions?.setAnnotationProcessorOptions([:])
|
||||||
|
}
|
||||||
|
|
||||||
|
static configureJackTask(
|
||||||
|
@NotNull Object variantData,
|
||||||
|
@NotNull File jillOutputFile,
|
||||||
|
@NotNull String kotlinJillTaskName) {
|
||||||
|
def jackTask = getJackTask(variantData)
|
||||||
|
// There is no Jack task for some variants
|
||||||
|
if (jackTask == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
def jillOutputStream = OriginalStream.builder()
|
||||||
|
.addContentType(QualifiedContent.DefaultContentType.CLASSES)
|
||||||
|
.addScope(QualifiedContent.Scope.PROJECT)
|
||||||
|
.setJar(jillOutputFile)
|
||||||
|
.setDependency(kotlinJillTaskName)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
jackTask.consumedInputStreams.add(jillOutputStream)
|
||||||
|
jackTask.dependsOn(kotlinJillTaskName)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static AbstractCompile getJavaCompile(@NotNull Object baseVariantData) {
|
||||||
if (baseVariantData.getMetaClass().getMetaProperty("javaCompileTask")) {
|
if (baseVariantData.getMetaClass().getMetaProperty("javaCompileTask")) {
|
||||||
return baseVariantData.javaCompileTask
|
return baseVariantData.javaCompileTask
|
||||||
}
|
}
|
||||||
|
|||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.plugin.android
|
||||||
|
|
||||||
|
|
||||||
|
import com.android.builder.core.BuildToolsServiceLoader
|
||||||
|
import com.android.jill.api.v01.Api01Config
|
||||||
|
import com.android.sdklib.BuildToolInfo
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.tasks.InputFile
|
||||||
|
import org.gradle.api.tasks.OutputFile
|
||||||
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
open class KotlinJillTask : DefaultTask() {
|
||||||
|
|
||||||
|
@InputFile
|
||||||
|
lateinit var inputJarFile: File
|
||||||
|
|
||||||
|
@OutputFile
|
||||||
|
lateinit var outputJillFile: File
|
||||||
|
|
||||||
|
lateinit var buildTools: BuildToolInfo
|
||||||
|
|
||||||
|
@TaskAction
|
||||||
|
fun transform() {
|
||||||
|
val jillProvider = BuildToolsServiceLoader.INSTANCE
|
||||||
|
.forVersion(buildTools)
|
||||||
|
.getServiceLoader(BuildToolsServiceLoader.JILL)
|
||||||
|
.firstOrNull() ?: error("Jill provider not found")
|
||||||
|
|
||||||
|
outputJillFile.parentFile.mkdirs()
|
||||||
|
val config01: Api01Config = jillProvider.createConfig(Api01Config::class.java)
|
||||||
|
config01.setInputJavaBinaryFile(inputJarFile)
|
||||||
|
config01.setOutputJackFile(outputJillFile)
|
||||||
|
config01.task.run()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user