diff --git a/samples/calculator/README.md b/samples/calculator/README.md
index d21b774dd12..77ff145d6e4 100644
--- a/samples/calculator/README.md
+++ b/samples/calculator/README.md
@@ -1,9 +1,15 @@
-# iOS calculator sample
+# Calculator sample
-This example shows how to use Kotlin library compiled to framework from
-an existing iOS project (e.g. written in Swift or Objective-C).
+This example shows how to use Kotlin library (located in [`src`](src/)) in different environments.
+Currently for
+* iOS (see [calculator](calculator/))
+* plain JVM (cli) (see [jvmCliApp](jvmCliApp/))
+* Android (see [androidApp](androidApp/))
-To build and run the sample do the following:
+## iOS
+The iOS project compile the library to a framework. The framework can easily included in an existing iOS project (e.g. written in Swift or Objective-C)
+
+To build and run the iOS sample do the following:
1. Open `samples/calculator/calculator.xcodeproj` with Xcode.
2. Open the project's target through project navigator, go to tab 'General'.
@@ -13,7 +19,7 @@ To build and run the sample do the following:
See the
[Xcode documentation](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/ConfiguringYourApp/ConfiguringYourApp.html#//apple_ref/doc/uid/TP40012582-CH28-SW2)
for more info.
-3. Now build and run the application on a connected iPhone with Xcode.
+3. Now build and run the application with Xcode.
The sample consists of:
@@ -22,17 +28,18 @@ The sample consists of:
2. Kotlin library source code and build script. It is built into Objective-C
framework by invoking Gradle from custom "Run Script" build phase, and this
framework is imported into the Xcode project.
-
+
## Using the same code with Kotlin/JVM
-
The library can also be compiled to a `.jar` by Kotlin/JVM compiler with Gradle.
Just run from the [sample root dir](../):
```
./gradlew calculator:jar
```
This will generate a `calculator.jar` in `build/libs/`.
+
+## Plain JVM
+The plain jvm sample (written in Kotlin/JVM) will use the library as a gradle dependency.
-There is also simple Kotlin/JVM CLI app available in `jvmCliApp` subdirectory.
To build and run it, use
```
./gradlew calculator:jvmCliApp:run
@@ -44,3 +51,11 @@ To build the distribution:
```
(the result will be available as
`jvmCliApp/build/distributions/KotlinCalculator.zip`)
+
+## Android App
+The Android App uses - similar to the plain JVM sample - the library as a gradle dependency.
+
+To build and run the Android sample do the following:
+
+1. Open `samples/` in Android Studio
+2. Now build and run the androidApp application
\ No newline at end of file
diff --git a/samples/calculator/androidApp/build.gradle b/samples/calculator/androidApp/build.gradle
new file mode 100644
index 00000000000..b091d60dc52
--- /dev/null
+++ b/samples/calculator/androidApp/build.gradle
@@ -0,0 +1,25 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 27
+ defaultConfig {
+ applicationId "org.konan.calculator"
+ minSdkVersion 21
+ targetSdkVersion 27
+ versionCode 1
+ versionName "1.0.0"
+ }
+}
+
+repositories {
+ google()
+ mavenCentral()
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+ implementation project.parent
+
+ implementation "com.android.support:appcompat-v7:27.0.2"
+}
diff --git a/samples/calculator/androidApp/src/main/AndroidManifest.xml b/samples/calculator/androidApp/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..4388566755e
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/AndroidManifest.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/calculator/androidApp/src/main/kotlin/org/konan/calculator/MainActivity.kt b/samples/calculator/androidApp/src/main/kotlin/org/konan/calculator/MainActivity.kt
new file mode 100644
index 00000000000..14f1b8f6cfa
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/kotlin/org/konan/calculator/MainActivity.kt
@@ -0,0 +1,28 @@
+package org.konan.calculator
+
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.widget.EditText
+import android.widget.TextView
+import org.konan.arithmeticparser.parseAndCompute
+
+class MainActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ val resultView = findViewById(R.id.computed_result)
+
+ val input = findViewById(R.id.input)
+ input.setOnEditorActionListener { input, _, _ ->
+ val inputText = input.text.toString()
+ val result = parseAndCompute(inputText).expression
+ with(resultView) {
+ text = if (result != null) inputText + " = " + result.toString() else "Unable to parse " + inputText
+ }
+ true
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/samples/calculator/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/samples/calculator/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000000..c7bd21dbd86
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/calculator/androidApp/src/main/res/drawable/ic_launcher_background.xml b/samples/calculator/androidApp/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000000..d5fccc538c1
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/calculator/androidApp/src/main/res/layout/activity_main.xml b/samples/calculator/androidApp/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000000..b86099edb22
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/layout/activity_main.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000000..eca70cfe52e
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000000..a2f5908281d
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..1b523998081
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000000..ff10afd6e18
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..115a4c768a2
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000000..dcd3cd80833
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..459ca609d3a
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..8ca12fe024b
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..8e19b410a1b
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..b824ebdd48d
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000000..4c19a13c239
Binary files /dev/null and b/samples/calculator/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/samples/calculator/androidApp/src/main/res/values/colors.xml b/samples/calculator/androidApp/src/main/res/values/colors.xml
new file mode 100644
index 00000000000..3ab3e9cbce0
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/samples/calculator/androidApp/src/main/res/values/strings.xml b/samples/calculator/androidApp/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..c042c2b9aef
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/values/strings.xml
@@ -0,0 +1,4 @@
+
+ Konan Calculator
+ Enter mathematic exression:
+
diff --git a/samples/calculator/androidApp/src/main/res/values/styles.xml b/samples/calculator/androidApp/src/main/res/values/styles.xml
new file mode 100644
index 00000000000..0eb88fe3350
--- /dev/null
+++ b/samples/calculator/androidApp/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/samples/calculator/build.gradle b/samples/calculator/build.gradle
index b4eaec3b6c1..398d6e4a6dd 100644
--- a/samples/calculator/build.gradle
+++ b/samples/calculator/build.gradle
@@ -1,8 +1,14 @@
buildscript {
ext.kotlin_version = '1.2.0'
+ repositories {
+ google()
+ jcenter()
+ }
+
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'com.android.tools.build:gradle:3.0.1'
}
}
diff --git a/samples/settings.gradle b/samples/settings.gradle
index 522fbcf99f6..ea291754f9d 100644
--- a/samples/settings.gradle
+++ b/samples/settings.gradle
@@ -2,6 +2,7 @@
// please add it into the 'buildSamplesWithPlatfromLibs' task in build.gradle.
include ':calculator'
include ':calculator:jvmCliApp'
+// include ':calculator:androidApp'
include ':csvparser'
include ':gitchurn'
include ':globalState'
@@ -13,8 +14,8 @@ include ':socket'
include ':tetris'
include ':tensorflow'
include ':torch'
-// Android native activity build requires Android SDK.
-// So temporary switching off for now, as it breaks the build
+// Android native activity build requires Android SDK.
+// So temporary switching off for now, as it breaks the build
// of other samples if SDK is not present.
// include ':androidNativeActivity'
include ':objc'
@@ -25,4 +26,3 @@ include ':workers'
includeBuild '../shared'
includeBuild '../tools/kotlin-native-gradle-plugin'
-