diff --git a/experimental/examples/falling-balls-mpp/.idea/.gitignore b/experimental/examples/falling-balls-mpp/.idea/.gitignore
new file mode 100644
index 0000000000..13566b81b0
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_desktop_1_0_SNAPSHOT.xml b/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_desktop_1_0_SNAPSHOT.xml
new file mode 100644
index 0000000000..59061987c5
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_desktop_1_0_SNAPSHOT.xml
@@ -0,0 +1,8 @@
+
+
+ $PROJECT_DIR$/build/libs
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_js_1_0_SNAPSHOT.xml b/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_js_1_0_SNAPSHOT.xml
new file mode 100644
index 0000000000..f6bafb49b8
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/artifacts/falling_balls_mpp_js_1_0_SNAPSHOT.xml
@@ -0,0 +1,8 @@
+
+
+ $PROJECT_DIR$/build/libs
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/compiler.xml b/experimental/examples/falling-balls-mpp/.idea/compiler.xml
new file mode 100644
index 0000000000..b73660a625
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/gradle.xml b/experimental/examples/falling-balls-mpp/.idea/gradle.xml
new file mode 100644
index 0000000000..b47d25fae1
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/jarRepositories.xml b/experimental/examples/falling-balls-mpp/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..bc6a72eadf
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/jarRepositories.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/misc.xml b/experimental/examples/falling-balls-mpp/.idea/misc.xml
new file mode 100644
index 0000000000..50c0927c79
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/misc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/.idea/vcs.xml b/experimental/examples/falling-balls-mpp/.idea/vcs.xml
new file mode 100644
index 0000000000..ccc96c563b
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/build.gradle.kts b/experimental/examples/falling-balls-mpp/build.gradle.kts
index c5a80129cf..01b05ff5e4 100644
--- a/experimental/examples/falling-balls-mpp/build.gradle.kts
+++ b/experimental/examples/falling-balls-mpp/build.gradle.kts
@@ -15,6 +15,7 @@ buildscript {
}
plugins {
+ id("com.android.application")
kotlin("multiplatform")
id("org.jetbrains.compose")
}
@@ -29,6 +30,7 @@ repositories {
google()}
kotlin {
+ android()
jvm("desktop")
js(IR) {
browser()
@@ -98,6 +100,15 @@ kotlin {
}
}
+ val androidMain by getting {
+ dependsOn(commonMain)
+ kotlin.srcDirs("src/jvmMain/kotlin")
+ dependencies {
+ api("androidx.appcompat:appcompat:1.4.1")
+ implementation("androidx.activity:activity-compose:1.4.0")
+ }
+ }
+
val desktopMain by getting {
dependencies {
implementation(compose.desktop.currentOs)
@@ -210,3 +221,24 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile::class.ja
"-Xir-dce-runtime-diagnostic=log"
)
}
+
+android {
+ compileSdk = 31
+
+ defaultConfig {
+ minSdk = 21
+ targetSdk = 31
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ sourceSets {
+ named("main") {
+ manifest.srcFile("src/androidMain/AndroidManifest.xml")
+ res.srcDirs("src/androidMain/res", "src/commonMain/resources")
+ }
+ }
+}
diff --git a/experimental/examples/falling-balls-mpp/gradle.properties b/experimental/examples/falling-balls-mpp/gradle.properties
index df22ef282c..702363f570 100644
--- a/experimental/examples/falling-balls-mpp/gradle.properties
+++ b/experimental/examples/falling-balls-mpp/gradle.properties
@@ -9,3 +9,5 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true
# Enable kotlin/native experimental memory model
kotlin.native.binary.memoryModel=experimental
compose.desktop.verbose=true
+agp.version=7.0.4
+android.useAndroidX=true
diff --git a/experimental/examples/falling-balls-mpp/settings.gradle.kts b/experimental/examples/falling-balls-mpp/settings.gradle.kts
index 17b62c9a6c..80673ec582 100644
--- a/experimental/examples/falling-balls-mpp/settings.gradle.kts
+++ b/experimental/examples/falling-balls-mpp/settings.gradle.kts
@@ -10,6 +10,10 @@ pluginManagement {
plugins {
val kotlinVersion = extra["kotlin.version"] as String
kotlin("multiplatform").version(kotlinVersion)
+ kotlin("android").version(kotlinVersion)
+
+ val agpVersion = extra["agp.version"] as String
+ id("com.android.application").version(agpVersion)
val composeVersion = extra["compose.version"] as String
id("org.jetbrains.compose").version(composeVersion)
diff --git a/experimental/examples/falling-balls-mpp/src/androidMain/AndroidManifest.xml b/experimental/examples/falling-balls-mpp/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000000..13544326ee
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt b/experimental/examples/falling-balls-mpp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt
new file mode 100644
index 0000000000..9ea02a4a76
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt
@@ -0,0 +1,23 @@
+package org.jetbrains.fallingballs
+
+import FallingBalls
+import Game
+import Time
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.appcompat.app.AppCompatActivity
+import androidx.compose.runtime.remember
+
+object AndroidTime : Time {
+ override fun now(): Long = System.nanoTime()
+}
+
+class MainActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ val game = remember { Game(AndroidTime) }
+ FallingBalls(game)
+ }
+ }
+}
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/src/androidMain/res/values/strings.xml b/experimental/examples/falling-balls-mpp/src/androidMain/res/values/strings.xml
new file mode 100644
index 0000000000..88a8d2c765
--- /dev/null
+++ b/experimental/examples/falling-balls-mpp/src/androidMain/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Chat app
+
\ No newline at end of file
diff --git a/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/fallingBalls/FallingBalls.kt b/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/fallingBalls/FallingBalls.kt
index 5774ced90b..731435037e 100644
--- a/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/fallingBalls/FallingBalls.kt
+++ b/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/fallingBalls/FallingBalls.kt
@@ -12,9 +12,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.em
-import org.jetbrains.skiko.KotlinBackend
-import kotlin.math.round
+import androidx.compose.ui.unit.sp
@Composable
fun FallingBalls(game: Game) {
@@ -22,10 +20,10 @@ fun FallingBalls(game: Game) {
Column {
Text(
"Catch balls!${if (game.finished) " Game over!" else ""}",
- fontSize = 1.8f.em,
+ fontSize = 20.sp,
color = Color(218, 120, 91)
)
- Text("Score: ${game.score} Time: ${game.elapsed / 1_000_000} Blocks: ${game.numBlocks.toInt()}", fontSize = 1.8f.em)
+ Text("Score: ${game.score} Time: ${game.elapsed / 1_000_000} Blocks: ${game.numBlocks.toInt()}", fontSize = 20.sp)
Row {
if (!game.started) {
Slider(
@@ -45,7 +43,7 @@ fun FallingBalls(game: Game) {
}
}
) {
- Text(if (game.started) "Stop" else "Start", fontSize = 2f.em)
+ Text(if (game.started) "Stop" else "Start", fontSize = 25.sp)
}
if (game.started) {
Button(
@@ -56,7 +54,7 @@ fun FallingBalls(game: Game) {
onClick = {
game.togglePause()
}) {
- Text(if (game.paused) "Resume" else "Pause", fontSize = 2f.em)
+ Text(if (game.paused) "Resume" else "Pause", fontSize = 25.sp)
}
}
}