From daafd804f8cda42f0a42c18ae18bbfcf085f8f69 Mon Sep 17 00:00:00 2001 From: Nikita Lipsky Date: Sun, 23 Oct 2022 14:51:36 +0300 Subject: [PATCH] Introduce defaultUIKitMain in compose library and use it from UIKit examples (#2426) --- .../examples/chat-mpp/gradle.properties | 2 +- .../src/uikitMain/kotlin/main.uikit.kt | 37 ++------------- .../falling-balls-mpp/gradle.properties | 2 +- .../src/uikitMain/kotlin/main.uikit.kt | 47 ++++--------------- .../examples/minesweeper/build.gradle.kts | 2 +- .../src/uikitMain/kotlin/main.uikit.kt | 45 ++++-------------- 6 files changed, 24 insertions(+), 111 deletions(-) diff --git a/experimental/examples/chat-mpp/gradle.properties b/experimental/examples/chat-mpp/gradle.properties index 4b3d798e86..2ef862b672 100644 --- a/experimental/examples/chat-mpp/gradle.properties +++ b/experimental/examples/chat-mpp/gradle.properties @@ -1,4 +1,4 @@ -compose.version=1.3.0-alpha01-dev824 +compose.version=1.3.0-alpha01-dev827 kotlin.version=1.7.10 agp.version=7.0.4 org.gradle.jvmargs=-Xmx3g diff --git a/experimental/examples/chat-mpp/src/uikitMain/kotlin/main.uikit.kt b/experimental/examples/chat-mpp/src/uikitMain/kotlin/main.uikit.kt index 68a627cf68..100b7b98d2 100644 --- a/experimental/examples/chat-mpp/src/uikitMain/kotlin/main.uikit.kt +++ b/experimental/examples/chat-mpp/src/uikitMain/kotlin/main.uikit.kt @@ -1,37 +1,8 @@ import androidx.compose.ui.window.Application -import kotlinx.cinterop.* -import platform.UIKit.* -import platform.Foundation.* +import androidx.compose.ui.main.defaultUIKitMain fun main() { - val args = emptyArray() - memScoped { - val argc = args.size + 1 - val argv = (arrayOf("skikoApp") + args).map { it.cstr.ptr }.toCValues() - autoreleasepool { - UIApplicationMain(argc, argv, null, NSStringFromClass(SkikoAppDelegate)) - } - } -} - -class SkikoAppDelegate : UIResponder, UIApplicationDelegateProtocol { - companion object : UIResponderMeta(), UIApplicationDelegateProtocolMeta - - @ObjCObjectBase.OverrideInit - constructor() : super() - - private var _window: UIWindow? = null - override fun window() = _window - override fun setWindow(window: UIWindow?) { - _window = window - } - - override fun application(application: UIApplication, didFinishLaunchingWithOptions: Map?): Boolean { - window = UIWindow(frame = UIScreen.mainScreen.bounds) - window!!.rootViewController = Application("Chat") { - ChatApp() - } - window!!.makeKeyAndVisible() - return true - } + defaultUIKitMain("Chat", Application("Chat") { + ChatApp() + }) } diff --git a/experimental/examples/falling-balls-mpp/gradle.properties b/experimental/examples/falling-balls-mpp/gradle.properties index 0b1c5306be..09710e726b 100644 --- a/experimental/examples/falling-balls-mpp/gradle.properties +++ b/experimental/examples/falling-balls-mpp/gradle.properties @@ -1,4 +1,4 @@ -compose.version=1.3.0-alpha01-dev824 +compose.version=1.3.0-alpha01-dev827 kotlin.version=1.7.10 agp.version=7.0.4 org.gradle.jvmargs=-Xmx3g diff --git a/experimental/examples/falling-balls-mpp/src/uikitMain/kotlin/main.uikit.kt b/experimental/examples/falling-balls-mpp/src/uikitMain/kotlin/main.uikit.kt index 3a3b2321a3..3b8cb18b4a 100644 --- a/experimental/examples/falling-balls-mpp/src/uikitMain/kotlin/main.uikit.kt +++ b/experimental/examples/falling-balls-mpp/src/uikitMain/kotlin/main.uikit.kt @@ -10,49 +10,20 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Application -import kotlinx.cinterop.* -import platform.UIKit.* -import platform.Foundation.* +import androidx.compose.ui.main.defaultUIKitMain object UikitTime : Time { override fun now(): Long = kotlin.system.getTimeNanos() } fun main() { - val args = emptyArray() - memScoped { - val argc = args.size + 1 - val argv = (arrayOf("skikoApp") + args).map { it.cstr.ptr }.toCValues() - autoreleasepool { - UIApplicationMain(argc, argv, null, NSStringFromClass(SkikoAppDelegate)) + defaultUIKitMain("FallingBalls", Application("Falling Balls") { + val game = remember { Game(UikitTime) } + Column { + // To skip upper part of screen. + Box(modifier = Modifier + .height(100.dp)) + FallingBalls(game) } - } -} - -class SkikoAppDelegate : UIResponder, UIApplicationDelegateProtocol { - companion object : UIResponderMeta(), UIApplicationDelegateProtocolMeta - - @ObjCObjectBase.OverrideInit - constructor() : super() - - private var _window: UIWindow? = null - override fun window() = _window - override fun setWindow(window: UIWindow?) { - _window = window - } - - override fun application(application: UIApplication, didFinishLaunchingWithOptions: Map?): Boolean { - window = UIWindow(frame = UIScreen.mainScreen.bounds) - window!!.rootViewController = Application("Falling Balls") { - val game = remember { Game(UikitTime) } - Column { - // To skip upper part of screen. - Box(modifier = Modifier - .height(100.dp)) - FallingBalls(game) - } - } - window!!.makeKeyAndVisible() - return true - } + }) } diff --git a/experimental/examples/minesweeper/build.gradle.kts b/experimental/examples/minesweeper/build.gradle.kts index fe0556c4c9..291ad22f3c 100644 --- a/experimental/examples/minesweeper/build.gradle.kts +++ b/experimental/examples/minesweeper/build.gradle.kts @@ -16,7 +16,7 @@ buildscript { plugins { kotlin("multiplatform") version "1.7.10" - id("org.jetbrains.compose") version "1.3.0-alpha01-dev824" + id("org.jetbrains.compose") version "1.3.0-alpha01-dev827" } version = "1.0-SNAPSHOT" diff --git a/experimental/examples/minesweeper/src/uikitMain/kotlin/main.uikit.kt b/experimental/examples/minesweeper/src/uikitMain/kotlin/main.uikit.kt index 6e5af18372..0eba731740 100644 --- a/experimental/examples/minesweeper/src/uikitMain/kotlin/main.uikit.kt +++ b/experimental/examples/minesweeper/src/uikitMain/kotlin/main.uikit.kt @@ -14,46 +14,17 @@ import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Application -import kotlinx.cinterop.* -import platform.UIKit.* -import platform.Foundation.* +import androidx.compose.ui.main.defaultUIKitMain fun main() { - val args = emptyArray() - memScoped { - val argc = args.size + 1 - val argv = (arrayOf("skikoApp") + args).map { it.cstr.ptr }.toCValues() - autoreleasepool { - UIApplicationMain(argc, argv, null, NSStringFromClass(SkikoAppDelegate)) + defaultUIKitMain("Minesweeper", Application("Minesweeper") { + Column { + // To skip upper part of screen. + Box(modifier = Modifier + .height(100.dp)) + Game() } - } -} - -class SkikoAppDelegate : UIResponder, UIApplicationDelegateProtocol { - companion object : UIResponderMeta(), UIApplicationDelegateProtocolMeta - - @ObjCObjectBase.OverrideInit - constructor() : super() - - private var _window: UIWindow? = null - override fun window() = _window - override fun setWindow(window: UIWindow?) { - _window = window - } - - override fun application(application: UIApplication, didFinishLaunchingWithOptions: Map?): Boolean { - window = UIWindow(frame = UIScreen.mainScreen.bounds) - window!!.rootViewController = Application("Minesweeper") { - Column { - // To skip upper part of screen. - Box(modifier = Modifier - .height(100.dp)) - Game() - } - } - window!!.makeKeyAndVisible() - return true - } + }) } @Composable