From d2fdb65dbb4c1d89921a7f5f1f4f3976817cc21f Mon Sep 17 00:00:00 2001 From: Nikolai Rykunov Date: Tue, 26 Sep 2023 20:27:00 +0200 Subject: [PATCH 01/11] Update CHANGELOG.md for 1.5.10-beta02 --------- Co-authored-by: Ivan Matkov --- CHANGELOG.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22593eba1a7..acd0bd7ae29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,70 @@ +# 1.5.10-beta02 (September 2023) + +## Common + +### Features +* [Support kotlin 1.9.20-Beta2 with basic K2 support](https://github.com/JetBrains/compose-multiplatform/commit/393cfdd6638eee465b3c974fe9e6b3b0a1db57c1) +* [Implement `defaultTimePickerLayoutType` based on screen orientation](https://github.com/JetBrains/compose-multiplatform-core/pull/817) +* [Add an option to disable insets in `Popup`/`Dialog`](https://github.com/JetBrains/compose-multiplatform-core/pull/833) +* [Commonize insets `Modifier`'s \(additionally to `WindowInsets.*`\)](https://github.com/JetBrains/compose-multiplatform/issues/3563) + +### Fixes +* [`ExposedDropdownMenuBox.onExpandedChange` was not recomposed](https://github.com/JetBrains/compose-multiplatform/issues/3686) + +## iOS + +### Features +* Improve rendering performance + * [Avoid redundant compositing](https://github.com/JetBrains/compose-multiplatform-core/pull/813) + * [Don't send redundant synthetic moves](https://github.com/JetBrains/compose-multiplatform-core/pull/819) + * [Postpone `CAMetalDrawable` acquisition](https://github.com/JetBrains/compose-multiplatform-core/pull/820) + * [Move frame encoding to separate thread when possible](https://github.com/JetBrains/compose-multiplatform-core/pull/829) +* [Double tap and triple tap gesture handling in `TextField`s](https://github.com/JetBrains/compose-multiplatform/issues/2682) + +### Fixes +* [Expanded `ModalBottomSheet`: scrim doesn't occupy complete screen](https://github.com/JetBrains/compose-multiplatform/issues/3701) +* [Fix interop view intercepting touches for popups](https://github.com/JetBrains/compose-multiplatform-core/pull/835) +* [Fix applying `WindowInsets` inside `Popup`/`Dialog`](https://github.com/JetBrains/compose-multiplatform-core/pull/832) + + +## Desktop + +### Features + +* Improve accessibility support + * [Implement `Role.DropdownList` via `AccessibleRole.COMBO_BOX`](https://github.com/JetBrains/compose-multiplatform-core/pull/822) + * [Fix Compose `Role.Tab` to correctly translate to Java's `AccessibleRole.PAGE_TAB`](https://github.com/JetBrains/compose-multiplatform-core/pull/821) + * [Implement support for `SemanticsProperties.ProgressBarRangeInfo`](https://github.com/JetBrains/compose-multiplatform-core/pull/830) + +### Fixes +* [Can't type in `TextField` placed in `ModalBottomSheet`](https://github.com/JetBrains/compose-multiplatform/issues/3703) + +## Gradle Plugin + +### Features +* [Add API to not apply the Compose Compiler plugin](https://github.com/JetBrains/compose-multiplatform/pull/3722) + +### Fixes +* [Switch to notarytool for notarization](https://github.com/JetBrains/compose-multiplatform/pull/3642) + +## HTML library + +### Features +* [SVG - Add fillOpacity attribute](https://github.com/JetBrains/compose-multiplatform/pull/3725) + + +## Dependencies + +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: + +* [Compiler 1.5.3](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.5.3) +* [Runtime 1.5.1](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.5.1) +* [UI 1.5.1](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.1) +* [Foundation 1.5.1](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.5.1) +* [Material 1.5.1](https://developer.android.com/jetpack/androidx/releases/compose-material#1.5.1) +* [Material3 1.1.2](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.1.2) + + # 1.5.2 (September 2023) ## Desktop From e14a99a5170bd25a7338e0be3ad52c0e32a64c15 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Fri, 29 Sep 2023 14:07:55 +0400 Subject: [PATCH 02/11] Update Compose version to 1.5.2 (#3746) --- ci/compose-uber-jar/gradle.properties | 2 +- ci/templates/desktop-template/gradle.properties | 2 +- ci/templates/html-library-template/gradle.properties | 2 +- ci/templates/multiplatform-template/gradle.properties | 2 +- examples/chat/gradle.properties | 2 +- examples/cocoapods-ios-example/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/html/compose-bird/gradle.properties | 2 +- examples/html/compose-in-js/gradle.properties | 2 +- examples/html/landing/gradle.properties | 2 +- examples/html/with-react/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/interop/ios-compose-in-swiftui/gradle.properties | 2 +- examples/interop/ios-compose-in-uikit/gradle.properties | 2 +- examples/interop/ios-swiftui-in-compose/gradle.properties | 2 +- examples/interop/ios-uikit-in-compose/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/minesweeper/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- gradle-plugins/gradle.properties | 2 +- tutorials/HTML/Getting_Started/README.md | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index a4721c9a218..21cdea8a3db 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.5.1 +compose.version=1.5.2 kotlin.code.style=official diff --git a/ci/templates/desktop-template/gradle.properties b/ci/templates/desktop-template/gradle.properties index 1e2d69b4edc..f38317683d2 100644 --- a/ci/templates/desktop-template/gradle.properties +++ b/ci/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/ci/templates/html-library-template/gradle.properties b/ci/templates/html-library-template/gradle.properties index 1e2d69b4edc..f38317683d2 100644 --- a/ci/templates/html-library-template/gradle.properties +++ b/ci/templates/html-library-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/ci/templates/multiplatform-template/gradle.properties b/ci/templates/multiplatform-template/gradle.properties index 1a553a85ae5..c0845dfbe2f 100644 --- a/ci/templates/multiplatform-template/gradle.properties +++ b/ci/templates/multiplatform-template/gradle.properties @@ -4,4 +4,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/chat/gradle.properties b/examples/chat/gradle.properties index 3171ccd3f64..c2f765215a8 100644 --- a/examples/chat/gradle.properties +++ b/examples/chat/gradle.properties @@ -11,4 +11,4 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/cocoapods-ios-example/gradle.properties b/examples/cocoapods-ios-example/gradle.properties index 85ae4d75423..ad74f4bfd3e 100644 --- a/examples/cocoapods-ios-example/gradle.properties +++ b/examples/cocoapods-ios-example/gradle.properties @@ -21,4 +21,4 @@ org.jetbrains.compose.experimental.uikit.enabled=true #Versions kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 \ No newline at end of file +compose.version=1.5.2 \ No newline at end of file diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 3171ccd3f64..c2f765215a8 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -11,4 +11,4 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index 2e30567e908..73998f2d5e5 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -11,7 +11,7 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 # TODO: remove when switching to 1.9.10. See: https://youtrack.jetbrains.com/issue/KT-60852 # usage: ./gradlew :jsApp:jsBrowserRun -Pworkaround.kotlin.js.kt60852=true diff --git a/examples/html/compose-bird/gradle.properties b/examples/html/compose-bird/gradle.properties index fc448992710..eac7330d499 100644 --- a/examples/html/compose-bird/gradle.properties +++ b/examples/html/compose-bird/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/html/compose-in-js/gradle.properties b/examples/html/compose-in-js/gradle.properties index f03863f3662..9a4930525c0 100644 --- a/examples/html/compose-in-js/gradle.properties +++ b/examples/html/compose-in-js/gradle.properties @@ -3,4 +3,4 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.enableDependencyPropagation=false kotlin.js.webpack.major.version=4 kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/html/landing/gradle.properties b/examples/html/landing/gradle.properties index fc448992710..eac7330d499 100644 --- a/examples/html/landing/gradle.properties +++ b/examples/html/landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/html/with-react/gradle.properties b/examples/html/with-react/gradle.properties index fc448992710..eac7330d499 100644 --- a/examples/html/with-react/gradle.properties +++ b/examples/html/with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 6087fc3f966..d679c62ede6 100644 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -11,4 +11,4 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index fc448992710..eac7330d499 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/interop/ios-compose-in-swiftui/gradle.properties b/examples/interop/ios-compose-in-swiftui/gradle.properties index d90ce5fa886..6a393189e2a 100644 --- a/examples/interop/ios-compose-in-swiftui/gradle.properties +++ b/examples/interop/ios-compose-in-swiftui/gradle.properties @@ -3,4 +3,4 @@ xcodeproj=./iosApp org.gradle.jvmargs=-Xmx3g org.jetbrains.compose.experimental.uikit.enabled=true kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/interop/ios-compose-in-uikit/gradle.properties b/examples/interop/ios-compose-in-uikit/gradle.properties index 0846aada9a3..65e21ac13ef 100644 --- a/examples/interop/ios-compose-in-uikit/gradle.properties +++ b/examples/interop/ios-compose-in-uikit/gradle.properties @@ -5,4 +5,4 @@ org.jetbrains.compose.experimental.uikit.enabled=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/interop/ios-swiftui-in-compose/gradle.properties b/examples/interop/ios-swiftui-in-compose/gradle.properties index 0846aada9a3..65e21ac13ef 100644 --- a/examples/interop/ios-swiftui-in-compose/gradle.properties +++ b/examples/interop/ios-swiftui-in-compose/gradle.properties @@ -5,4 +5,4 @@ org.jetbrains.compose.experimental.uikit.enabled=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/interop/ios-uikit-in-compose/gradle.properties b/examples/interop/ios-uikit-in-compose/gradle.properties index 0846aada9a3..65e21ac13ef 100644 --- a/examples/interop/ios-uikit-in-compose/gradle.properties +++ b/examples/interop/ios-uikit-in-compose/gradle.properties @@ -5,4 +5,4 @@ org.jetbrains.compose.experimental.uikit.enabled=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index ab64d77fbe0..a416a41fc20 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -21,4 +21,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/minesweeper/gradle.properties b/examples/minesweeper/gradle.properties index 2e30567e908..73998f2d5e5 100644 --- a/examples/minesweeper/gradle.properties +++ b/examples/minesweeper/gradle.properties @@ -11,7 +11,7 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 # TODO: remove when switching to 1.9.10. See: https://youtrack.jetbrains.com/issue/KT-60852 # usage: ./gradlew :jsApp:jsBrowserRun -Pworkaround.kotlin.js.kt60852=true diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index 1e2d69b4edc..f38317683d2 100644 --- a/examples/notepad/gradle.properties +++ b/examples/notepad/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.9.10 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 3171ccd3f64..c2f765215a8 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -11,4 +11,4 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index 40e32276bdb..51a3f03b2ce 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -11,4 +11,4 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 3171ccd3f64..c2f765215a8 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -11,4 +11,4 @@ kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.10 agp.version=8.0.2 -compose.version=1.5.1 +compose.version=1.5.2 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index fe6abc34215..cafb63b058e 100644 --- a/gradle-plugins/gradle.properties +++ b/gradle-plugins/gradle.properties @@ -2,7 +2,7 @@ org.gradle.parallel=true kotlin.code.style=official # Default version of Compose Libraries used by Gradle plugin -compose.version=1.5.1 +compose.version=1.5.2 # The latest version of Compose Compiler used by Gradle plugin. Used only in tests/CI. compose.tests.compiler.version=1.5.2 # The latest version of Kotlin compatible with compose.tests.compiler.version. Used only in tests/CI. diff --git a/tutorials/HTML/Getting_Started/README.md b/tutorials/HTML/Getting_Started/README.md index 8b87e2ce214..75b9e051d3e 100644 --- a/tutorials/HTML/Getting_Started/README.md +++ b/tutorials/HTML/Getting_Started/README.md @@ -37,7 +37,7 @@ pluginManagement { // Add compose gradle plugin plugins { kotlin("multiplatform") version "1.9.10" - id("org.jetbrains.compose") version "1.5.1" + id("org.jetbrains.compose") version "1.5.2" } // Add maven repositories From fd6d6c87e1c38978df9c47bf702e439f2f418eed Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Sat, 30 Sep 2023 04:28:02 +0400 Subject: [PATCH 03/11] COMPOSE-338 Remove uikit experimental flag in gradle.properties (#3747) Issue https://youtrack.jetbrains.com/issue/COMPOSE-338/remove-iOS-experimental-flag No more need this line: org.jetbrains.compose.experimental.uikit.enabled=true --- .../compose/experimental/internal/checkExperimentalTargets.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/checkExperimentalTargets.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/checkExperimentalTargets.kt index 532d77ec130..a5bb901ee21 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/checkExperimentalTargets.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/checkExperimentalTargets.kt @@ -25,7 +25,6 @@ private class TargetType( private val TargetType.gradlePropertyName get() = "org.jetbrains.compose.experimental.$id.enabled" private val EXPERIMENTAL_TARGETS: Set = setOf( - TargetType("uikit", presets = listOf("iosSimulatorArm64", "iosArm64", "iosX64")), TargetType("macos", presets = listOf("macosX64", "macosArm64")), TargetType("jscanvas", presets = listOf("jsIr", "js")), ) From 7c2bec465489d706451fa3ad5810d060f5bc7773 Mon Sep 17 00:00:00 2001 From: j-roskopf <7951665+j-roskopf@users.noreply.github.com> Date: Mon, 2 Oct 2023 05:30:21 -0500 Subject: [PATCH 04/11] Update ComposeDemoAction.kt to remove unused imports (#3738) --- .../main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt b/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt index 581c8cbe914..dbe8091af07 100755 --- a/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt +++ b/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt @@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.Surface import androidx.compose.ui.Modifier import androidx.compose.ui.awt.ComposePanel -import androidx.compose.ui.layout.Layout -import androidx.compose.ui.layout.MeasurePolicy -import androidx.compose.ui.layout.onGloballyPositioned import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project @@ -21,9 +18,7 @@ import com.jetbrains.compose.widgets.LazyScrollable import com.jetbrains.compose.widgets.Loaders import com.jetbrains.compose.widgets.TextInputs import com.jetbrains.compose.widgets.Toggles -import java.awt.Dimension import javax.swing.JComponent -import javax.swing.SwingUtilities /** From ff59c4861706f2ae216b080bb46ba69d627137d6 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Tue, 3 Oct 2023 19:35:18 +0200 Subject: [PATCH 05/11] Fix configuration cache for `syncComposeResourcesForIos` (#3764) Currently when `org.gradle.configuration-cache=true` we have an error: > Configuration cache state could not be cached: field `resourceFiles` of task `:shared:syncComposeResourcesForIos` of type `org.jetbrains.compose.experimental.uikit.tasks.SyncComposeResourcesForIosTask`: error writing value of type 'org.gradle.api.internal.provider.TransformBackedProvider' Old description (can be ignored): _This PR attempts to fix it in SyncComposeResourcesForIosTask by wrapping inputs into providers. It seems that gradle configuration cache doesn't like some provider types produced by `.map`, `.zip`, `.orElse`, etc._ **Latest description:** With configuration cache enabled, gradle runs all `orElse` providers during configuration (I don't know why yet). We used to throw an exception in `orElse` which led to the crash. This PR refactors SyncComposeResourcesForIosTask so it doesn't throw an exception immediately in orElse, but postpones it to later step. --- .../tasks/SyncComposeResourcesForIosTask.kt | 25 +++++++++++++------ .../tests/integration/GradlePluginTest.kt | 14 +++++++---- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/SyncComposeResourcesForIosTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/SyncComposeResourcesForIosTask.kt index 01797f9f7a8..8d4b7e72640 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/SyncComposeResourcesForIosTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/SyncComposeResourcesForIosTask.kt @@ -19,25 +19,34 @@ import kotlin.io.path.pathString import kotlin.io.path.relativeTo abstract class SyncComposeResourcesForIosTask : AbstractComposeIosTask() { - private fun missingTargetEnvAttributeError(attribute: String): Provider = - providers.provider { - error( - "Could not infer iOS target $attribute. Make sure to build " + - "via XCode (directly or via Kotlin Multiplatform Mobile plugin for Android Studio)") + + private fun Provider.orElseThrowMissingAttributeError(attribute: String): Provider { + val noProvidedValue = "__NO_PROVIDED_VALUE__" + return this.orElse(noProvidedValue).map { + if (it == noProvidedValue) { + error( + "Could not infer iOS target $attribute. Make sure to build " + + "via XCode (directly or via Kotlin Multiplatform Mobile plugin for Android Studio)") + } + it } + } @get:Input val xcodeTargetPlatform: Provider = providers.gradleProperty("compose.ios.resources.platform") .orElse(providers.environmentVariable("PLATFORM_NAME")) - .orElse(missingTargetEnvAttributeError("platform")) + .orElseThrowMissingAttributeError("platform") + @get:Input val xcodeTargetArchs: Provider> = providers.gradleProperty("compose.ios.resources.archs") .orElse(providers.environmentVariable("ARCHS")) - .orElse(missingTargetEnvAttributeError("architectures")) - .map { it.split(",", " ").filter { it.isNotBlank() } } + .orElseThrowMissingAttributeError("architectures") + .map { + it.split(",", " ").filter { it.isNotBlank() } + } @get:Input internal val iosTargets: SetProperty = objects.setProperty(IosTargetResources::class.java) diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt index 24a7d27f005..89cae4831e0 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt @@ -62,13 +62,18 @@ class GradlePluginTest : GradlePluginTestBase() { ) } + // We rely on this property to use gradle configuration cache in some tests. + // Enabling configuration cache unconditionally breaks out tests with gradle 7.3.3. + // Old comment: 'for some reason configuration cache + test kit + custom vars does not work' + private val GradleVersion.isAtLeastGradle8 + get() = this >= GradleVersion.version("8.0") + @Test fun iosResources() { Assumptions.assumeTrue(currentOS == OS.MacOS) val iosTestEnv = iosTestEnv() val testEnv = defaultTestEnvironment.copy( - // for some reason configuration cache + test kit + custom vars does not work - useGradleConfigurationCache = false, + useGradleConfigurationCache = TestProperties.gradleBaseVersionForTests.isAtLeastGradle8, additionalEnvVars = iosTestEnv.envVars ) @@ -91,8 +96,7 @@ class GradlePluginTest : GradlePluginTestBase() { Assumptions.assumeTrue(currentOS == OS.MacOS) val iosTestEnv = iosTestEnv() val testEnv = defaultTestEnvironment.copy( - // for some reason configuration cache + test kit + custom vars does not work - useGradleConfigurationCache = false, + useGradleConfigurationCache = TestProperties.gradleBaseVersionForTests.isAtLeastGradle8, additionalEnvVars = iosTestEnv.envVars ) with(testProject(TestProjects.iosMokoResources, testEnv)) { @@ -345,4 +349,4 @@ class GradlePluginTest : GradlePluginTestBase() { } return constructor.newInstance(socket, logger, {}) as RemoteConnection } -} \ No newline at end of file +} From 3d4db14b5164cea876c8802be7f42c4b403b22d5 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Thu, 5 Oct 2023 04:19:37 +0400 Subject: [PATCH 06/11] COMPOSE-350 Remove old Gradle tasks to launch iOS App (#3753) Issue https://youtrack.jetbrains.com/issue/COMPOSE-350 Also removed kotlinx-serialization library because we don't need to parse json output of `xrun simctl` anymore --- gradle-plugins/build.gradle.kts | 1 - gradle-plugins/compose/build.gradle.kts | 6 +- .../experimental/dsl/ExperimentalExtension.kt | 5 - .../dsl/ExperimentalUiKitApplication.kt | 29 ---- .../dsl/ExperimentalUiKitExtension.kt | 27 --- .../compose/experimental/dsl/IOSDevices.kt | 59 ------- .../dsl/IosDeployConfigurations.kt | 54 ------ .../experimental/dsl/UiKitConfiguration.kt | 10 -- .../internal/configureExperimental.kt | 7 - .../uikit/internal/SimctlListData.kt | 81 --------- .../uikit/internal/SimctlUtils.kt | 25 --- .../configureExperimentalUikitApplication.kt | 24 --- .../internal/configureInstallIosDeployTask.kt | 40 ----- .../internal/configureInstallXcodeGenTask.kt | 40 ----- .../uikit/internal/configureIosDeployTasks.kt | 76 --------- ...PackComposeUiKitApplicationForXCodeTask.kt | 42 ----- .../configureTaskToGenerateXcodeProject.kt | 66 -------- .../internal/registerConnectedDeviceTasks.kt | 104 ------------ .../uikit/internal/registerSimulatorTasks.kt | 160 ------------------ ...entalPackComposeApplicationForXCodeTask.kt | 66 -------- gradle-plugins/gradle/libs.versions.toml | 5 - 21 files changed, 1 insertion(+), 926 deletions(-) delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitApplication.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitExtension.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IOSDevices.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IosDeployConfigurations.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/UiKitConfiguration.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlListData.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlUtils.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureExperimentalUikitApplication.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallIosDeployTask.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallXcodeGenTask.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureIosDeployTasks.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configurePackComposeUiKitApplicationForXCodeTask.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureTaskToGenerateXcodeProject.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerConnectedDeviceTasks.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerSimulatorTasks.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/ExperimentalPackComposeApplicationForXCodeTask.kt diff --git a/gradle-plugins/build.gradle.kts b/gradle-plugins/build.gradle.kts index 54b2ded2454..b04154cc333 100644 --- a/gradle-plugins/build.gradle.kts +++ b/gradle-plugins/build.gradle.kts @@ -3,7 +3,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile plugins { alias(libs.plugins.kotlin.jvm) apply false - alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.publish.plugin.portal) apply false alias(libs.plugins.shadow.jar) apply false alias(libs.plugins.download) apply false diff --git a/gradle-plugins/compose/build.gradle.kts b/gradle-plugins/compose/build.gradle.kts index 7c32c4fef5c..9cdadd0dace 100644 --- a/gradle-plugins/compose/build.gradle.kts +++ b/gradle-plugins/compose/build.gradle.kts @@ -3,7 +3,6 @@ import de.undercouch.gradle.tasks.download.Download plugins { alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.kotlin.serialization) alias(libs.plugins.publish.plugin.portal) id("java-gradle-plugin") id("maven-publish") @@ -64,14 +63,11 @@ dependencies { testImplementation(kotlin("gradle-plugin-api")) embedded(libs.download.task) - embedded(libs.serialization.json) - embedded(libs.serialization.core) - embedded(libs.serialization.core.jvm) embedded(project(":preview-rpc")) embedded(project(":jdk-version-probe")) } -val packagesToRelocate = listOf("de.undercouch", "kotlinx.serialization") +val packagesToRelocate = listOf("de.undercouch") val shadow = tasks.named("shadowJar") { for (packageToRelocate in packagesToRelocate) { diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalExtension.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalExtension.kt index a4b17ec9703..8c4a809c3e2 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalExtension.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalExtension.kt @@ -16,9 +16,4 @@ abstract class ExperimentalExtension @Inject constructor( fun web(action: Action) { action.execute(web) } - - val uikit: ExperimentalUiKitExtension = objects.newInstance(ExperimentalUiKitExtension::class.java) - fun uikit(action: Action) { - action.execute(uikit) - } } \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitApplication.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitApplication.kt deleted file mode 100644 index 5f392d94878..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitApplication.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.dsl - -import org.gradle.api.Action -import org.gradle.api.model.ObjectFactory -import org.jetbrains.compose.internal.requiredDslProperty -import javax.inject.Inject - -@Suppress("unused") -abstract class ExperimentalUiKitApplication @Inject constructor( - val name: String, - val objects: ObjectFactory -) { - var bundleIdPrefix: String by requiredDslProperty("require property [bundleIdPrefix] in uikit.application { ...") - var projectName: String by requiredDslProperty("require property [projectName] in uikit.application { ...") - val configurations: List = listOf( - UiKitConfiguration("Debug"), - UiKitConfiguration("Release"), - ) - - val deployConfigurations: IosDeployConfigurations = objects.newInstance(IosDeployConfigurations::class.java) - fun deployConfigurations(fn: Action) { - fn.execute(deployConfigurations) - } -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitExtension.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitExtension.kt deleted file mode 100644 index a90d57c722c..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/ExperimentalUiKitExtension.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.dsl - -import org.gradle.api.Action -import org.gradle.api.model.ObjectFactory -import javax.inject.Inject - -abstract class ExperimentalUiKitExtension @Inject constructor( - objectFactory: ObjectFactory -) { - internal var _isApplicationInitialized = false - private set - - val application: ExperimentalUiKitApplication by lazy { - _isApplicationInitialized = true - objectFactory.newInstance(ExperimentalUiKitApplication::class.java, "main") - } - - fun application(fn: Action) { - fn.execute(application) - } -} - diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IOSDevices.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IOSDevices.kt deleted file mode 100644 index 15c01b5cb6a..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IOSDevices.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.dsl - -/** - * iOS device type - * xcrun simctl list devices - */ -@Suppress("unused") -public enum class IOSDevices(val id: String) { - IPHONE_6S("com.apple.CoreSimulator.SimDeviceType.iPhone-6s"), - IPHONE_6S_PLUS("com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus"), - IPHONE_SE("com.apple.CoreSimulator.SimDeviceType.iPhone-SE"), - IPHONE_7("com.apple.CoreSimulator.SimDeviceType.iPhone-7"), - IPHONE_7_PLUS("com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus"), - IPHONE_8("com.apple.CoreSimulator.SimDeviceType.iPhone-8"), - IPHONE_8_PLUS("com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus"), - IPHONE_X("com.apple.CoreSimulator.SimDeviceType.iPhone-X"), - IPHONE_XS("com.apple.CoreSimulator.SimDeviceType.iPhone-XS"), - IPHONE_XS_MAX("com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max"), - IPHONE_XR("com.apple.CoreSimulator.SimDeviceType.iPhone-XR"), - IPHONE_11("com.apple.CoreSimulator.SimDeviceType.iPhone-11"), - IPHONE_11_PRO("com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro"), - IPHONE_11_PRO_MAX("com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max"), - IPHONE_SE_2nd_Gen("com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-"), - IPHONE_12_MINI("com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini"), - IPHONE_12("com.apple.CoreSimulator.SimDeviceType.iPhone-12"), - IPHONE_12_PRO("com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro"), - IPHONE_12_PRO_MAX("com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max"), - IPHONE_13_PRO("com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro"), - IPHONE_13_PRO_MAX("com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max"), - IPHONE_13_MINI("com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini"), - IPHONE_13("com.apple.CoreSimulator.SimDeviceType.iPhone-13"), - IPOD_TOUCH_7th_Gen("com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-"), - IPAD_MINI_4("com.apple.CoreSimulator.SimDeviceType.iPad-mini-4"), - IPAD_AIR_2("com.apple.CoreSimulator.SimDeviceType.iPad-Air-2"), - IPAD_PRO_9_7_INCH("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-"), - IPAD_PRO("com.apple.CoreSimulator.SimDeviceType.iPad-Pro"), - IPAD_5th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-"), - IPAD_PRO_12_9_INCH_2nd_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-"), - IPAD_PRO_10_5_INCH("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-"), - IPAD_6th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad--6th-generation-"), - IPAD_7th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-"), - IPAD_PRO_11_INCH("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch-"), - IPAD_PRO_12_9_INCH_3rd_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-"), - IPAD_PRO_11_INCH_2nd_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-"), - IPAD_PRO_12_9_INCH_4th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-"), - IPAD_MINI_5th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-mini--5th-generation-"), - IPAD_AIR_3th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-"), - IPAD_8th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad--8th-generation-"), - IPAD_9th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation"), - IPAD_AIR_4th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-"), - IPAD_PRO_11_INCH_3rd_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation"), - IPAD_12_9_INCH_5th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation"), - IPAD_MINI_6th_Gen("com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation"), -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IosDeployConfigurations.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IosDeployConfigurations.kt deleted file mode 100644 index f6d6eb598ec..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/IosDeployConfigurations.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.dsl - -import org.gradle.api.Action -import org.gradle.api.model.ObjectFactory -import java.io.File -import javax.inject.Inject - -open class IosDeployConfigurations @Inject constructor( - val objects: ObjectFactory -) { - internal val deployTargets: MutableList = mutableListOf() - public fun simulator(id: String, configureSimulator: Action) { - val currentSimulator = objects.newInstance(DeployTarget.Simulator::class.java) - configureSimulator.execute(currentSimulator) - deployTargets.add(DeployTargetWithId(id, currentSimulator)) - } - - public fun localFile(id: String, configureLocalFile: Action) { - val current = objects.newInstance(DeployTarget.LocalFile::class.java) - configureLocalFile.execute(current) - deployTargets.add(DeployTargetWithId(id, current)) - } - - public fun connectedDevice(id: String, configureConnectedDevice: Action) { - val current = objects.newInstance(DeployTarget.ConnectedDevice::class.java) - configureConnectedDevice.execute(current) - deployTargets.add(DeployTargetWithId(id, current)) - } - -} - -sealed interface DeployTarget { - open class Simulator : DeployTarget { - var device: IOSDevices = IOSDevices.IPHONE_8 - } - - open class LocalFile : DeployTarget { - var outputFile: File? = null - } - - open class ConnectedDevice : DeployTarget { - var teamId: String? = null - } -} - -internal class DeployTargetWithId( - val id: String, - val deploy: DeployTarget -) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/UiKitConfiguration.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/UiKitConfiguration.kt deleted file mode 100644 index 23be7642e6f..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/dsl/UiKitConfiguration.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.dsl - -class UiKitConfiguration( - val name: String -) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureExperimental.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureExperimental.kt index ae6b6e55677..f900441e38e 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureExperimental.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/internal/configureExperimental.kt @@ -8,7 +8,6 @@ package org.jetbrains.compose.experimental.internal import org.gradle.api.Project import org.jetbrains.compose.ComposeExtension import org.jetbrains.compose.experimental.dsl.ExperimentalExtension -import org.jetbrains.compose.experimental.uikit.internal.configureExperimentalUikitApplication import org.jetbrains.compose.experimental.web.internal.configureExperimentalWebApplication import org.jetbrains.compose.web.WebExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension @@ -17,12 +16,6 @@ internal fun Project.configureExperimental( composeExt: ComposeExtension, experimentalExt: ExperimentalExtension ) { - if (experimentalExt.uikit._isApplicationInitialized) { - val mppExt = project.extensions.findByType(KotlinMultiplatformExtension::class.java) - ?: error("'org.jetbrains.kotlin.multiplatform' plugin is required for using 'compose.experimental.uikit {}'") - configureExperimentalUikitApplication(mppExt, experimentalExt.uikit.application) - } - if (experimentalExt.web._isApplicationInitialized) { val webExt = composeExt.extensions.getByType(WebExtension::class.java) webExt.targetsToConfigure(project) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlListData.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlListData.kt deleted file mode 100644 index 90d68114352..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlListData.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -@file:Suppress("unused") - -package org.jetbrains.compose.experimental.uikit.internal - -import kotlinx.serialization.Serializable - -@Serializable -internal class SimctlListData( - val devicetypes: List = emptyList(), - val runtimes: List, - val devices: Map>, - val pairs: Map = emptyMap(), -) - -@Serializable -internal class DeviceTypeData( - val name: String? = null, - val minRuntimeVersion: Long? = null, - val bundlePath: String? = null, - val maxRuntimeVersion: Long? = null, - val identifier: String? = null, - val productFamily: String? = null -) - -@Serializable -internal class RuntimeData( - val name: String? = null, - val bundlePath: String? = null, - val buildversion: String? = null, - val runtimeRoot: String? = null, - val identifier: String, - val version: String, - val isAvailable: Boolean? = null, - val supportedDeviceTypes: List -) - -@Serializable -internal class SupportedDeviceTypeData( - val bundlePath: String? = null, - val name: String? = null, - val identifier: String, - val productFamily: String? = null -) - -@Serializable -internal class DeviceData( - val name: String, - val availabilityError: String? = null, - val dataPath: String? = null, - val dataPathSize: Long? = null, - val logPath: String? = null, - val udid: String, - /** - * Simulator may be unavailable after update Xcode version. - * By default, we think what simulator is available. - */ - val isAvailable: Boolean = true, - val deviceTypeIdentifier: String? = null, - val state: String, -) - -internal val DeviceData.booted: Boolean - get() = state == "Booted" - -@Serializable -internal class WatchAndPhonePairData( - val watch: DeviceInPairData? = null, - val phone: DeviceInPairData? = null -) - -@Serializable -internal class DeviceInPairData( - val name: String? = null, - val udid: String? = null, - val state: String? = null, -) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlUtils.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlUtils.kt deleted file mode 100644 index 0aade06f79a..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/SimctlUtils.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import kotlinx.serialization.json.Json -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask - -val json = Json { - ignoreUnknownKeys = true -} - -internal fun AbstractComposeIosTask.getSimctlListData(): SimctlListData { - lateinit var simctlResult: SimctlListData - runExternalTool( - MacUtils.xcrun, listOf("simctl", "list", "--json"), - processStdout = { stdout -> - simctlResult = json.decodeFromString(SimctlListData.serializer(), stdout) - } - ) - return simctlResult -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureExperimentalUikitApplication.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureExperimentalUikitApplication.kt deleted file mode 100644 index 17e090cb41c..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureExperimentalUikitApplication.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.jetbrains.compose.internal.utils.OS -import org.jetbrains.compose.internal.utils.currentOS -import org.jetbrains.compose.experimental.dsl.ExperimentalUiKitApplication -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -internal fun Project.configureExperimentalUikitApplication( - mppExt: KotlinMultiplatformExtension, - application: ExperimentalUiKitApplication -) { - if (currentOS != OS.MacOS) return - - configureIosDeployTasks( - mppExt = mppExt, - application = application, - ) -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallIosDeployTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallIosDeployTask.kt deleted file mode 100644 index f76f31be31f..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallIosDeployTask.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.internal.utils.UnixUtils -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask - -internal val Project.iosDeployExecutable get() = iosDeploySrc.resolve("build/Release/ios-deploy") - -private const val IOS_DEPLOY_GIT = "https://github.com/ios-control/ios-deploy.git" -private const val IOS_DEPLOY_TAG = "1.11.4" -private val Project.iosDeploySrc get() = rootProject.buildDir.resolve("ios-deploy-$IOS_DEPLOY_TAG-src") - -internal fun Project.configureInstallIosDeployTask() = - tasks.composeIosTask("iosInstallIosDeploy") { - onlyIf { !iosDeployExecutable.exists() } - doLast { - iosDeploySrc.deleteRecursively() - runExternalTool( - UnixUtils.git, - listOf( - "clone", - "--depth", "1", - "--branch", IOS_DEPLOY_TAG, - IOS_DEPLOY_GIT, - iosDeploySrc.absolutePath - ) - ) - runExternalTool( - MacUtils.xcodeBuild, - listOf("-target", "ios-deploy"), - workingDir = iosDeploySrc - ) - } - } diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallXcodeGenTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallXcodeGenTask.kt deleted file mode 100644 index 4d9c666bfd2..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureInstallXcodeGenTask.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.internal.utils.UnixUtils -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask - -internal val Project.xcodeGenExecutable get() = xcodeGenSrc.resolve(".build/apple/Products/Release/xcodegen") - -private const val XCODE_GEN_GIT = "https://github.com/yonaskolb/XcodeGen.git" -private const val XCODE_GEN_TAG = "2.26.0" -private val Project.xcodeGenSrc get() = rootProject.buildDir.resolve("xcodegen-$XCODE_GEN_TAG-src") - -fun Project.configureInstallXcodeGenTask() = - tasks.composeIosTask("iosInstallXcodeGen") { - onlyIf { !xcodeGenExecutable.exists() } - doLast { - xcodeGenSrc.deleteRecursively() - runExternalTool( - UnixUtils.git, - listOf( - "clone", - "--depth", "1", - "--branch", XCODE_GEN_TAG, - XCODE_GEN_GIT, - xcodeGenSrc.absolutePath - ) - ) - runExternalTool( - MacUtils.make, - listOf("build"), - workingDir = xcodeGenSrc - ) - } - } diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureIosDeployTasks.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureIosDeployTasks.kt deleted file mode 100644 index 2a2e3f006b4..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureIosDeployTasks.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskContainer -import org.gradle.api.tasks.TaskProvider -import org.jetbrains.compose.experimental.dsl.DeployTarget -import org.jetbrains.compose.experimental.dsl.ExperimentalUiKitApplication -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -const val SDK_PREFIFX_SIMULATOR = "iphonesimulator" -const val SDK_PREFIX_IPHONEOS = "iphoneos" -const val TEAM_ID_PROPERTY_KEY = "compose.ios.teamId" -const val BUILD_DIR_NAME = "build" -const val RELATIVE_PRODUCTS_PATH = "$BUILD_DIR_NAME/Build/Products" - -fun Project.getBuildIosDir(id: String) = buildDir.resolve("ios").resolve(id) - -internal fun Project.configureIosDeployTasks( - mppExt: KotlinMultiplatformExtension, - application: ExperimentalUiKitApplication, -) { - val projectName = application.projectName - val bundleIdPrefix = application.bundleIdPrefix - - val taskInstallXcodeGen: TaskProvider<*> = configureInstallXcodeGenTask() - val taskInstallIosDeploy: TaskProvider<*> = configureInstallIosDeployTask() - - application.deployConfigurations.deployTargets.forEach { target -> - val id = target.id // .replaceFirstChar { it.uppercase() } - when (target.deploy) { - is DeployTarget.Simulator -> { - registerSimulatorTasks( - mppExt = mppExt, - id = id, - deploy = target.deploy, - projectName = projectName, - bundleIdPrefix = bundleIdPrefix, - taskInstallXcodeGen = taskInstallXcodeGen, - configurations = application.configurations, - ) - } - is DeployTarget.LocalFile -> { - TODO("DeployTarget.LocalFile not implemented") - } - is DeployTarget.ConnectedDevice -> { - registerConnectedDeviceTasks( - mppExt = mppExt, - id = id, - deploy = target.deploy, - projectName = projectName, - bundleIdPrefix = bundleIdPrefix, - taskInstallXcodeGen = taskInstallXcodeGen, - taskInstallIosDeploy = taskInstallIosDeploy, - configurations = application.configurations, - ) - } - } - } -} - -inline fun TaskContainer.composeIosTask( - name: String, - args: List = emptyList(), - noinline configureFn: T.() -> Unit = {} -) = register(name, T::class.java, *args.toTypedArray()).apply { - configure { - it.group = "Compose iOS" - it.configureFn() - } -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configurePackComposeUiKitApplicationForXCodeTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configurePackComposeUiKitApplicationForXCodeTask.kt deleted file mode 100644 index ced8d72e000..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configurePackComposeUiKitApplicationForXCodeTask.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.jetbrains.compose.experimental.uikit.tasks.ExperimentalPackComposeApplicationForXCodeTask -import org.jetbrains.compose.internal.utils.fileToDir -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType -import java.io.File - -internal fun Project.configurePackComposeUiKitApplicationForXCodeTask( - mppExt: KotlinMultiplatformExtension, - id: String, - configName: String, - projectName: String, - targetBuildPath: File, - targetType: ExperimentalPackComposeApplicationForXCodeTask.UikitTarget, -) = tasks.register( - "packComposeUikitApplicationForXCode$id$configName", - ExperimentalPackComposeApplicationForXCodeTask::class.java -) { packTask -> - val buildType = project.provider { configName }.map { - if (it.equals("release", ignoreCase = true)) NativeBuildType.RELEASE - else NativeBuildType.DEBUG - }.orElse(NativeBuildType.DEBUG) - val target = mppExt.targets.getByName(targetType.targetName) as KotlinNativeTarget - val kotlinBinary = target.binaries.getExecutable(buildType.get()) - val targetBuildDir = project.provider { targetBuildPath }.fileToDir(project) - val executablePath = "${projectName}.app/${projectName}" - - packTask.targetType.set(targetType) - packTask.buildType.set(buildType) - packTask.dependsOn(kotlinBinary.linkTask) - packTask.kotlinBinary.set(kotlinBinary.outputFile) - packTask.destinationDir.set(targetBuildDir) - packTask.executablePath.set(executablePath) -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureTaskToGenerateXcodeProject.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureTaskToGenerateXcodeProject.kt deleted file mode 100644 index f6cfe929ca6..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/configureTaskToGenerateXcodeProject.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.gradle.api.tasks.TaskProvider -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask - -internal fun Project.configureTaskToGenerateXcodeProject( - id: String, - projectName: String, - bundleIdPrefix: String, - getTeamId: () -> String? = { null }, - taskInstallXcodeGen: TaskProvider<*>, -): TaskProvider = tasks.composeIosTask("iosGenerateXcodeProject$id") { - dependsOn(taskInstallXcodeGen) - doLast { - val commonMainResources = file("src/commonMain/resources").absolutePath - val uikitMainResources = file("src/uikitMain/resources").absolutePath - val iosMainResources = file("src/iosMain/resources").absolutePath - val buildIosDir = getBuildIosDir(id) - buildIosDir.mkdirs() - buildIosDir.resolve("project.yml").writeText( - """ - name: $projectName - options: - bundleIdPrefix: $bundleIdPrefix - settings: - ${if (getTeamId() != null) "DEVELOPMENT_TEAM: \"${getTeamId()}\"" else ""} - CODE_SIGN_IDENTITY: "iPhone Developer" - CODE_SIGN_STYLE: Automatic - MARKETING_VERSION: "1.0" - CURRENT_PROJECT_VERSION: "4" - SDKROOT: iphoneos - targets: - $projectName: - type: application - platform: iOS - deploymentTarget: "12.0" - info: - path: plists/Ios/Info.plist - properties: - UILaunchStoryboardName: $projectName - settings: - LIBRARY_SEARCH_PATHS: "$(inherited)" - ENABLE_BITCODE: "YES" - ONLY_ACTIVE_ARCH: "NO" - VALID_ARCHS: "arm64" - sources: - - path: $commonMainResources - optional: true - buildPhase: resources - - path: $uikitMainResources - optional: true - buildPhase: resources - - path: $iosMainResources - optional: true - buildPhase: resources - """.trimIndent() - ) - runExternalTool(xcodeGenExecutable, emptyList(), workingDir = buildIosDir) - } -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerConnectedDeviceTasks.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerConnectedDeviceTasks.kt deleted file mode 100644 index 1a55d7b6d31..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerConnectedDeviceTasks.kt +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.gradle.api.tasks.TaskProvider -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.experimental.dsl.DeployTarget -import org.jetbrains.compose.experimental.dsl.UiKitConfiguration -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask -import org.jetbrains.compose.experimental.uikit.tasks.ExperimentalPackComposeApplicationForXCodeTask -import org.jetbrains.compose.internal.utils.getLocalProperty -import org.jetbrains.compose.internal.utils.localPropertiesFile -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -fun Project.registerConnectedDeviceTasks( - mppExt: KotlinMultiplatformExtension, - id: String, - deploy: DeployTarget.ConnectedDevice, - projectName: String, - bundleIdPrefix: String, - taskInstallXcodeGen: TaskProvider<*>, - taskInstallIosDeploy: TaskProvider<*>, - configurations: List, -) { - val xcodeProjectDir = getBuildIosDir(id).resolve("$projectName.xcodeproj") - val taskGenerateXcodeProject = configureTaskToGenerateXcodeProject( - id = id, - projectName = projectName, - bundleIdPrefix = bundleIdPrefix, - getTeamId = { - deploy.teamId ?: getLocalProperty(TEAM_ID_PROPERTY_KEY) - ?: error( - buildString { - appendLine("In local.properties (${localPropertiesFile.absolutePath})") - appendLine("Add property") - appendLine("$TEAM_ID_PROPERTY_KEY=***") - appendLine("Or set teamId in deploy with id: $id") - } - ) - }, - taskInstallXcodeGen = taskInstallXcodeGen, - ) - - for (configuration in configurations) { - val configName = configuration.name - val targetBuildPath = xcodeProjectDir.resolve(RELATIVE_PRODUCTS_PATH) - .resolve("$configName-iphoneos") - val iosCompiledAppDir = targetBuildPath.resolve("${projectName}.app") - - val taskPackageUiKitAppForXcode = configurePackComposeUiKitApplicationForXCodeTask( - mppExt = mppExt, - id = id, - configName = configName, - projectName = projectName, - targetBuildPath = targetBuildPath, - targetType = ExperimentalPackComposeApplicationForXCodeTask.UikitTarget.Arm64, - ) - - val taskBuild = tasks.composeIosTask("iosBuildIphoneOs$id$configName") { - dependsOn(taskGenerateXcodeProject) - dependsOn(taskPackageUiKitAppForXcode) - doLast { - // xcrun xcodebuild -showsdks (list all sdk) - val sdk = SDK_PREFIX_IPHONEOS + getSimctlListData().runtimes.first().version - val scheme = projectName // xcrun xcodebuild -list -project . (list all schemes) - - runExternalTool( - MacUtils.xcrun, - listOf( - "xcodebuild", - "-scheme", scheme, - "-project", ".", - "-configuration", configName, - "-derivedDataPath", BUILD_DIR_NAME, - "-arch", "arm64", - "-sdk", sdk, - "-allowProvisioningUpdates", - "-allowProvisioningDeviceRegistration", - ), - workingDir = xcodeProjectDir - ) - } - } - - val taskDeploy = tasks.composeIosTask("iosDeploy$id$configName") { - dependsOn(taskInstallIosDeploy) - dependsOn(taskBuild) - doLast { - runExternalTool( - iosDeployExecutable, - listOf( - "--debug", - "--bundle", iosCompiledAppDir.absolutePath, - ) - ) - } - } - } - -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerSimulatorTasks.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerSimulatorTasks.kt deleted file mode 100644 index 4175d321748..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/internal/registerSimulatorTasks.kt +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.internal - -import org.gradle.api.Project -import org.gradle.api.tasks.TaskProvider -import org.jetbrains.compose.internal.utils.Arch -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.internal.utils.currentArch -import org.jetbrains.compose.experimental.dsl.DeployTarget -import org.jetbrains.compose.experimental.dsl.UiKitConfiguration -import org.jetbrains.compose.experimental.uikit.tasks.AbstractComposeIosTask -import org.jetbrains.compose.experimental.uikit.tasks.ExperimentalPackComposeApplicationForXCodeTask -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension - -fun Project.registerSimulatorTasks( - mppExt: KotlinMultiplatformExtension, - id: String, - deploy: DeployTarget.Simulator, - projectName: String, - bundleIdPrefix: String, - taskInstallXcodeGen: TaskProvider<*>, - configurations: List, -) { - val xcodeProjectDir = getBuildIosDir(id).resolve("$projectName.xcodeproj") - val deviceName = "device-$id" - - val taskGenerateXcodeProject = configureTaskToGenerateXcodeProject( - id = id, - projectName = projectName, - bundleIdPrefix = bundleIdPrefix, - taskInstallXcodeGen = taskInstallXcodeGen, - ) - - val taskSimulatorDeleteUnavailable = tasks.composeIosTask("iosSimulatorDeleteUnavailable$id") { - doLast { - val device = getSimctlListData().devices.map { it.value }.flatten() - .firstOrNull { device: DeviceData -> - device.name == deviceName && !device.isAvailable - } - if (device != null) { - runExternalTool( - MacUtils.xcrun, - listOf("simctl", "delete", device.udid) - ) - } - } - } - - val taskCreateSimulator = tasks.composeIosTask("iosSimulatorCreate$id") { - dependsOn(taskSimulatorDeleteUnavailable) - onlyIf { getSimctlListData().devices.map { it.value }.flatten().none { it.name == deviceName } } - doFirst { - val availableRuntimes = getSimctlListData().runtimes.filter { runtime -> - runtime.supportedDeviceTypes.any { it.identifier == deploy.device.id } - } - val runtime = availableRuntimes.firstOrNull() ?: error("device not found is runtimes") - runExternalTool( - MacUtils.xcrun, - listOf("simctl", "create", deviceName, deploy.device.id, runtime.identifier) - ) - } - } - - val taskBootSimulator = tasks.composeIosTask("iosSimulatorBoot$id") { - dependsOn(taskCreateSimulator) - onlyIf { - getSimctlListData().devices.map { it.value }.flatten().any { it.name == deviceName && it.booted.not() } - } - doLast { - val device = getSimctlListData().devices.map { it.value }.flatten().firstOrNull { it.name == deviceName } - ?: error("device '$deviceName' not found") - - runExternalTool( - MacUtils.xcrun, - listOf("simctl", "boot", device.udid) - ) - runExternalTool( - MacUtils.open, - listOf( - "-a", "Simulator", - "--args", "-CurrentDeviceUDID", device.udid - ) - ) - } - } - - val simulatorArch = when (currentArch) { - Arch.X64 -> "x86_64" - Arch.Arm64 -> "arm64" - } - - for (configuration in configurations) { - val configName = configuration.name - val targetBuildPath = xcodeProjectDir.resolve(RELATIVE_PRODUCTS_PATH) - .resolve("$configName-iphonesimulator") - val iosCompiledAppDir = targetBuildPath.resolve("${projectName}.app") - - val taskPackageUiKitAppForXcode = configurePackComposeUiKitApplicationForXCodeTask( - mppExt = mppExt, - id = id, - configName = configName, - projectName = projectName, - targetBuildPath = targetBuildPath, - targetType = ExperimentalPackComposeApplicationForXCodeTask.UikitTarget.X64, - ) - - val taskBuild = tasks.composeIosTask("iosSimulatorBuild$id$configName") { - dependsOn(taskGenerateXcodeProject) - dependsOn(taskPackageUiKitAppForXcode) - doLast { - // xcrun xcodebuild -showsdks (list all sdk) - val sdk = SDK_PREFIFX_SIMULATOR + getSimctlListData().runtimes.first().version - val scheme = projectName // xcrun xcodebuild -list -project . (list all schemes) - runExternalTool( - MacUtils.xcrun, - listOf( - "xcodebuild", - "-scheme", scheme, - "-project", ".", - "-configuration", configName, - "-derivedDataPath", BUILD_DIR_NAME, - "-arch", simulatorArch, - "-sdk", sdk - ), - workingDir = xcodeProjectDir - ) - } - } - - val installIosSimulator = tasks.composeIosTask("iosSimulatorInstall$id$configName") { - dependsOn(taskBuild, taskBootSimulator) - doLast { - val device = getSimctlListData().devices.map { it.value }.flatten() - .firstOrNull { it.name == deviceName && it.booted } ?: error("device $deviceName not booted") - runExternalTool( - MacUtils.xcrun, - listOf("simctl", "install", device.udid, iosCompiledAppDir.absolutePath) - ) - } - } - - tasks.composeIosTask("iosDeploy$id$configName") { - dependsOn(installIosSimulator) - doFirst { - val device = getSimctlListData().devices.map { it.value }.flatten() - .firstOrNull { it.name == deviceName && it.booted } ?: error("device $deviceName not booted") - val bundleIdentifier = "$bundleIdPrefix.$projectName" - runExternalTool( - MacUtils.xcrun, - listOf("simctl", "launch", "--console", device.udid, bundleIdentifier) - ) - } - } - } - -} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/ExperimentalPackComposeApplicationForXCodeTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/ExperimentalPackComposeApplicationForXCodeTask.kt deleted file mode 100644 index efad8d3307f..00000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/experimental/uikit/tasks/ExperimentalPackComposeApplicationForXCodeTask.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.experimental.uikit.tasks - -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.* -import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType -import java.io.File -import java.nio.file.Files -import java.nio.file.StandardCopyOption - -abstract class ExperimentalPackComposeApplicationForXCodeTask : DefaultTask() { - @get:Input - internal abstract val targetType: Property - - @get:Input - internal abstract val buildType: Property - - @get:InputFile - internal abstract val kotlinBinary: RegularFileProperty - - @get:Input - internal abstract val executablePath: Property - - @get:OutputDirectory - internal abstract val destinationDir: DirectoryProperty - - @TaskAction - fun run() { - val destinationDir = destinationDir.get().asFile - project.delete(destinationDir) - project.mkdir(destinationDir) - - val executableSource = kotlinBinary.get().asFile - val dsymSource = File(executableSource.absolutePath + ".dSYM") - - val executableDestination = destinationDir.resolve(executablePath.get()) - val dsymDestination = File(executableDestination.parentFile.absolutePath + ".dSYM") - - for (sourceFile in dsymSource.walk().filter { it.isFile }) { - val relativePath = sourceFile.relativeTo(dsymSource) - val destFile = dsymDestination.resolve(relativePath) - destFile.parentFile.mkdirs() - if (sourceFile.name == executableSource.name) { - sourceFile.copyTo(destFile.resolveSibling(executableDestination.name), true) - } else { - sourceFile.copyTo(destFile, true) - } - } - - executableDestination.parentFile.mkdirs() - // We need to preserve executable flag for resulting executable, "FileKt.copyTo" extension method does not allow this. - Files.copy(executableSource.toPath(), executableDestination.toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING) - } - - internal enum class UikitTarget(val simulator: Boolean, val targetName: String) { - X64(true, "uikitX64"), - Arm64(false, "uikitArm64") - } -} \ No newline at end of file diff --git a/gradle-plugins/gradle/libs.versions.toml b/gradle-plugins/gradle/libs.versions.toml index 67627f1d814..4281a1056aa 100644 --- a/gradle-plugins/gradle/libs.versions.toml +++ b/gradle-plugins/gradle/libs.versions.toml @@ -1,17 +1,12 @@ [versions] kotlin = "1.9.0" gradle-download-plugin = "5.5.0" -kotlinx-serialization = "1.2.1" [libraries] download-task = { module = "de.undercouch:gradle-download-task", version.ref = "gradle-download-plugin" } -serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } -serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" } -serialization-core-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm", version.ref = "kotlinx-serialization" } [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } shadow-jar = "com.github.johnrengelman.shadow:8.1.1" download = { id = "de.undercouch.download", version.ref = "gradle-download-plugin" } publish-plugin-portal = "com.gradle.plugin-publish:1.2.1" From 834d7082ef32d9c489c10d48ab82d8b94578aa1b Mon Sep 17 00:00:00 2001 From: Nikolai Rykunov Date: Thu, 5 Oct 2023 19:58:04 +0200 Subject: [PATCH 07/11] prepare-changelog-1.5.3 (#3777) --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index acd0bd7ae29..0774c0cc195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# 1.5.3 (October 2023) + +## Desktop + +### Fixes +- [Crash on text hover when accessibility is enabled on Windows](https://github.com/JetBrains/compose-multiplatform/issues/3742) + +## Dependencies + +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: + +- [Compiler 1.5.3](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.5.3) +- [Runtime 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.5.0) +- [UI 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0) +- [Foundation 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.5.0) +- [Material 1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-material#1.5.0) +- [Material3 1.1.1](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.1.1) + # 1.5.10-beta02 (September 2023) ## Common From d7a82a473261ac5397a2a3b39c0586f2b5a41fba Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Mon, 9 Oct 2023 16:30:05 +0400 Subject: [PATCH 08/11] Graphics2D example (#3770) COMPOSE-357 - Merged non UI examples visual-effects, falling-balls and minesweeper into one graphics2d - Removed deprecated function calls `kotlin.system.getTimeNanos()` - Little bit simplifyed code - Used Material3 Co-authored-by: Igor Demin --- examples/README.md | 4 +- examples/falling-balls/README.md | 21 - .../src/androidMain/res/values/strings.xml | 3 - .../desktopApp/src/jvmMain/kotlin/Main.kt | 19 - .../iosApp/Configuration/Config.xcconfig | 3 - examples/falling-balls/jsApp/build.gradle.kts | 24 -- .../jsApp/src/jsMain/kotlin/main.js.kt | 15 - .../jsApp/src/jsMain/resources/index.html | 32 -- examples/falling-balls/settings.gradle.kts | 32 -- .../falling-balls/shared/build.gradle.kts | 125 ------ .../src/androidMain/kotlin/main.android.kt | 12 - .../src/desktopMain/kotlin/main.desktop.kt | 24 -- .../shared/src/iosMain/kotlin/main.ios.kt | 19 - .../shared/src/jsMain/kotlin/main.js.kt | 65 --- .../shared/src/macosMain/kotlin/main.macos.kt | 23 -- .../{falling-balls => graphics-2d}/.gitignore | 0 .../.run/desktopApp.run.xml | 0 examples/graphics-2d/README.md | 24 ++ .../androidApp/build.gradle.kts | 4 +- .../src/androidMain/AndroidManifest.xml | 0 .../org/jetbrains/graphics2d}/MainActivity.kt | 2 +- .../src/androidMain/res/values/strings.xml | 3 + .../apple-id.png | Bin .../build.gradle.kts | 0 .../desktopApp/build.gradle.kts | 4 +- .../desktopApp/src/jvmMain/kotlin/Main.kt | 30 ++ .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../{falling-balls => graphics-2d}/gradlew | 0 .../gradlew.bat | 0 .../ios-app.png | Bin .../iosApp/Configuration/Config.xcconfig | 3 + .../iosApp/iosApp.xcodeproj/project.pbxproj | 6 +- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../iosApp/Assets.xcassets/Contents.json | 0 .../iosApp/iosApp/ContentView.swift | 2 +- .../iosApp/iosApp/Info.plist | 0 .../Preview Assets.xcassets/Contents.json | 0 .../iosApp/iosApp/iOSApp.swift | 0 .../jsApp/build.gradle.kts | 2 +- .../jsApp/src/jsMain/kotlin/main.js.kt | 10 + .../src/jsMain/resources/assets/clock.png | Bin .../src/jsMain/resources/assets/flag.png | Bin .../src/jsMain/resources/assets/mine.png | Bin .../resources/compose-community-primary.xml | 0 .../jsApp/src/jsMain/resources/index.html | 16 + .../jsApp/src/jsMain/resources/styles.css | 0 .../run-configurations.png | Bin .../settings.gradle.kts | 2 +- .../shared/build.gradle.kts | 9 +- .../src/androidMain/AndroidManifest.xml | 0 .../src/androidMain/kotlin/main.android.kt | 6 + .../kotlin/minesweeper/MineSweeper.android.kt | 3 + .../platform/PointerEventKind.android.kt | 2 +- .../src/commonMain/kotlin/Graphics2D.kt | 110 +++++ .../kotlin/bouncingballs}/BouncingBalls.kt | 32 +- .../fallingballs/FallingBalls.common.kt} | 48 +-- .../commonMain/kotlin/fallingballs}/Game.kt | 49 +-- .../commonMain/kotlin/fallingballs}/Piece.kt | 7 +- .../kotlin/minesweeper}/BoardView.kt | 4 +- .../kotlin/minesweeper}/GameController.kt | 20 +- .../kotlin/minesweeper/GameInteraction.kt} | 2 + .../kotlin/minesweeper/MineSweeper.common.kt} | 21 +- .../commonMain/kotlin/minesweeper/Widgets.kt} | 6 +- .../kotlin/visualeffects}/HappyNY.kt | 214 ++++++---- .../visualeffects/PointerEvent.common.kt} | 14 +- .../kotlin/visualeffects}/RotatingWords.kt | 30 +- .../kotlin/visualeffects}/WaveEffect.kt | 59 ++- .../src/commonMain/resources/assets/clock.png | Bin .../src/commonMain/resources/assets/flag.png | Bin .../src/commonMain/resources/assets/mine.png | Bin .../resources/compose-community-primary.xml | 36 ++ .../kotlin/minesweeper}/GameControllerTest.kt | 2 + .../kotlin/minesweeper/MineSweeper.desktop.kt | 3 + .../visualeffects/PointerEvent.desktop.kt} | 4 +- .../shared/src/iosMain/kotlin/main.ios.kt | 6 + .../kotlin/minesweeper/MineSweeper.ios.kt | 3 + .../kotlin/visualeffects/PointerEvent.ios.kt} | 2 +- .../shared/src/jsMain/kotlin/main.js.kt | 6 + .../kotlin/minesweeper/MineSweeepr.js.kt | 3 + .../kotlin/visualeffects/PointerEvent.js.kt | 26 ++ .../shared/src/macosMain/kotlin/main.macos.kt | 11 + .../kotlin/minesweeper/MineSweeper.macos.kt | 3 + .../visualeffects/PointerEventKind.macos.kt | 27 ++ examples/minesweeper/.gitignore | 7 - examples/minesweeper/.run/desktopApp.run.xml | 28 -- examples/minesweeper/README.md | 25 -- .../minesweeper/androidApp/build.gradle.kts | 35 -- .../src/androidMain/AndroidManifest.xml | 21 - .../src/androidMain/kotlin/MainActivity.kt | 15 - .../src/androidMain/res/values/strings.xml | 3 - examples/minesweeper/build.gradle.kts | 18 - .../minesweeper/desktopApp/build.gradle.kts | 35 -- .../desktopApp/src/jvmMain/kotlin/Main.kt | 22 - examples/minesweeper/gradle.properties | 19 - .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - examples/minesweeper/gradlew | 240 ----------- examples/minesweeper/gradlew.bat | 91 ----- .../iosApp/Configuration/Config.xcconfig | 3 - .../iosApp/iosApp.xcodeproj/project.pbxproj | 382 ------------------ .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 98 ----- .../iosApp/Assets.xcassets/Contents.json | 6 - .../iosApp/iosApp/ContentView.swift | 21 - examples/minesweeper/iosApp/iosApp/Info.plist | 48 --- .../Preview Assets.xcassets/Contents.json | 6 - .../minesweeper/iosApp/iosApp/iOSApp.swift | 10 - .../jsApp/src/jsMain/kotlin/main.js.kt | 16 - .../jsApp/src/jsMain/resources/index.html | 16 - examples/minesweeper/run-configurations.png | Bin 17480 -> 0 bytes .../src/androidMain/AndroidManifest.xml | 2 - .../src/androidMain/kotlin/main.android.kt | 5 - .../src/desktopMain/kotlin/main.desktop.kt | 15 - .../shared/src/iosMain/kotlin/main.ios.kt | 11 - .../shared/src/jsMain/kotlin/main.js.kt | 6 - .../shared/src/macosMain/kotlin/main.macos.kt | 32 -- examples/validateExamplesIos.sh | 4 +- examples/visual-effects/.gitignore | 21 - .../visual-effects/.run/desktopApp.run.xml | 23 -- examples/visual-effects/README.md | 20 - .../androidApp/build.gradle.kts | 35 -- .../src/androidMain/AndroidManifest.xml | 20 - .../src/androidMain/kotlin/MainActivity.kt | 15 - .../src/androidMain/res/values/strings.xml | 3 - examples/visual-effects/build.gradle.kts | 19 - .../desktopApp/build.gradle.kts | 55 --- .../desktopApp/src/jvmMain/kotlin/main.kt | 12 - examples/visual-effects/gradle.properties | 14 - .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - examples/visual-effects/gradlew | 240 ----------- examples/visual-effects/gradlew.bat | 91 ----- .../iosApp/Configuration/Config.xcconfig | 3 - .../iosApp/iosApp.xcodeproj/project.pbxproj | 382 ------------------ .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 98 ----- .../iosApp/Assets.xcassets/Contents.json | 6 - .../iosApp/iosApp/ContentView.swift | 21 - .../visual-effects/iosApp/iosApp/Info.plist | 48 --- .../Preview Assets.xcassets/Contents.json | 6 - .../visual-effects/iosApp/iosApp/iOSApp.swift | 10 - .../visual-effects/run-configurations.png | Bin 17480 -> 0 bytes examples/visual-effects/settings.gradle.kts | 31 -- .../visual-effects/shared/build.gradle.kts | 80 ---- .../src/androidMain/AndroidManifest.xml | 2 - .../src/androidMain/kotlin/main.android.kt | 5 - .../androidMain/kotlin/platform/NanoTime.kt | 3 - .../src/commonMain/kotlin/AllSamlesView.kt | 90 ----- .../commonMain/kotlin/platform/NanoTime.kt | 3 - .../resources/compose-community-primary.png | Bin 17662 -> 0 bytes .../resources/compose-community-primary.svg | 19 - .../src/desktopMain/kotlin/WaveSettings.kt | 52 --- .../src/desktopMain/kotlin/main.desktop.kt | 59 --- .../desktopMain/kotlin/platform/NanoTime.kt | 3 - .../shared/src/iosMain/kotlin/main.ios.kt | 10 - .../src/iosMain/kotlin/platform/NanoTime.kt | 3 - 159 files changed, 642 insertions(+), 3429 deletions(-) delete mode 100644 examples/falling-balls/README.md delete mode 100644 examples/falling-balls/androidApp/src/androidMain/res/values/strings.xml delete mode 100644 examples/falling-balls/desktopApp/src/jvmMain/kotlin/Main.kt delete mode 100644 examples/falling-balls/iosApp/Configuration/Config.xcconfig delete mode 100644 examples/falling-balls/jsApp/build.gradle.kts delete mode 100644 examples/falling-balls/jsApp/src/jsMain/kotlin/main.js.kt delete mode 100644 examples/falling-balls/jsApp/src/jsMain/resources/index.html delete mode 100644 examples/falling-balls/settings.gradle.kts delete mode 100644 examples/falling-balls/shared/build.gradle.kts delete mode 100644 examples/falling-balls/shared/src/androidMain/kotlin/main.android.kt delete mode 100644 examples/falling-balls/shared/src/desktopMain/kotlin/main.desktop.kt delete mode 100644 examples/falling-balls/shared/src/iosMain/kotlin/main.ios.kt delete mode 100644 examples/falling-balls/shared/src/jsMain/kotlin/main.js.kt delete mode 100644 examples/falling-balls/shared/src/macosMain/kotlin/main.macos.kt rename examples/{falling-balls => graphics-2d}/.gitignore (100%) rename examples/{falling-balls => graphics-2d}/.run/desktopApp.run.xml (100%) create mode 100644 examples/graphics-2d/README.md rename examples/{falling-balls => graphics-2d}/androidApp/build.gradle.kts (86%) rename examples/{falling-balls => graphics-2d}/androidApp/src/androidMain/AndroidManifest.xml (100%) rename examples/{falling-balls/androidApp/src/androidMain/kotlin/org/jetbrains/fallingballs => graphics-2d/androidApp/src/androidMain/kotlin/org/jetbrains/graphics2d}/MainActivity.kt (90%) create mode 100644 examples/graphics-2d/androidApp/src/androidMain/res/values/strings.xml rename examples/{falling-balls => graphics-2d}/apple-id.png (100%) rename examples/{falling-balls => graphics-2d}/build.gradle.kts (100%) rename examples/{falling-balls => graphics-2d}/desktopApp/build.gradle.kts (91%) create mode 100644 examples/graphics-2d/desktopApp/src/jvmMain/kotlin/Main.kt rename examples/{falling-balls => graphics-2d}/gradle.properties (100%) rename examples/{falling-balls => graphics-2d}/gradle/wrapper/gradle-wrapper.jar (100%) rename examples/{falling-balls => graphics-2d}/gradle/wrapper/gradle-wrapper.properties (100%) rename examples/{falling-balls => graphics-2d}/gradlew (100%) rename examples/{falling-balls => graphics-2d}/gradlew.bat (100%) rename examples/{falling-balls => graphics-2d}/ios-app.png (100%) create mode 100644 examples/graphics-2d/iosApp/Configuration/Config.xcconfig rename examples/{falling-balls => graphics-2d}/iosApp/iosApp.xcodeproj/project.pbxproj (97%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/Assets.xcassets/Contents.json (100%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/ContentView.swift (83%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/Info.plist (100%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json (100%) rename examples/{falling-balls => graphics-2d}/iosApp/iosApp/iOSApp.swift (100%) rename examples/{minesweeper => graphics-2d}/jsApp/build.gradle.kts (91%) create mode 100644 examples/graphics-2d/jsApp/src/jsMain/kotlin/main.js.kt rename examples/{minesweeper => graphics-2d}/jsApp/src/jsMain/resources/assets/clock.png (100%) rename examples/{minesweeper => graphics-2d}/jsApp/src/jsMain/resources/assets/flag.png (100%) rename examples/{minesweeper => graphics-2d}/jsApp/src/jsMain/resources/assets/mine.png (100%) rename examples/{visual-effects/shared/src/commonMain => graphics-2d/jsApp/src/jsMain}/resources/compose-community-primary.xml (100%) create mode 100644 examples/graphics-2d/jsApp/src/jsMain/resources/index.html rename examples/{falling-balls => graphics-2d}/jsApp/src/jsMain/resources/styles.css (100%) rename examples/{falling-balls => graphics-2d}/run-configurations.png (100%) rename examples/{minesweeper => graphics-2d}/settings.gradle.kts (96%) rename examples/{minesweeper => graphics-2d}/shared/build.gradle.kts (94%) rename examples/{falling-balls => graphics-2d}/shared/src/androidMain/AndroidManifest.xml (100%) create mode 100644 examples/graphics-2d/shared/src/androidMain/kotlin/main.android.kt create mode 100644 examples/graphics-2d/shared/src/androidMain/kotlin/minesweeper/MineSweeper.android.kt rename examples/{visual-effects => graphics-2d}/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt (79%) create mode 100644 examples/graphics-2d/shared/src/commonMain/kotlin/Graphics2D.kt rename examples/{falling-balls/shared/src/commonMain/kotlin/bouncingBalls => graphics-2d/shared/src/commonMain/kotlin/bouncingballs}/BouncingBalls.kt (86%) rename examples/{falling-balls/shared/src/commonMain/kotlin/fallingBalls/FallingBalls.kt => graphics-2d/shared/src/commonMain/kotlin/fallingballs/FallingBalls.common.kt} (68%) rename examples/{falling-balls/shared/src/commonMain/kotlin/fallingBalls => graphics-2d/shared/src/commonMain/kotlin/fallingballs}/Game.kt (50%) rename examples/{falling-balls/shared/src/commonMain/kotlin/fallingBalls => graphics-2d/shared/src/commonMain/kotlin/fallingballs}/Piece.kt (89%) rename examples/{minesweeper/shared/src/commonMain/kotlin => graphics-2d/shared/src/commonMain/kotlin/minesweeper}/BoardView.kt (95%) rename examples/{minesweeper/shared/src/commonMain/kotlin => graphics-2d/shared/src/commonMain/kotlin/minesweeper}/GameController.kt (97%) rename examples/{minesweeper/shared/src/commonMain/kotlin/gameInteraction.kt => graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameInteraction.kt} (98%) rename examples/{minesweeper/shared/src/commonMain/kotlin/game.kt => graphics-2d/shared/src/commonMain/kotlin/minesweeper/MineSweeper.common.kt} (89%) rename examples/{minesweeper/shared/src/commonMain/kotlin/widgets.kt => graphics-2d/shared/src/commonMain/kotlin/minesweeper/Widgets.kt} (97%) rename examples/{visual-effects/shared/src/commonMain/kotlin => graphics-2d/shared/src/commonMain/kotlin/visualeffects}/HappyNY.kt (65%) rename examples/{visual-effects/shared/src/commonMain/kotlin/platform/PointerEventKind.kt => graphics-2d/shared/src/commonMain/kotlin/visualeffects/PointerEvent.common.kt} (77%) rename examples/{visual-effects/shared/src/commonMain/kotlin => graphics-2d/shared/src/commonMain/kotlin/visualeffects}/RotatingWords.kt (88%) rename examples/{visual-effects/shared/src/commonMain/kotlin => graphics-2d/shared/src/commonMain/kotlin/visualeffects}/WaveEffect.kt (83%) rename examples/{minesweeper => graphics-2d}/shared/src/commonMain/resources/assets/clock.png (100%) rename examples/{minesweeper => graphics-2d}/shared/src/commonMain/resources/assets/flag.png (100%) rename examples/{minesweeper => graphics-2d}/shared/src/commonMain/resources/assets/mine.png (100%) create mode 100644 examples/graphics-2d/shared/src/commonMain/resources/compose-community-primary.xml rename examples/{minesweeper/shared/src/commonTest/kotlin => graphics-2d/shared/src/commonTest/kotlin/minesweeper}/GameControllerTest.kt (99%) create mode 100644 examples/graphics-2d/shared/src/desktopMain/kotlin/minesweeper/MineSweeper.desktop.kt rename examples/{visual-effects/shared/src/desktopMain/kotlin/platform/PointerEventKind.desktop.kt => graphics-2d/shared/src/desktopMain/kotlin/visualeffects/PointerEvent.desktop.kt} (93%) create mode 100644 examples/graphics-2d/shared/src/iosMain/kotlin/main.ios.kt create mode 100644 examples/graphics-2d/shared/src/iosMain/kotlin/minesweeper/MineSweeper.ios.kt rename examples/{visual-effects/shared/src/iosMain/kotlin/platform/PointerEventKind.ios.kt => graphics-2d/shared/src/iosMain/kotlin/visualeffects/PointerEvent.ios.kt} (79%) create mode 100644 examples/graphics-2d/shared/src/jsMain/kotlin/main.js.kt create mode 100644 examples/graphics-2d/shared/src/jsMain/kotlin/minesweeper/MineSweeepr.js.kt create mode 100644 examples/graphics-2d/shared/src/jsMain/kotlin/visualeffects/PointerEvent.js.kt create mode 100644 examples/graphics-2d/shared/src/macosMain/kotlin/main.macos.kt create mode 100644 examples/graphics-2d/shared/src/macosMain/kotlin/minesweeper/MineSweeper.macos.kt create mode 100644 examples/graphics-2d/shared/src/macosMain/kotlin/visualeffects/PointerEventKind.macos.kt delete mode 100644 examples/minesweeper/.gitignore delete mode 100644 examples/minesweeper/.run/desktopApp.run.xml delete mode 100644 examples/minesweeper/README.md delete mode 100644 examples/minesweeper/androidApp/build.gradle.kts delete mode 100644 examples/minesweeper/androidApp/src/androidMain/AndroidManifest.xml delete mode 100644 examples/minesweeper/androidApp/src/androidMain/kotlin/MainActivity.kt delete mode 100644 examples/minesweeper/androidApp/src/androidMain/res/values/strings.xml delete mode 100644 examples/minesweeper/build.gradle.kts delete mode 100644 examples/minesweeper/desktopApp/build.gradle.kts delete mode 100644 examples/minesweeper/desktopApp/src/jvmMain/kotlin/Main.kt delete mode 100644 examples/minesweeper/gradle.properties delete mode 100644 examples/minesweeper/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/minesweeper/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/minesweeper/gradlew delete mode 100644 examples/minesweeper/gradlew.bat delete mode 100644 examples/minesweeper/iosApp/Configuration/Config.xcconfig delete mode 100644 examples/minesweeper/iosApp/iosApp.xcodeproj/project.pbxproj delete mode 100644 examples/minesweeper/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 examples/minesweeper/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/minesweeper/iosApp/iosApp/Assets.xcassets/Contents.json delete mode 100644 examples/minesweeper/iosApp/iosApp/ContentView.swift delete mode 100644 examples/minesweeper/iosApp/iosApp/Info.plist delete mode 100644 examples/minesweeper/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 examples/minesweeper/iosApp/iosApp/iOSApp.swift delete mode 100644 examples/minesweeper/jsApp/src/jsMain/kotlin/main.js.kt delete mode 100644 examples/minesweeper/jsApp/src/jsMain/resources/index.html delete mode 100644 examples/minesweeper/run-configurations.png delete mode 100644 examples/minesweeper/shared/src/androidMain/AndroidManifest.xml delete mode 100644 examples/minesweeper/shared/src/androidMain/kotlin/main.android.kt delete mode 100644 examples/minesweeper/shared/src/desktopMain/kotlin/main.desktop.kt delete mode 100644 examples/minesweeper/shared/src/iosMain/kotlin/main.ios.kt delete mode 100644 examples/minesweeper/shared/src/jsMain/kotlin/main.js.kt delete mode 100644 examples/minesweeper/shared/src/macosMain/kotlin/main.macos.kt delete mode 100644 examples/visual-effects/.gitignore delete mode 100644 examples/visual-effects/.run/desktopApp.run.xml delete mode 100644 examples/visual-effects/README.md delete mode 100644 examples/visual-effects/androidApp/build.gradle.kts delete mode 100644 examples/visual-effects/androidApp/src/androidMain/AndroidManifest.xml delete mode 100644 examples/visual-effects/androidApp/src/androidMain/kotlin/MainActivity.kt delete mode 100644 examples/visual-effects/androidApp/src/androidMain/res/values/strings.xml delete mode 100644 examples/visual-effects/build.gradle.kts delete mode 100644 examples/visual-effects/desktopApp/build.gradle.kts delete mode 100644 examples/visual-effects/desktopApp/src/jvmMain/kotlin/main.kt delete mode 100644 examples/visual-effects/gradle.properties delete mode 100644 examples/visual-effects/gradle/wrapper/gradle-wrapper.jar delete mode 100644 examples/visual-effects/gradle/wrapper/gradle-wrapper.properties delete mode 100755 examples/visual-effects/gradlew delete mode 100644 examples/visual-effects/gradlew.bat delete mode 100644 examples/visual-effects/iosApp/Configuration/Config.xcconfig delete mode 100644 examples/visual-effects/iosApp/iosApp.xcodeproj/project.pbxproj delete mode 100644 examples/visual-effects/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 examples/visual-effects/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/visual-effects/iosApp/iosApp/Assets.xcassets/Contents.json delete mode 100644 examples/visual-effects/iosApp/iosApp/ContentView.swift delete mode 100644 examples/visual-effects/iosApp/iosApp/Info.plist delete mode 100644 examples/visual-effects/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 examples/visual-effects/iosApp/iosApp/iOSApp.swift delete mode 100644 examples/visual-effects/run-configurations.png delete mode 100644 examples/visual-effects/settings.gradle.kts delete mode 100644 examples/visual-effects/shared/build.gradle.kts delete mode 100644 examples/visual-effects/shared/src/androidMain/AndroidManifest.xml delete mode 100644 examples/visual-effects/shared/src/androidMain/kotlin/main.android.kt delete mode 100644 examples/visual-effects/shared/src/androidMain/kotlin/platform/NanoTime.kt delete mode 100644 examples/visual-effects/shared/src/commonMain/kotlin/AllSamlesView.kt delete mode 100644 examples/visual-effects/shared/src/commonMain/kotlin/platform/NanoTime.kt delete mode 100644 examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.png delete mode 100644 examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.svg delete mode 100644 examples/visual-effects/shared/src/desktopMain/kotlin/WaveSettings.kt delete mode 100644 examples/visual-effects/shared/src/desktopMain/kotlin/main.desktop.kt delete mode 100644 examples/visual-effects/shared/src/desktopMain/kotlin/platform/NanoTime.kt delete mode 100644 examples/visual-effects/shared/src/iosMain/kotlin/main.ios.kt delete mode 100644 examples/visual-effects/shared/src/iosMain/kotlin/platform/NanoTime.kt diff --git a/examples/README.md b/examples/README.md index 0319f064b7c..3d9d382898a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -4,9 +4,7 @@ | [Imageviewer](imageviewer) | Image Viewer application | Android, iOS, Desktop | | [Codeviewer](codeviewer) | File browser and code viewer application | Android, iOS, Desktop | | [Chat](chat) | A simple chat | Android, iOS, Desktop | -| [Minesweeper](minesweeper) | A simple game where you need to find hidden mines | Android, iOS, Desktop | -| [Falling Balls](falling-balls) | A simple game | Android, iOS, Desktop | -| [Visual effects](visual-effects) | Visual effects | Android, iOS, Desktop | +| [Graphics2D](graphics-2d) | 2D Games and graphics examples | Android, iOS, Desktop | | [Widgets Gallery](widgets-gallery) | Gallery of standard widgets | Android, iOS, Desktop | | [Todoapp Lite](todoapp-lite) | A simple todo app fully based on Compose | Android, iOS, Desktop | | [Issues tracker](issues) | GitHub issue tracker with an adaptive UI and ktor-client | Android, Desktop | diff --git a/examples/falling-balls/README.md b/examples/falling-balls/README.md deleted file mode 100644 index 14804331d07..00000000000 --- a/examples/falling-balls/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Falling Balls game - -Game can run on Android, iOS, desktop or in a browser. - -## Setting up your development environment - -To setup the environment, please consult these [instructions](https://github.com/JetBrains/compose-multiplatform-template#setting-up-your-development-environment). - -## How to run - -Choose a run configuration for an appropriate target in Android Studio and run it. - -![run-configurations.png](run-configurations.png) - -## Run on desktop via Gradle - -`./gradlew desktopApp:run` - -## Run native on MacOS -Choose **shared[macosX64]** or **shared[macosArm64]** configuration in IDE and run it. - diff --git a/examples/falling-balls/androidApp/src/androidMain/res/values/strings.xml b/examples/falling-balls/androidApp/src/androidMain/res/values/strings.xml deleted file mode 100644 index 8475d8902cf..00000000000 --- a/examples/falling-balls/androidApp/src/androidMain/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Falling Balls - \ No newline at end of file diff --git a/examples/falling-balls/desktopApp/src/jvmMain/kotlin/Main.kt b/examples/falling-balls/desktopApp/src/jvmMain/kotlin/Main.kt deleted file mode 100644 index 0b1c80d0064..00000000000 --- a/examples/falling-balls/desktopApp/src/jvmMain/kotlin/Main.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.unit.DpSize -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.WindowState -import androidx.compose.ui.window.singleWindowApplication - -@OptIn(ExperimentalComposeUiApi::class) -fun main() = - singleWindowApplication( - title = "Falling Balls", - state = WindowState(size = DpSize(800.dp, 800.dp)) - ) { - MainView() - } diff --git a/examples/falling-balls/iosApp/Configuration/Config.xcconfig b/examples/falling-balls/iosApp/Configuration/Config.xcconfig deleted file mode 100644 index e6ec51dad28..00000000000 --- a/examples/falling-balls/iosApp/Configuration/Config.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -TEAM_ID= -BUNDLE_ID=org.jetbrains.FallingBalls -APP_NAME=FallingBalls diff --git a/examples/falling-balls/jsApp/build.gradle.kts b/examples/falling-balls/jsApp/build.gradle.kts deleted file mode 100644 index 144006fa941..00000000000 --- a/examples/falling-balls/jsApp/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") -} - -kotlin { - js(IR) { - browser() - binaries.executable() - } - sourceSets { - val jsMain by getting { - dependencies { - implementation(project(":shared")) - implementation(compose.ui) - } - } - } -} - -compose.experimental { - web.application {} -} - diff --git a/examples/falling-balls/jsApp/src/jsMain/kotlin/main.js.kt b/examples/falling-balls/jsApp/src/jsMain/kotlin/main.js.kt deleted file mode 100644 index d646ee78b8e..00000000000 --- a/examples/falling-balls/jsApp/src/jsMain/kotlin/main.js.kt +++ /dev/null @@ -1,15 +0,0 @@ - /* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.Window -import org.jetbrains.skiko.wasm.onWasmReady - -fun main() { - onWasmReady { - Window("Falling Balls") { - MainView() - } - } -} diff --git a/examples/falling-balls/jsApp/src/jsMain/resources/index.html b/examples/falling-balls/jsApp/src/jsMain/resources/index.html deleted file mode 100644 index e68a4bccdb8..00000000000 --- a/examples/falling-balls/jsApp/src/jsMain/resources/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - compose multiplatform web demo - - - - -

compose multiplatform web demo

-
- -
- - - diff --git a/examples/falling-balls/settings.gradle.kts b/examples/falling-balls/settings.gradle.kts deleted file mode 100644 index 9f32e9dd8a6..00000000000 --- a/examples/falling-balls/settings.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - google() - } - - plugins { - val kotlinVersion = extra["kotlin.version"] as String - val agpVersion = extra["agp.version"] as String - val composeVersion = extra["compose.version"] as String - - kotlin("jvm").version(kotlinVersion) - kotlin("multiplatform").version(kotlinVersion) - kotlin("android").version(kotlinVersion) - id("com.android.base").version(agpVersion) - id("com.android.application").version(agpVersion) - id("com.android.library").version(agpVersion) - id("org.jetbrains.compose").version(composeVersion) - } -} - -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0") -} - -rootProject.name = "falling-balls-mpp" - -include(":androidApp") -include(":shared") -include(":desktopApp") -include(":jsApp") diff --git a/examples/falling-balls/shared/build.gradle.kts b/examples/falling-balls/shared/build.gradle.kts deleted file mode 100644 index b88d1299aa7..00000000000 --- a/examples/falling-balls/shared/build.gradle.kts +++ /dev/null @@ -1,125 +0,0 @@ -@file:Suppress("OPT_IN_IS_NOT_ENABLED") - -import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler - - -plugins { - kotlin("multiplatform") - id("com.android.library") - id("org.jetbrains.compose") -} - -version = "1.0-SNAPSHOT" - -kotlin { - androidTarget() - - jvm("desktop") - - js(IR) { - browser() - } - - macosX64 { - binaries { - executable { - entryPoint = "main" - } - } - } - macosArm64 { - binaries { - executable { - entryPoint = "main" - } - } - } - - listOf( - iosX64(), - iosArm64(), - iosSimulatorArm64() - ).forEach { iosTarget -> - iosTarget.binaries.framework { - baseName = "shared" - isStatic = true - } - } - - val enableKjsWorkaround = project.properties["workaround.kotlin.js.kt60852"] == "true" - - fun KotlinDependencyHandler.addCommonDependencies() { - implementation(compose.ui) - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material) - @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) - implementation(compose.components.resources) - } - - sourceSets { - val commonMain by getting { - dependencies { - if (!enableKjsWorkaround) { - addCommonDependencies() - } - } - } - val androidMain by getting { - dependencies { - api("androidx.activity:activity-compose:1.7.2") - api("androidx.appcompat:appcompat:1.6.1") - api("androidx.core:core-ktx:1.10.1") - } - } - val iosMain by creating { - dependsOn(commonMain) - } - val iosX64Main by getting { - dependsOn(iosMain) - } - val iosArm64Main by getting { - dependsOn(iosMain) - } - val iosSimulatorArm64Main by getting { - dependsOn(iosMain) - } - val desktopMain by getting { - dependencies { - implementation(compose.desktop.common) - } - } - val macosMain by creating { - dependsOn(commonMain) - } - val macosArm64Main by getting { - dependsOn(macosMain) - } - val jsMain by getting { - dependencies { - if (enableKjsWorkaround) { - addCommonDependencies() - } - } - } - } -} - -android { - compileSdk = 34 - namespace = "org.jetbrains.fallingballs" - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - sourceSets["main"].resources.srcDirs("src/commonMain/resources") - - defaultConfig { - minSdk = 26 - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - jvmToolchain(17) - } -} diff --git a/examples/falling-balls/shared/src/androidMain/kotlin/main.android.kt b/examples/falling-balls/shared/src/androidMain/kotlin/main.android.kt deleted file mode 100644 index d638f6ee249..00000000000 --- a/examples/falling-balls/shared/src/androidMain/kotlin/main.android.kt +++ /dev/null @@ -1,12 +0,0 @@ -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember - -object AndroidTime : Time { - override fun now(): Long = System.nanoTime() -} - -@Composable -fun MainView() { - val game = remember { Game(AndroidTime) } - FallingBalls(game) -} \ No newline at end of file diff --git a/examples/falling-balls/shared/src/desktopMain/kotlin/main.desktop.kt b/examples/falling-balls/shared/src/desktopMain/kotlin/main.desktop.kt deleted file mode 100644 index 1c4b55ab066..00000000000 --- a/examples/falling-balls/shared/src/desktopMain/kotlin/main.desktop.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.desktop.ui.tooling.preview.Preview -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember - -object JvmTime : Time { - override fun now(): Long = System.nanoTime() -} - -@Composable -fun MainView() { - val game = remember { Game(JvmTime) } - FallingBalls(game) -} - -@Preview -@Composable -fun GamePreview() { - MainView() -} \ No newline at end of file diff --git a/examples/falling-balls/shared/src/iosMain/kotlin/main.ios.kt b/examples/falling-balls/shared/src/iosMain/kotlin/main.ios.kt deleted file mode 100644 index 618bdd6d1d9..00000000000 --- a/examples/falling-balls/shared/src/iosMain/kotlin/main.ios.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - - -import androidx.compose.runtime.remember -import androidx.compose.ui.window.ComposeUIViewController -import platform.UIKit.UIViewController - -object IosTime : Time { - override fun now(): Long = kotlin.system.getTimeNanos() -} - -fun MainViewController() : UIViewController = ComposeUIViewController { - val game = remember { Game(IosTime) } - FallingBalls(game) -} - diff --git a/examples/falling-balls/shared/src/jsMain/kotlin/main.js.kt b/examples/falling-balls/shared/src/jsMain/kotlin/main.js.kt deleted file mode 100644 index 7e0e22e86a8..00000000000 --- a/examples/falling-balls/shared/src/jsMain/kotlin/main.js.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.foundation.layout.* -import androidx.compose.material.RadioButton -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import bouncingBalls.BouncingBallsApp - -object JsTime : Time { - override fun now(): Long = kotlinx.browser.window.performance.now().toLong() -} - -@Composable -fun MainView() { - val selectedExample = remember { mutableStateOf(Examples.FallingBalls) } - - Column(modifier = Modifier.fillMaxSize()) { - ExamplesChooser(selectedExample) - Spacer(modifier = Modifier.height(24.dp)) - - when (selectedExample.value) { - Examples.FallingBalls -> { - val game = remember { Game(JsTime) } - FallingBalls(game) - } - Examples.BouncingBalls -> { - BouncingBallsApp(10) - } - } - } -} - -@Composable -private fun ExamplesChooser(selected: MutableState) { - Column { - Row(verticalAlignment = Alignment.CenterVertically) { - Text("Choose an example: ", fontSize = 16.sp) - - Examples.values().forEach { - Row(verticalAlignment = Alignment.CenterVertically) { - RadioButton(selected = selected.value == it, onClick = { - selected.value = it - }) - Text(it.name) - } - } - } - } -} - -private enum class Examples { - FallingBalls, - BouncingBalls -} - diff --git a/examples/falling-balls/shared/src/macosMain/kotlin/main.macos.kt b/examples/falling-balls/shared/src/macosMain/kotlin/main.macos.kt deleted file mode 100644 index be803b013d6..00000000000 --- a/examples/falling-balls/shared/src/macosMain/kotlin/main.macos.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.Window -import androidx.compose.runtime.remember -import androidx.compose.ui.unit.dp -import platform.AppKit.NSApp -import platform.AppKit.NSApplication - -object MacosTime : Time { - override fun now(): Long = kotlin.system.getTimeNanos() -} - -fun main() { - NSApplication.sharedApplication() - Window("Falling Balls") { - val game = remember { Game(MacosTime) } - FallingBalls(game) - } - NSApp?.run() -} diff --git a/examples/falling-balls/.gitignore b/examples/graphics-2d/.gitignore similarity index 100% rename from examples/falling-balls/.gitignore rename to examples/graphics-2d/.gitignore diff --git a/examples/falling-balls/.run/desktopApp.run.xml b/examples/graphics-2d/.run/desktopApp.run.xml similarity index 100% rename from examples/falling-balls/.run/desktopApp.run.xml rename to examples/graphics-2d/.run/desktopApp.run.xml diff --git a/examples/graphics-2d/README.md b/examples/graphics-2d/README.md new file mode 100644 index 00000000000..0cf145bd7b9 --- /dev/null +++ b/examples/graphics-2d/README.md @@ -0,0 +1,24 @@ +# Graphics2D + +Example can run on Android, iOS, desktop or in a browser. + +## Setting up your development environment + +To setup the environment, please consult +these [instructions](https://github.com/JetBrains/compose-multiplatform-template#setting-up-your-development-environment). + +## How to run + +Choose a run configuration for an appropriate target in Android Studio and run it. + +![run-configurations.png](run-configurations.png) + +## Run on desktop via Gradle + +`./gradlew desktopApp:run` + +## Run experimental native on MacOS + +`./gradlew runDebugExecutableMacosX64` (Works on Intel processors) +`./gradlew runDebugExecutableMacosArm64` (Works on Arm processors) + diff --git a/examples/falling-balls/androidApp/build.gradle.kts b/examples/graphics-2d/androidApp/build.gradle.kts similarity index 86% rename from examples/falling-balls/androidApp/build.gradle.kts rename to examples/graphics-2d/androidApp/build.gradle.kts index 0d7ab8e11fe..e09546327c0 100644 --- a/examples/falling-balls/androidApp/build.gradle.kts +++ b/examples/graphics-2d/androidApp/build.gradle.kts @@ -17,9 +17,9 @@ kotlin { android { compileSdk = 34 - namespace = "org.jetbrains.fallingballs" + namespace = "org.jetbrains.graphics2d" defaultConfig { - applicationId = "org.jetbrains.FallingBalls" + applicationId = "org.jetbrains.Graphics2D" minSdk = 26 targetSdk = 34 versionCode = 1 diff --git a/examples/falling-balls/androidApp/src/androidMain/AndroidManifest.xml b/examples/graphics-2d/androidApp/src/androidMain/AndroidManifest.xml similarity index 100% rename from examples/falling-balls/androidApp/src/androidMain/AndroidManifest.xml rename to examples/graphics-2d/androidApp/src/androidMain/AndroidManifest.xml diff --git a/examples/falling-balls/androidApp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt b/examples/graphics-2d/androidApp/src/androidMain/kotlin/org/jetbrains/graphics2d/MainActivity.kt similarity index 90% rename from examples/falling-balls/androidApp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt rename to examples/graphics-2d/androidApp/src/androidMain/kotlin/org/jetbrains/graphics2d/MainActivity.kt index ef41726dc2f..2285f4485a6 100644 --- a/examples/falling-balls/androidApp/src/androidMain/kotlin/org/jetbrains/fallingballs/MainActivity.kt +++ b/examples/graphics-2d/androidApp/src/androidMain/kotlin/org/jetbrains/graphics2d/MainActivity.kt @@ -1,4 +1,4 @@ -package org.jetbrains.fallingballs +package org.jetbrains.graphics2d import MainView import android.os.Bundle diff --git a/examples/graphics-2d/androidApp/src/androidMain/res/values/strings.xml b/examples/graphics-2d/androidApp/src/androidMain/res/values/strings.xml new file mode 100644 index 00000000000..b459df13ca9 --- /dev/null +++ b/examples/graphics-2d/androidApp/src/androidMain/res/values/strings.xml @@ -0,0 +1,3 @@ + + Graphics2D + \ No newline at end of file diff --git a/examples/falling-balls/apple-id.png b/examples/graphics-2d/apple-id.png similarity index 100% rename from examples/falling-balls/apple-id.png rename to examples/graphics-2d/apple-id.png diff --git a/examples/falling-balls/build.gradle.kts b/examples/graphics-2d/build.gradle.kts similarity index 100% rename from examples/falling-balls/build.gradle.kts rename to examples/graphics-2d/build.gradle.kts diff --git a/examples/falling-balls/desktopApp/build.gradle.kts b/examples/graphics-2d/desktopApp/build.gradle.kts similarity index 91% rename from examples/falling-balls/desktopApp/build.gradle.kts rename to examples/graphics-2d/desktopApp/build.gradle.kts index 7606f459184..31d4aef6ca9 100644 --- a/examples/falling-balls/desktopApp/build.gradle.kts +++ b/examples/graphics-2d/desktopApp/build.gradle.kts @@ -8,7 +8,7 @@ plugins { kotlin { jvm {} sourceSets { - val jvmMain by getting { + val jvmMain by getting { dependencies { implementation(compose.desktop.currentOs) implementation(project(":shared")) @@ -23,7 +23,7 @@ compose.desktop { nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "Falling Balls" + packageName = "Graphics2D" packageVersion = "1.0.0" windows { diff --git a/examples/graphics-2d/desktopApp/src/jvmMain/kotlin/Main.kt b/examples/graphics-2d/desktopApp/src/jvmMain/kotlin/Main.kt new file mode 100644 index 00000000000..72742a58ba0 --- /dev/null +++ b/examples/graphics-2d/desktopApp/src/jvmMain/kotlin/Main.kt @@ -0,0 +1,30 @@ +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.coerceIn +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import androidx.compose.ui.window.rememberWindowState + + +private val INIT_SIZE = DpSize(800.dp, 800.dp) + +fun main() = + application { + val windowState = rememberWindowState(width = 800.dp, height = 800.dp) + + Window( + onCloseRequest = ::exitApplication, + resizable = false, + title = "Graphics2D", + state = windowState, + ) { + Graphics2D( + requestWindowSize = { w, h -> + windowState.size = windowState.size.copy( + width = w.coerceIn(INIT_SIZE.width, Float.MAX_VALUE.dp), + height = h.coerceIn(INIT_SIZE.height, Float.MAX_VALUE.dp) + ) + } + ) + } + } diff --git a/examples/falling-balls/gradle.properties b/examples/graphics-2d/gradle.properties similarity index 100% rename from examples/falling-balls/gradle.properties rename to examples/graphics-2d/gradle.properties diff --git a/examples/falling-balls/gradle/wrapper/gradle-wrapper.jar b/examples/graphics-2d/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/falling-balls/gradle/wrapper/gradle-wrapper.jar rename to examples/graphics-2d/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/falling-balls/gradle/wrapper/gradle-wrapper.properties b/examples/graphics-2d/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/falling-balls/gradle/wrapper/gradle-wrapper.properties rename to examples/graphics-2d/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/falling-balls/gradlew b/examples/graphics-2d/gradlew similarity index 100% rename from examples/falling-balls/gradlew rename to examples/graphics-2d/gradlew diff --git a/examples/falling-balls/gradlew.bat b/examples/graphics-2d/gradlew.bat similarity index 100% rename from examples/falling-balls/gradlew.bat rename to examples/graphics-2d/gradlew.bat diff --git a/examples/falling-balls/ios-app.png b/examples/graphics-2d/ios-app.png similarity index 100% rename from examples/falling-balls/ios-app.png rename to examples/graphics-2d/ios-app.png diff --git a/examples/graphics-2d/iosApp/Configuration/Config.xcconfig b/examples/graphics-2d/iosApp/Configuration/Config.xcconfig new file mode 100644 index 00000000000..d5037986d05 --- /dev/null +++ b/examples/graphics-2d/iosApp/Configuration/Config.xcconfig @@ -0,0 +1,3 @@ +TEAM_ID= +BUNDLE_ID=org.jetbrains.Graphics2D +APP_NAME=Graphics2D diff --git a/examples/falling-balls/iosApp/iosApp.xcodeproj/project.pbxproj b/examples/graphics-2d/iosApp/iosApp.xcodeproj/project.pbxproj similarity index 97% rename from examples/falling-balls/iosApp/iosApp.xcodeproj/project.pbxproj rename to examples/graphics-2d/iosApp/iosApp.xcodeproj/project.pbxproj index bf37d47794f..c810131d7a3 100644 --- a/examples/falling-balls/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/examples/graphics-2d/iosApp/iosApp.xcodeproj/project.pbxproj @@ -17,7 +17,7 @@ 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - 7555FF7B242A565900829871 /* FallingBalls.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FallingBalls.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF7B242A565900829871 /* Graphics2D.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Graphics2D.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; AB3632DC29227652001CCB65 /* Config.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; @@ -54,7 +54,7 @@ 7555FF7C242A565900829871 /* Products */ = { isa = PBXGroup; children = ( - 7555FF7B242A565900829871 /* FallingBalls.app */, + 7555FF7B242A565900829871 /* Graphics2D.app */, ); name = Products; sourceTree = ""; @@ -97,7 +97,7 @@ ); name = iosApp; productName = iosApp; - productReference = 7555FF7B242A565900829871 /* FallingBalls.app */; + productReference = 7555FF7B242A565900829871 /* Graphics2D.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ diff --git a/examples/falling-balls/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/graphics-2d/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from examples/falling-balls/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to examples/graphics-2d/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/examples/falling-balls/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/graphics-2d/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from examples/falling-balls/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to examples/graphics-2d/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/examples/falling-balls/iosApp/iosApp/Assets.xcassets/Contents.json b/examples/graphics-2d/iosApp/iosApp/Assets.xcassets/Contents.json similarity index 100% rename from examples/falling-balls/iosApp/iosApp/Assets.xcassets/Contents.json rename to examples/graphics-2d/iosApp/iosApp/Assets.xcassets/Contents.json diff --git a/examples/falling-balls/iosApp/iosApp/ContentView.swift b/examples/graphics-2d/iosApp/iosApp/ContentView.swift similarity index 83% rename from examples/falling-balls/iosApp/iosApp/ContentView.swift rename to examples/graphics-2d/iosApp/iosApp/ContentView.swift index e9915e5fcff..56163e63933 100644 --- a/examples/falling-balls/iosApp/iosApp/ContentView.swift +++ b/examples/graphics-2d/iosApp/iosApp/ContentView.swift @@ -5,7 +5,7 @@ import shared struct ContentView: View { var body: some View { ComposeView() - .ignoresSafeArea(.keyboard) // Compose has own keyboard handler + .ignoresSafeArea(.all) // Compose has own keyboard handler } } diff --git a/examples/falling-balls/iosApp/iosApp/Info.plist b/examples/graphics-2d/iosApp/iosApp/Info.plist similarity index 100% rename from examples/falling-balls/iosApp/iosApp/Info.plist rename to examples/graphics-2d/iosApp/iosApp/Info.plist diff --git a/examples/falling-balls/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/examples/graphics-2d/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from examples/falling-balls/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json rename to examples/graphics-2d/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/examples/falling-balls/iosApp/iosApp/iOSApp.swift b/examples/graphics-2d/iosApp/iosApp/iOSApp.swift similarity index 100% rename from examples/falling-balls/iosApp/iosApp/iOSApp.swift rename to examples/graphics-2d/iosApp/iosApp/iOSApp.swift diff --git a/examples/minesweeper/jsApp/build.gradle.kts b/examples/graphics-2d/jsApp/build.gradle.kts similarity index 91% rename from examples/minesweeper/jsApp/build.gradle.kts rename to examples/graphics-2d/jsApp/build.gradle.kts index 144006fa941..b6fc37668c1 100644 --- a/examples/minesweeper/jsApp/build.gradle.kts +++ b/examples/graphics-2d/jsApp/build.gradle.kts @@ -9,7 +9,7 @@ kotlin { binaries.executable() } sourceSets { - val jsMain by getting { + val jsMain by getting { dependencies { implementation(project(":shared")) implementation(compose.ui) diff --git a/examples/graphics-2d/jsApp/src/jsMain/kotlin/main.js.kt b/examples/graphics-2d/jsApp/src/jsMain/kotlin/main.js.kt new file mode 100644 index 00000000000..5c9cd849532 --- /dev/null +++ b/examples/graphics-2d/jsApp/src/jsMain/kotlin/main.js.kt @@ -0,0 +1,10 @@ +import androidx.compose.ui.window.Window +import org.jetbrains.skiko.wasm.onWasmReady + +fun main() { + onWasmReady { + Window("Graphics2D") { + MainView() + } + } +} diff --git a/examples/minesweeper/jsApp/src/jsMain/resources/assets/clock.png b/examples/graphics-2d/jsApp/src/jsMain/resources/assets/clock.png similarity index 100% rename from examples/minesweeper/jsApp/src/jsMain/resources/assets/clock.png rename to examples/graphics-2d/jsApp/src/jsMain/resources/assets/clock.png diff --git a/examples/minesweeper/jsApp/src/jsMain/resources/assets/flag.png b/examples/graphics-2d/jsApp/src/jsMain/resources/assets/flag.png similarity index 100% rename from examples/minesweeper/jsApp/src/jsMain/resources/assets/flag.png rename to examples/graphics-2d/jsApp/src/jsMain/resources/assets/flag.png diff --git a/examples/minesweeper/jsApp/src/jsMain/resources/assets/mine.png b/examples/graphics-2d/jsApp/src/jsMain/resources/assets/mine.png similarity index 100% rename from examples/minesweeper/jsApp/src/jsMain/resources/assets/mine.png rename to examples/graphics-2d/jsApp/src/jsMain/resources/assets/mine.png diff --git a/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.xml b/examples/graphics-2d/jsApp/src/jsMain/resources/compose-community-primary.xml similarity index 100% rename from examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.xml rename to examples/graphics-2d/jsApp/src/jsMain/resources/compose-community-primary.xml diff --git a/examples/graphics-2d/jsApp/src/jsMain/resources/index.html b/examples/graphics-2d/jsApp/src/jsMain/resources/index.html new file mode 100644 index 00000000000..c70f31b9a41 --- /dev/null +++ b/examples/graphics-2d/jsApp/src/jsMain/resources/index.html @@ -0,0 +1,16 @@ + + + + + compose multiplatform web demo + + + + +

compose multiplatform web demo

+
+ +
+ + + diff --git a/examples/falling-balls/jsApp/src/jsMain/resources/styles.css b/examples/graphics-2d/jsApp/src/jsMain/resources/styles.css similarity index 100% rename from examples/falling-balls/jsApp/src/jsMain/resources/styles.css rename to examples/graphics-2d/jsApp/src/jsMain/resources/styles.css diff --git a/examples/falling-balls/run-configurations.png b/examples/graphics-2d/run-configurations.png similarity index 100% rename from examples/falling-balls/run-configurations.png rename to examples/graphics-2d/run-configurations.png diff --git a/examples/minesweeper/settings.gradle.kts b/examples/graphics-2d/settings.gradle.kts similarity index 96% rename from examples/minesweeper/settings.gradle.kts rename to examples/graphics-2d/settings.gradle.kts index 6ed7a53ada8..7e76f0ab40e 100644 --- a/examples/minesweeper/settings.gradle.kts +++ b/examples/graphics-2d/settings.gradle.kts @@ -24,7 +24,7 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0") } -rootProject.name = "minesweeper" +rootProject.name = "graphics-2d" include(":androidApp") include(":shared") diff --git a/examples/minesweeper/shared/build.gradle.kts b/examples/graphics-2d/shared/build.gradle.kts similarity index 94% rename from examples/minesweeper/shared/build.gradle.kts rename to examples/graphics-2d/shared/build.gradle.kts index 0df0b481ae0..adff5037ca6 100644 --- a/examples/minesweeper/shared/build.gradle.kts +++ b/examples/graphics-2d/shared/build.gradle.kts @@ -15,7 +15,6 @@ kotlin { androidTarget() jvm("desktop") - js(IR) { browser() } @@ -52,7 +51,7 @@ kotlin { implementation(compose.ui) implementation(compose.runtime) implementation(compose.foundation) - implementation(compose.material) + implementation(compose.material3) @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) implementation(compose.components.resources) } @@ -95,13 +94,9 @@ kotlin { implementation(compose.desktop.common) } } - val macosMain by creating { dependsOn(commonMain) } - val macosX64Main by getting { - dependsOn(macosMain) - } val macosArm64Main by getting { dependsOn(macosMain) } @@ -117,7 +112,7 @@ kotlin { android { compileSdk = 34 - namespace = "org.jetbrains.minesweeper" + namespace = "org.jetbrains.Graphics2D" sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") sourceSets["main"].res.srcDirs("src/androidMain/res") sourceSets["main"].resources.srcDirs("src/commonMain/resources") diff --git a/examples/falling-balls/shared/src/androidMain/AndroidManifest.xml b/examples/graphics-2d/shared/src/androidMain/AndroidManifest.xml similarity index 100% rename from examples/falling-balls/shared/src/androidMain/AndroidManifest.xml rename to examples/graphics-2d/shared/src/androidMain/AndroidManifest.xml diff --git a/examples/graphics-2d/shared/src/androidMain/kotlin/main.android.kt b/examples/graphics-2d/shared/src/androidMain/kotlin/main.android.kt new file mode 100644 index 00000000000..ec2120b6db4 --- /dev/null +++ b/examples/graphics-2d/shared/src/androidMain/kotlin/main.android.kt @@ -0,0 +1,6 @@ +import androidx.compose.runtime.Composable + +@Composable +fun MainView() { + Graphics2D() +} diff --git a/examples/graphics-2d/shared/src/androidMain/kotlin/minesweeper/MineSweeper.android.kt b/examples/graphics-2d/shared/src/androidMain/kotlin/minesweeper/MineSweeper.android.kt new file mode 100644 index 00000000000..181a5833e6a --- /dev/null +++ b/examples/graphics-2d/shared/src/androidMain/kotlin/minesweeper/MineSweeper.android.kt @@ -0,0 +1,3 @@ +package minesweeper + +actual fun hasRightClick() = false diff --git a/examples/visual-effects/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt b/examples/graphics-2d/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt similarity index 79% rename from examples/visual-effects/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt rename to examples/graphics-2d/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt index 3dd3fe22d9c..b9e71feb0d2 100644 --- a/examples/visual-effects/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt +++ b/examples/graphics-2d/shared/src/androidMain/kotlin/platform/PointerEventKind.android.kt @@ -1,4 +1,4 @@ -package org.jetbrains.compose.demo.visuals.platform +package visualeffects import androidx.compose.ui.Modifier diff --git a/examples/graphics-2d/shared/src/commonMain/kotlin/Graphics2D.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/Graphics2D.kt new file mode 100644 index 00000000000..7554db78343 --- /dev/null +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/Graphics2D.kt @@ -0,0 +1,110 @@ +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import bouncingballs.BouncingBallsApp +import fallingballs.FallingBalls +import minesweeper.MineSweeper +import visualeffects.NYContent +import visualeffects.RotatingWords +import visualeffects.WaveEffectGrid + +private val TOP_APP_BAR_HEIGHT = 100.dp +private val EMPTY_WINDOW_RESIZER: (width: Dp, height: Dp) -> Unit = { w, h -> } + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun Graphics2D(requestWindowSize: ((width: Dp, height: Dp) -> Unit) = EMPTY_WINDOW_RESIZER) { + val exampleState: MutableState = remember { mutableStateOf(null) } + val example = exampleState.value + + MaterialTheme( + colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme() + ) { + Scaffold( + topBar = { + TopAppBar( + navigationIcon = { + if (example != null) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Back", + modifier = Modifier.clickable { + exampleState.value = null + } + ) + } + }, + title = { + Text(example?.name ?: "Choose example") + } + ) + } + ) { + Box(Modifier.padding(it)) { + if (example == null) { + LazyColumn(Modifier.padding(horizontal = 16.dp)) { + items(examples) { + Button(onClick = { + exampleState.value = it + }) { + Text(it.name) + } + } + } + } else { + example.content { w, h -> + requestWindowSize(w, h + TOP_APP_BAR_HEIGHT) + } + } + } + + } + } +} + +private class Example( + val name: String, + val content: @Composable (requestWindowSize: ((width: Dp, height: Dp) -> Unit)) -> Unit +) + +private val examples: List = listOf( + Example("FallingBalls") { + FallingBalls() + }, + Example("BouncingBalls") { + BouncingBallsApp() + }, + Example("MineSweeper") { + MineSweeper(it) + }, + Example("RotatingWords") { + RotatingWords() + }, + Example("WaveEffectGrid") { + WaveEffectGrid() + }, + Example("Happy New Year!") { + NYContent() + }, +) diff --git a/examples/falling-balls/shared/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/bouncingballs/BouncingBalls.kt similarity index 86% rename from examples/falling-balls/shared/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/bouncingballs/BouncingBalls.kt index 58f5b65adb0..09f813e468d 100644 --- a/examples/falling-balls/shared/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/bouncingballs/BouncingBalls.kt @@ -1,28 +1,35 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package bouncingBalls +package bouncingballs import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.key +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.withFrameNanos import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.unit.dp import kotlin.math.PI import kotlin.math.cos import kotlin.math.max +import kotlin.math.roundToInt import kotlin.math.sin import kotlin.random.Random @@ -52,17 +59,16 @@ fun BouncingBallsApp(initialBallsCount: Int = 5) { list } - Box( + BoxWithConstraints( modifier = Modifier.fillMaxWidth() .fillMaxHeight() .border(width = 1.dp, color = Color.Black) .noRippleClickable { items += BouncingBall.createBouncingBall(offset = it) - }.onSizeChanged { - areaWidth = it.width - areaHeight = it.height } ) { + areaWidth = maxWidth.value.roundToInt() + areaHeight = maxHeight.value.roundToInt() Balls(items) } diff --git a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/FallingBalls.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/FallingBalls.common.kt similarity index 68% rename from examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/FallingBalls.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/FallingBalls.common.kt index 731435037e2..53814c85593 100644 --- a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/FallingBalls.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/FallingBalls.common.kt @@ -1,11 +1,20 @@ +package fallingballs + import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.layout.* -import androidx.compose.material.Button -import androidx.compose.material.Slider -import androidx.compose.material.Text +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.Slider +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember import androidx.compose.runtime.withFrameNanos import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -15,7 +24,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @Composable -fun FallingBalls(game: Game) { +fun FallingBalls() { + val game = remember { Game() } val density = LocalDensity.current Column { Text( @@ -23,7 +33,10 @@ fun FallingBalls(game: Game) { fontSize = 20.sp, color = Color(218, 120, 91) ) - Text("Score: ${game.score} Time: ${game.elapsed / 1_000_000} Blocks: ${game.numBlocks.toInt()}", fontSize = 20.sp) + Text( + "Score: ${game.score} Time: ${game.elapsed / 1_000_000} Blocks: ${game.numBlocks.toInt()}", + fontSize = 20.sp + ) Row { if (!game.started) { Slider( @@ -33,9 +46,6 @@ fun FallingBalls(game: Game) { ) } Button( - modifier = Modifier - .border(2.dp, Color(255, 215, 0)) - .background(Color.Yellow), onClick = { game.started = !game.started if (game.started) { @@ -45,18 +55,6 @@ fun FallingBalls(game: Game) { ) { Text(if (game.started) "Stop" else "Start", fontSize = 25.sp) } - if (game.started) { - Button( - modifier = Modifier - .offset(10.dp, 0.dp) - .border(2.dp, Color(255, 215, 0)) - .background(Color.Yellow), - onClick = { - game.togglePause() - }) { - Text(if (game.paused) "Resume" else "Pause", fontSize = 25.sp) - } - } } if (game.started) { Box(modifier = Modifier.height(20.dp)) @@ -76,12 +74,14 @@ fun FallingBalls(game: Game) { LaunchedEffect(Unit) { while (true) { + var previousTimeNanos = withFrameNanos { it } withFrameNanos { - if (game.started && !game.paused && !game.finished) - game.update(it) + if (game.started && !game.paused && !game.finished) { + game.update((it - previousTimeNanos).coerceAtLeast(0)) + previousTimeNanos = it + } } } } } } - diff --git a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Game.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Game.kt similarity index 50% rename from examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Game.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Game.kt index b4bbe9d4a82..9480152ed2d 100644 --- a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Game.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Game.kt @@ -1,23 +1,18 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ -import androidx.compose.runtime.* +package fallingballs + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.* +import androidx.compose.ui.unit.dp import kotlin.random.Random -interface Time { - fun now(): Long -} - -class Game(val time: Time) { - private var previousTimeNanos: Long = Long.MAX_VALUE +class Game() { private val colors = arrayOf( Color.Red, Color.Blue, Color.Cyan, Color.Magenta, Color.Yellow, Color.Black ) - private var startTime = 0L var width by mutableStateOf(0.dp) var height by mutableStateOf(0.dp) @@ -36,30 +31,26 @@ class Game(val time: Time) { var numBlocks by mutableStateOf(5f) fun start() { - previousTimeNanos = time.now() - startTime = previousTimeNanos clicked = 0 started = true finished = false paused = false pieces.clear() repeat(numBlocks.toInt()) { index -> - pieces.add(PieceData(this, index * 1.5f + 5f, colors[index % colors.size]).also { piece -> - piece.position = Random.nextDouble(0.0, 100.0).toFloat() - }) + pieces.add( + PieceData( + this, + index * 1.5f + 5f, + colors[index % colors.size] + ).also { piece -> + piece.position = Random.nextDouble(0.0, 100.0).toFloat() + }) } } - fun togglePause() { - paused = !paused - previousTimeNanos = time.now() - } - - fun update(nanos: Long) { - val dt = (nanos - previousTimeNanos).coerceAtLeast(0) - previousTimeNanos = nanos - elapsed = nanos - startTime - pieces.forEach { it.update(dt) } + fun update(deltaTimeNanos: Long) { + elapsed += deltaTimeNanos + pieces.forEach { it.update(deltaTimeNanos) } } fun clicked(piece: PieceData) { @@ -69,4 +60,4 @@ class Game(val time: Time) { finished = true } } -} \ No newline at end of file +} diff --git a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Piece.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Piece.kt similarity index 89% rename from examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Piece.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Piece.kt index 14b96bfab02..118ca63df14 100644 --- a/examples/falling-balls/shared/src/commonMain/kotlin/fallingBalls/Piece.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/fallingballs/Piece.kt @@ -1,7 +1,4 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ +package fallingballs import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -53,4 +50,4 @@ data class PieceData(val game: Game, val velocity: Float, val color: Color) { game.clicked(this) } } -} \ No newline at end of file +} diff --git a/examples/minesweeper/shared/src/commonMain/kotlin/BoardView.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/BoardView.kt similarity index 95% rename from examples/minesweeper/shared/src/commonMain/kotlin/BoardView.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/BoardView.kt index a72e93b88b9..a31d098c949 100644 --- a/examples/minesweeper/shared/src/commonMain/kotlin/BoardView.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/BoardView.kt @@ -1,3 +1,5 @@ +package minesweeper + import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box @@ -43,4 +45,4 @@ fun BoardView(game: GameController) = with(GameStyles) { } private fun GameStyles.getCellColor(cell: Cell): Color = - if (cell.isOpened) openedCellColor else closedCellColor \ No newline at end of file + if (cell.isOpened) openedCellColor else closedCellColor diff --git a/examples/minesweeper/shared/src/commonMain/kotlin/GameController.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameController.kt similarity index 97% rename from examples/minesweeper/shared/src/commonMain/kotlin/GameController.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameController.kt index 154bdcfbbd3..155ae15cdf8 100644 --- a/examples/minesweeper/shared/src/commonMain/kotlin/GameController.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameController.kt @@ -1,36 +1,50 @@ +package minesweeper + import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import kotlin.random.Random -class GameController(private val options: GameSettings, private val onWin: (() -> Unit)? = null, private val onLose: (() -> Unit)? = null) { +class GameController( + private val options: GameSettings, + private val onWin: (() -> Unit)? = null, + private val onLose: (() -> Unit)? = null +) { /** Number of rows in current board */ val rows: Int get() = options.rows + /** Number of columns in current board */ val columns: Int get() = options.columns + /** Number of bombs in current board */ val bombs: Int get() = options.mines + /** True if current game has started, false if game is finished or until first cell is opened or flagged */ var running by mutableStateOf(false) private set + /** True if game is ended (win or lose) */ var finished by mutableStateOf(false) private set + /** Total number of flags set on cells, used for calculation of number of remaining bombs */ var flagsSet by mutableStateOf(0) private set + /** Number of remaining cells */ var cellsToOpen by mutableStateOf(options.rows * options.columns - options.mines) private set + /** Game timer, increments every second while game is running */ var seconds by mutableStateOf(0) private set /** Global monotonic time, updated with [onTimeTick] */ private var time = 0L + /** The time when user starts the game by opening or flagging any cell */ private var startTime = 0L @@ -59,7 +73,7 @@ class GameController(private val options: GameSettings, private val onWin: (() - mines: Collection>, onWin: (() -> Unit)? = null, onLose: (() -> Unit)? = null - ) : this(GameSettings(rows, columns, mines.size), onWin, onLose) { + ) : this(GameSettings(rows, columns, mines.size), onWin, onLose) { for (row in cells) { for (cell in row) { cell.hasBomb = false @@ -290,4 +304,4 @@ class Cell(val row: Int, val column: Int) { var isOpened by mutableStateOf(false) var isFlagged by mutableStateOf(false) var bombsNear = 0 -} \ No newline at end of file +} diff --git a/examples/minesweeper/shared/src/commonMain/kotlin/gameInteraction.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameInteraction.kt similarity index 98% rename from examples/minesweeper/shared/src/commonMain/kotlin/gameInteraction.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameInteraction.kt index 77842f61234..a852418e1af 100644 --- a/examples/minesweeper/shared/src/commonMain/kotlin/gameInteraction.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/GameInteraction.kt @@ -1,3 +1,5 @@ +package minesweeper + import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable import androidx.compose.runtime.Composable diff --git a/examples/minesweeper/shared/src/commonMain/kotlin/game.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/MineSweeper.common.kt similarity index 89% rename from examples/minesweeper/shared/src/commonMain/kotlin/game.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/MineSweeper.common.kt index 13c2d47b204..967c9db8268 100644 --- a/examples/minesweeper/shared/src/commonMain/kotlin/game.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/MineSweeper.common.kt @@ -1,12 +1,14 @@ @file:Suppress("FunctionName") -import androidx.compose.runtime.* +package minesweeper + + import androidx.compose.foundation.* import androidx.compose.foundation.layout.* -import androidx.compose.material.* +import androidx.compose.material3.* +import androidx.compose.runtime.* import androidx.compose.ui.* import androidx.compose.ui.graphics.Color - import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.unit.* import org.jetbrains.compose.resources.ExperimentalResourceApi @@ -39,7 +41,7 @@ object GameStyles { } @Composable -fun Game(requestWindowSize: ((width: Dp, height: Dp) -> Unit)? = null) = MainLayout { +fun MineSweeper(requestWindowSize: ((width: Dp, height: Dp) -> Unit)? = null) = MainLayout { var message by remember { mutableStateOf(null) } val onWin = { message = "You win!" } @@ -101,9 +103,10 @@ fun Game(requestWindowSize: ((width: Dp, height: Dp) -> Unit)? = null) = MainLay } // Cells - Box(modifier = Modifier - .border(GameStyles.boardBorderWidth, Color.White) - .padding(GameStyles.boardPadding) + Box( + modifier = Modifier + .border(GameStyles.boardBorderWidth, Color.White) + .padding(GameStyles.boardPadding) ) { BoardView(game) } @@ -119,6 +122,6 @@ fun Game(requestWindowSize: ((width: Dp, height: Dp) -> Unit)? = null) = MainLay } @Composable -private fun MainLayout(block:@Composable ColumnScope.() -> Unit) { +private fun MainLayout(block: @Composable ColumnScope.() -> Unit) { Column { block() } -} \ No newline at end of file +} diff --git a/examples/minesweeper/shared/src/commonMain/kotlin/widgets.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/Widgets.kt similarity index 97% rename from examples/minesweeper/shared/src/commonMain/kotlin/widgets.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/Widgets.kt index 3a81aca7737..6d009681419 100644 --- a/examples/minesweeper/shared/src/commonMain/kotlin/widgets.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/minesweeper/Widgets.kt @@ -1,11 +1,13 @@ @file:Suppress("FunctionName") +package minesweeper + import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.material.Text +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -80,4 +82,4 @@ fun NewGameButton(text: String, onClick: () -> Unit) { modifier = Modifier.padding(4.dp) ) } -} \ No newline at end of file +} diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/HappyNY.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/HappyNY.kt similarity index 65% rename from examples/visual-effects/shared/src/commonMain/kotlin/HappyNY.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/HappyNY.kt index b1df36b5ee4..0a01191f6b1 100644 --- a/examples/visual-effects/shared/src/commonMain/kotlin/HappyNY.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/HappyNY.kt @@ -1,25 +1,45 @@ -package org.jetbrains.compose.demo.visuals +package visualeffects import androidx.compose.foundation.background -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Surface -import androidx.compose.material.Text -import androidx.compose.runtime.* +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.runtime.withFrameNanos import androidx.compose.ui.Alignment -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.* +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.draw.scale +import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp -import org.jetbrains.compose.demo.visuals.platform.nanoTime -import kotlin.math.* +import kotlin.math.PI +import kotlin.math.abs +import kotlin.math.cos +import kotlin.math.sin import kotlin.random.Random const val width = 1200 @@ -97,16 +117,16 @@ class DoubleRocket(val particle: Particle) { state = STATE_SMALL_ROCKETS } - fun move(time: Long, prevTime: Long) { + fun move(timeElapsed: Long, deltaNanos: Long) { if (rocket.state == rocket.STATE_ROCKET) { - rocket.particle.move(time, prevTime) - rocket.particle.gravity(time, prevTime) + rocket.particle.move(deltaNanos) + rocket.particle.gravity(deltaNanos) } else { rocket.rockets.forEach { - it.move(time, prevTime) + it.move(timeElapsed, deltaNanos) } } - rocket.checkState(time) + rocket.checkState(timeElapsed) } @Composable @@ -126,8 +146,8 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0) var exploded = false var parts: Array = emptyArray() - fun checkExplode(time: Long) { - if (time - startTime > 1200000000) { + fun checkExplode(timeElapsed: Long) { + if (timeElapsed - startTime > 1200000000) { explode() } } @@ -136,7 +156,14 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0) parts = Array(rocketPartsCount) { val v = 0.5f + 1.5 * random() val angle = 2 * PI * random() - Particle(particle.x, particle.y, v * sin(angle) + particle.vx, v * cos(angle) + particle.vy, color, 1) + Particle( + particle.x, + particle.y, + v * sin(angle) + particle.vx, + v * cos(angle) + particle.vy, + color, + 1 + ) } exploded = true } @@ -149,15 +176,15 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0) return true } - fun move(time: Long, prevTime: Long) { + fun move(timeElapsed: Long, deltaNanos: Long) { if (!exploded) { - particle.move(time, prevTime) - particle.gravity(time, prevTime) - checkExplode(time) + particle.move(deltaNanos) + particle.gravity(deltaNanos) + checkExplode(timeElapsed) } else { parts.forEach { - it.move(time, prevTime) - it.gravity(time, prevTime) + it.move(deltaNanos) + it.gravity(deltaNanos) } } } @@ -174,20 +201,30 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0) } } -class Particle(var x: Double, var y: Double, var vx: Double, var vy: Double, val color: Color, val type: Int = 0) { - fun move(time: Long, prevTime: Long) { - x = (x + vx * (time - prevTime) / 30000000) - y = (y + vy * (time - prevTime) / 30000000) +class Particle( + var x: Double, + var y: Double, + var vx: Double, + var vy: Double, + val color: Color, + val type: Int = 0 +) { + fun move(deltaNanos: Long) { + x = (x + vx * deltaNanos / 30000000) + y = (y + vy * deltaNanos / 30000000) } - fun gravity(time: Long, prevTime: Long) { - vy = vy + 1.0f * (time - prevTime) / 300000000 + fun gravity(deltaNanos: Long) { + vy = vy + 1.0f * deltaNanos / 300000000 } @Composable fun draw() { val alphaFactor = if (type == 0) 1.0f else 1 / (1 + abs(vy / 5)).toFloat() - Box(Modifier.size(5.dp).offset(x.dp, y.dp).alpha(alphaFactor).clip(CircleShape).background(color)) + Box( + Modifier.size(5.dp).offset(x.dp, y.dp).alpha(alphaFactor).clip(CircleShape) + .background(color) + ) for (i in 1..5) { Box( Modifier.size(4.dp).offset((x - vx / 2 * i).dp, (y - vy / 2 * i).dp) @@ -199,7 +236,10 @@ class Particle(var x: Double, var y: Double, var vx: Double, var vy: Double, val val rocket = DoubleRocket(Particle(0.0, 1000.0, 2.1, -12.5, Color.White)) -fun prepareStarsAndSnowFlakes(stars: SnapshotStateList, snowFlakes: SnapshotStateList) { +fun prepareStarsAndSnowFlakes( + stars: SnapshotStateList, + snowFlakes: SnapshotStateList +) { for (i in 0..snowCount) { snowFlakes.add( SnowFlake( @@ -214,7 +254,15 @@ fun prepareStarsAndSnowFlakes(stars: SnapshotStateList, snowFlakes: Snapsh ) ) } - val colors = arrayOf(Color.Red, Color.Yellow, Color.Green, Color.Yellow, Color.Cyan, Color.Magenta, Color.White) + val colors = arrayOf( + Color.Red, + Color.Yellow, + Color.Green, + Color.Yellow, + Color.Cyan, + Color.Magenta, + Color.White + ) for (i in 0..starCount) { stars.add( Star( @@ -227,58 +275,58 @@ fun prepareStarsAndSnowFlakes(stars: SnapshotStateList, snowFlakes: Snapsh } } -@OptIn(ExperimentalComposeUiApi::class) @Composable fun NYContent() { - var time by remember { mutableStateOf(nanoTime()) } var started by remember { mutableStateOf(false) } - var startTime = remember { nanoTime() } - var prevTime by remember { mutableStateOf(nanoTime()) } - val snowFlakes = remember { mutableStateListOf() } val stars = remember { mutableStateListOf() } var flickering2 by remember { mutableStateOf(true) } + val snowFlakes = remember { mutableStateListOf() } remember { prepareStarsAndSnowFlakes(stars, snowFlakes) } + var timeElapsedNanos by remember { mutableStateOf(0L) } Surface( modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp)), color = Color.Black, shape = RoundedCornerShape(20.dp) ) { - LaunchedEffect(Unit) { while (true) { + var previousTimeNanos = withFrameNanos { it } withFrameNanos { - prevTime = time - time = it - } - } - } - - if (!started) { //animation starts with delay, so there is some time to start recording - if (time - startTime in 7000000001..7099999999) println("ready!") - if (time - startTime > 10000000000) { - startTime = time //restarting timer - started = true - } - } + val deltaTimeNanos = it - previousTimeNanos + timeElapsedNanos += deltaTimeNanos + previousTimeNanos = it + + if (flickering2) { + if (timeElapsedNanos > 15500000000) { //note, that startTime has been updated above + flickering2 = false + } + } + if (started) { + rocket.move(timeElapsedNanos, deltaTimeNanos) + } - if (flickering2) { - if (time - startTime > 15500000000) { //note, that startTime has been updated above - flickering2 = false + snowFlakes.forEach { + var y = it.y + ((it.v * deltaTimeNanos) / 30000000).dp + if (y > (height + 20).dp) { + y = -20.dp + } + it.y = y + } + } } } - if (started) { - rocket.move(time, prevTime) - } with(LocalDensity.current) { Box(Modifier.fillMaxSize()) { - - snow(time, prevTime, snowFlakes, startTime) - + snow(timeElapsedNanos, snowFlakes) starrySky(stars) - Row(modifier = Modifier.fillMaxSize(), verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.Center) { + Row( + modifier = Modifier.fillMaxSize(), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.Center + ) { Text( fontSize = 10.em, text = "202", @@ -287,10 +335,10 @@ fun NYContent() { color = Color.White ) - val alpha = if (flickering2) flickeringAlpha(time) else 1.0f + val alpha = if (flickering2) flickeringAlpha(timeElapsedNanos) else 1.0f Text( fontSize = 10.em, - text = "3", + text = "4", modifier = Modifier.alpha(alpha).offset(0.dp, -15.dp), color = Color.White ) @@ -300,14 +348,15 @@ fun NYContent() { //HNY var i = 0 val angle = (HNYString.length / 2 * 5) * -1.0f - val color = colorHNY(time, startTime) + val color = colorHNY(timeElapsedNanos) HNYString.forEach { - val alpha = alphaHNY(i, time, startTime) + val alpha = alphaHNY(i, timeElapsedNanos) Text( fontSize = 14.sp, - text= it.toString(), + text = it.toString(), color = color, - modifier = Modifier.scale(5f).align(Alignment.Center).offset(0.dp, 85.dp) + modifier = Modifier.scale(5f).align(Alignment.Center) + .offset(0.dp, 85.dp) .rotate((angle + 5.0f * i)).offset(0.dp, -90.dp).alpha(alpha) ) i++ @@ -326,9 +375,9 @@ fun NYContent() { } } -fun colorHNY(time: Long, startTime: Long): Color { +fun colorHNY(timeElapsed: Long): Color { val periodLength = 60 - val offset = ((time - startTime) / 80000000).toFloat() / periodLength + val offset = (timeElapsed.toFloat() / 80000000) / periodLength val color1 = Color.Red val color2 = Color.Yellow val color3 = Color.Magenta @@ -348,16 +397,16 @@ fun blend(color1: Color, color2: Color, fraction: Float): Color { ) } -fun alphaHNY(i: Int, time: Long, startTime: Long): Float { - val period = period(time, startTime, 200) - i +fun alphaHNY(i: Int, timeElapsed: Long): Float { + val period = period(timeElapsed, 200) - i if (period < 0) return 0.0f if (period > 10) return 1.0f return 0.1f * period } -fun period(time: Long, startTime: Long, periodLength: Int, speed: Int = 1): Int { +fun period(timeElapsed: Long, periodLength: Int, speed: Int = 1): Int { val period = 200000000 / speed - return (((time - startTime) / period) % periodLength).toInt() + return ((timeElapsed / period) % periodLength).toInt() } fun flickeringAlpha(time: Long): Float { @@ -384,17 +433,15 @@ fun star(x: Dp, y: Dp, color: Color = Color.White, size: Dp) { } @Composable -fun snow(time: Long, prevTime: Long, snowFlakes: SnapshotStateList, startTime: Long) { - val deltaAngle = (time - startTime) / 100000000 +fun snow(timeElapsed: Long, snowFlakes: SnapshotStateList) { + val deltaAngle = timeElapsed.toFloat() / 100000000 with(LocalDensity.current) { snowFlakes.forEach { - var y = it.y + ((it.v * (time - prevTime)) / 300000000).dp - if (y > (height + 20).dp) { - y = -20.dp - } - it.y = y - val x = it.x + (15 * sin(time.toDouble() / 3000000000 + it.phase)).dp - snowFlake(Modifier.offset(x, y).scale(it.scale).rotate(it.angle + deltaAngle * it.rotate), it.alpha) + val x = it.x + (15 * sin(timeElapsed.toDouble() / 3000000000 + it.phase)).dp + snowFlake( + Modifier.offset(x, it.y).scale(it.scale).rotate(it.angle + deltaAngle * it.rotate), + it.alpha + ) } } } @@ -416,7 +463,8 @@ fun snowFlake(modifier: Modifier, alpha: Float = 0.8f) { fun snowFlakeInt(level: Int, angle: Float, shiftX: Dp, shiftY: Dp, alpha: Float) { if (level > 3) return Box( - Modifier.offset(shiftX, shiftY).rotate(angle).width(100.dp).height(10.dp).scale(0.6f).alpha(1f) + Modifier.offset(shiftX, shiftY).rotate(angle).width(100.dp).height(10.dp).scale(0.6f) + .alpha(1f) .background(Color.White.copy(alpha = alpha)) ) { snowFlakeInt(level + 1, 30f, 12.dp, 20.dp, alpha * 0.8f) diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/platform/PointerEventKind.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/PointerEvent.common.kt similarity index 77% rename from examples/visual-effects/shared/src/commonMain/kotlin/platform/PointerEventKind.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/PointerEvent.common.kt index 88fb8f80258..696cd60117d 100644 --- a/examples/visual-effects/shared/src/commonMain/kotlin/platform/PointerEventKind.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/PointerEvent.common.kt @@ -1,4 +1,4 @@ -package org.jetbrains.compose.demo.visuals.platform +package visualeffects import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.gestures.forEachGesture @@ -6,6 +6,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.PointerEvent import androidx.compose.ui.input.pointer.pointerInput + enum class PointerEventKind { Move, In, @@ -14,7 +15,10 @@ enum class PointerEventKind { class Position(val x: Int, val y: Int) -expect fun Modifier.onPointerEvent(eventKind: PointerEventKind, onEvent: Position.() -> Unit): Modifier +expect fun Modifier.onPointerEvent( + eventKind: PointerEventKind, + onEvent: Position.() -> Unit +): Modifier fun Modifier.onPointerEventMobileImpl( eventKind: PointerEventKind, @@ -37,7 +41,10 @@ fun Modifier.onPointerEventMobileImpl( val event: PointerEvent = awaitPointerEvent() if (eventKind == PointerEventKind.Move) { - Position(event.changes.first().position.x.toInt(), event.changes.first().position.y.toInt()).onEvent() + Position( + event.changes.first().position.x.toInt(), + event.changes.first().position.y.toInt() + ).onEvent() } } while (event.changes.any { it.pressed }) @@ -49,4 +56,3 @@ fun Modifier.onPointerEventMobileImpl( } } } - diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/RotatingWords.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/RotatingWords.kt similarity index 88% rename from examples/visual-effects/shared/src/commonMain/kotlin/RotatingWords.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/RotatingWords.kt index 34070537f4a..16f04f3b3e3 100644 --- a/examples/visual-effects/shared/src/commonMain/kotlin/RotatingWords.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/RotatingWords.kt @@ -1,11 +1,11 @@ -package org.jetbrains.compose.demo.visuals +package visualeffects import androidx.compose.animation.core.* import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Text +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -62,19 +62,27 @@ fun Words() { val color3 = Color(0xFD, 0xB6, 0x0D) val color4 = Color(0xFC, 0xF8, 0x4A) - Column(modifier = Modifier - .fillMaxSize() - .padding(16.dp) + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp) ) { Word(position = baseRu, angle = angle, scale = scale, text = "Ваш", color = color1) Word(position = baseEn, angle = angle, scale = scale, text = "Your", color = color2) Word(position = baseCh, angle = angle, scale = scale, text = "您的", color = color3) Word(position = baseJa, angle = angle, scale = scale, text = "あなたの", color = color4) - Word(position = baseText, angle = 0f, scale = 6f, text = " Compose\nMultiplatform", color = Color(52, 67, 235), - alpha = 0.4f) + Word( + position = baseText, + angle = 0f, + scale = 6f, + text = " Compose\nMultiplatform", + color = Color(52, 67, 235), + alpha = 0.4f + ) val size = 80.dp * scale - Image(logoImg, contentDescription = "Logo", + Image( + logoImg, contentDescription = "Logo", modifier = Modifier .offset(baseLogo.x - size / 2, baseLogo.y - size / 2) .size(size) @@ -84,8 +92,10 @@ fun Words() { } @Composable -fun Word(position: DpOffset, angle: Float, scale: Float, text: String, - color: Color, alpha: Float = 0.8f) { +fun Word( + position: DpOffset, angle: Float, scale: Float, text: String, + color: Color, alpha: Float = 0.8f +) { Text( modifier = Modifier .offset(position.x, position.y) diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/WaveEffect.kt b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/WaveEffect.kt similarity index 83% rename from examples/visual-effects/shared/src/commonMain/kotlin/WaveEffect.kt rename to examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/WaveEffect.kt index 71a41bb2d87..a3ca49a4956 100644 --- a/examples/visual-effects/shared/src/commonMain/kotlin/WaveEffect.kt +++ b/examples/graphics-2d/shared/src/commonMain/kotlin/visualeffects/WaveEffect.kt @@ -1,9 +1,9 @@ -package org.jetbrains.compose.demo.visuals +package visualeffects import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.* +import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -11,9 +11,6 @@ import androidx.compose.ui.draw.* import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import org.jetbrains.compose.demo.visuals.platform.PointerEventKind -import org.jetbrains.compose.demo.visuals.platform.nanoTime -import org.jetbrains.compose.demo.visuals.platform.onPointerEvent import kotlin.math.* @OptIn(ExperimentalComposeUiApi::class) @@ -25,23 +22,31 @@ fun WaveEffectGrid() { var centerY by remember { mutableStateOf(900) } var vX by remember { mutableStateOf(0) } var vY by remember { mutableStateOf(0) } + var timeElapsedNanos by remember { mutableStateOf(0L) } + + LaunchedEffect(Unit) { + while (true) { + var previousTimeNanos = withFrameNanos { it } + withFrameNanos { + val deltaTimeNanos = it - previousTimeNanos + timeElapsedNanos += deltaTimeNanos + previousTimeNanos = it + + if (State.entered) { + centerX = (centerX + vX * deltaTimeNanos / 1000000000).toInt() + if (centerX < -100) centerX = -100 + if (centerX > 2600) centerX = 2600 + vX = + (vX * (1 - deltaTimeNanos.toDouble() / 500000000) + 10 * (mouseX - centerX) * deltaTimeNanos / 1000000000).toInt() + centerY = (centerY + vY * deltaTimeNanos / 1000000000).toInt() + if (centerY < -100) centerY = -100 + if (centerY > 1800) centerY = 1800 + vY = + (vY * (1 - deltaTimeNanos.toDouble() / 500000000) + 5 * (mouseY - centerY) * deltaTimeNanos / 1000000000).toInt() - var time by remember { mutableStateOf(nanoTime()) } - var prevTime by remember { mutableStateOf(nanoTime()) } - - if (State.entered) { - centerX = (centerX + vX * (time - prevTime) / 1000000000).toInt() - if (centerX < -100) centerX = -100 - if (centerX > 2600) centerX = 2600 - vX = - (vX * (1 - (time - prevTime).toDouble() / 500000000) + 10 * (mouseX - centerX) * (time - prevTime) / 1000000000).toInt() - centerY = (centerY + vY * (time - prevTime) / 1000000000).toInt() - if (centerY < -100) centerY = -100 - if (centerY > 1800) centerY = 1800 - vY = - (vY * (1 - (time - prevTime).toDouble() / 500000000) + 5 * (mouseY - centerY) * (time - prevTime) / 1000000000).toInt() - - prevTime = time + } + } + } } Surface( @@ -71,8 +76,8 @@ fun WaveEffectGrid() { x = if (evenRow) 10 + shift else 10 while (x < 1190) { val size: Int = size(x, y, pointerOffsetX, pointerOffsety) - val color = boxColor(x, y, time, pointerOffsetX, pointerOffsety) - Dot(size, Modifier.offset(x.dp, y.dp), color, time) + val color = boxColor(x, y, timeElapsedNanos, pointerOffsetX, pointerOffsety) + Dot(size, Modifier.offset(x.dp, y.dp), color, timeElapsedNanos) x += shift * 2 } y += shift @@ -81,14 +86,6 @@ fun WaveEffectGrid() { HighPanel(pointerOffsetX, pointerOffsety) } - LaunchedEffect(Unit) { - while (true) { - withFrameNanos { - time = it - } - } - } - } } diff --git a/examples/minesweeper/shared/src/commonMain/resources/assets/clock.png b/examples/graphics-2d/shared/src/commonMain/resources/assets/clock.png similarity index 100% rename from examples/minesweeper/shared/src/commonMain/resources/assets/clock.png rename to examples/graphics-2d/shared/src/commonMain/resources/assets/clock.png diff --git a/examples/minesweeper/shared/src/commonMain/resources/assets/flag.png b/examples/graphics-2d/shared/src/commonMain/resources/assets/flag.png similarity index 100% rename from examples/minesweeper/shared/src/commonMain/resources/assets/flag.png rename to examples/graphics-2d/shared/src/commonMain/resources/assets/flag.png diff --git a/examples/minesweeper/shared/src/commonMain/resources/assets/mine.png b/examples/graphics-2d/shared/src/commonMain/resources/assets/mine.png similarity index 100% rename from examples/minesweeper/shared/src/commonMain/resources/assets/mine.png rename to examples/graphics-2d/shared/src/commonMain/resources/assets/mine.png diff --git a/examples/graphics-2d/shared/src/commonMain/resources/compose-community-primary.xml b/examples/graphics-2d/shared/src/commonMain/resources/compose-community-primary.xml new file mode 100644 index 00000000000..d7bf7955f44 --- /dev/null +++ b/examples/graphics-2d/shared/src/commonMain/resources/compose-community-primary.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/examples/minesweeper/shared/src/commonTest/kotlin/GameControllerTest.kt b/examples/graphics-2d/shared/src/commonTest/kotlin/minesweeper/GameControllerTest.kt similarity index 99% rename from examples/minesweeper/shared/src/commonTest/kotlin/GameControllerTest.kt rename to examples/graphics-2d/shared/src/commonTest/kotlin/minesweeper/GameControllerTest.kt index e18ac5a1f94..887b30fbb42 100644 --- a/examples/minesweeper/shared/src/commonTest/kotlin/GameControllerTest.kt +++ b/examples/graphics-2d/shared/src/commonTest/kotlin/minesweeper/GameControllerTest.kt @@ -1,3 +1,5 @@ +package minesweeper + import kotlin.test.* class GameControllerTest { diff --git a/examples/graphics-2d/shared/src/desktopMain/kotlin/minesweeper/MineSweeper.desktop.kt b/examples/graphics-2d/shared/src/desktopMain/kotlin/minesweeper/MineSweeper.desktop.kt new file mode 100644 index 00000000000..303963a3f06 --- /dev/null +++ b/examples/graphics-2d/shared/src/desktopMain/kotlin/minesweeper/MineSweeper.desktop.kt @@ -0,0 +1,3 @@ +package minesweeper + +actual fun hasRightClick() = true diff --git a/examples/visual-effects/shared/src/desktopMain/kotlin/platform/PointerEventKind.desktop.kt b/examples/graphics-2d/shared/src/desktopMain/kotlin/visualeffects/PointerEvent.desktop.kt similarity index 93% rename from examples/visual-effects/shared/src/desktopMain/kotlin/platform/PointerEventKind.desktop.kt rename to examples/graphics-2d/shared/src/desktopMain/kotlin/visualeffects/PointerEvent.desktop.kt index cc933fc2bb0..c33d60853ce 100644 --- a/examples/visual-effects/shared/src/desktopMain/kotlin/platform/PointerEventKind.desktop.kt +++ b/examples/graphics-2d/shared/src/desktopMain/kotlin/visualeffects/PointerEvent.desktop.kt @@ -1,4 +1,4 @@ -package org.jetbrains.compose.demo.visuals.platform +package visualeffects import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -20,4 +20,4 @@ actual fun Modifier.onPointerEvent( return this.onPointerEvent(eventType) { Position(it.changes.first().position.x.toInt(), it.changes.first().position.y.toInt()).onEvent() } -} \ No newline at end of file +} diff --git a/examples/graphics-2d/shared/src/iosMain/kotlin/main.ios.kt b/examples/graphics-2d/shared/src/iosMain/kotlin/main.ios.kt new file mode 100644 index 00000000000..c075a8db126 --- /dev/null +++ b/examples/graphics-2d/shared/src/iosMain/kotlin/main.ios.kt @@ -0,0 +1,6 @@ +import androidx.compose.ui.window.ComposeUIViewController +import platform.UIKit.UIViewController + +fun MainViewController(): UIViewController = ComposeUIViewController { + Graphics2D() +} diff --git a/examples/graphics-2d/shared/src/iosMain/kotlin/minesweeper/MineSweeper.ios.kt b/examples/graphics-2d/shared/src/iosMain/kotlin/minesweeper/MineSweeper.ios.kt new file mode 100644 index 00000000000..181a5833e6a --- /dev/null +++ b/examples/graphics-2d/shared/src/iosMain/kotlin/minesweeper/MineSweeper.ios.kt @@ -0,0 +1,3 @@ +package minesweeper + +actual fun hasRightClick() = false diff --git a/examples/visual-effects/shared/src/iosMain/kotlin/platform/PointerEventKind.ios.kt b/examples/graphics-2d/shared/src/iosMain/kotlin/visualeffects/PointerEvent.ios.kt similarity index 79% rename from examples/visual-effects/shared/src/iosMain/kotlin/platform/PointerEventKind.ios.kt rename to examples/graphics-2d/shared/src/iosMain/kotlin/visualeffects/PointerEvent.ios.kt index 3dd3fe22d9c..b9e71feb0d2 100644 --- a/examples/visual-effects/shared/src/iosMain/kotlin/platform/PointerEventKind.ios.kt +++ b/examples/graphics-2d/shared/src/iosMain/kotlin/visualeffects/PointerEvent.ios.kt @@ -1,4 +1,4 @@ -package org.jetbrains.compose.demo.visuals.platform +package visualeffects import androidx.compose.ui.Modifier diff --git a/examples/graphics-2d/shared/src/jsMain/kotlin/main.js.kt b/examples/graphics-2d/shared/src/jsMain/kotlin/main.js.kt new file mode 100644 index 00000000000..ec2120b6db4 --- /dev/null +++ b/examples/graphics-2d/shared/src/jsMain/kotlin/main.js.kt @@ -0,0 +1,6 @@ +import androidx.compose.runtime.Composable + +@Composable +fun MainView() { + Graphics2D() +} diff --git a/examples/graphics-2d/shared/src/jsMain/kotlin/minesweeper/MineSweeepr.js.kt b/examples/graphics-2d/shared/src/jsMain/kotlin/minesweeper/MineSweeepr.js.kt new file mode 100644 index 00000000000..181a5833e6a --- /dev/null +++ b/examples/graphics-2d/shared/src/jsMain/kotlin/minesweeper/MineSweeepr.js.kt @@ -0,0 +1,3 @@ +package minesweeper + +actual fun hasRightClick() = false diff --git a/examples/graphics-2d/shared/src/jsMain/kotlin/visualeffects/PointerEvent.js.kt b/examples/graphics-2d/shared/src/jsMain/kotlin/visualeffects/PointerEvent.js.kt new file mode 100644 index 00000000000..83f87cbc246 --- /dev/null +++ b/examples/graphics-2d/shared/src/jsMain/kotlin/visualeffects/PointerEvent.js.kt @@ -0,0 +1,26 @@ +package visualeffects + +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.PointerEventType +import androidx.compose.ui.input.pointer.onPointerEvent + +@OptIn(ExperimentalComposeUiApi::class) +actual fun Modifier.onPointerEvent( + eventKind: PointerEventKind, + onEvent: Position.() -> Unit +): Modifier { + + val eventType: PointerEventType = when (eventKind) { + PointerEventKind.Move -> PointerEventType.Move + PointerEventKind.In -> PointerEventType.Enter + PointerEventKind.Out -> PointerEventType.Exit + } + + return this.onPointerEvent(eventType) { + Position( + it.changes.first().position.x.toInt(), + it.changes.first().position.y.toInt() + ).onEvent() + } +} diff --git a/examples/graphics-2d/shared/src/macosMain/kotlin/main.macos.kt b/examples/graphics-2d/shared/src/macosMain/kotlin/main.macos.kt new file mode 100644 index 00000000000..d4504403472 --- /dev/null +++ b/examples/graphics-2d/shared/src/macosMain/kotlin/main.macos.kt @@ -0,0 +1,11 @@ +import androidx.compose.ui.window.Window +import platform.AppKit.NSApp +import platform.AppKit.NSApplication + +fun main() { + NSApplication.sharedApplication() + Window("Graphics2D") { + Graphics2D() + } + NSApp?.run() +} diff --git a/examples/graphics-2d/shared/src/macosMain/kotlin/minesweeper/MineSweeper.macos.kt b/examples/graphics-2d/shared/src/macosMain/kotlin/minesweeper/MineSweeper.macos.kt new file mode 100644 index 00000000000..181a5833e6a --- /dev/null +++ b/examples/graphics-2d/shared/src/macosMain/kotlin/minesweeper/MineSweeper.macos.kt @@ -0,0 +1,3 @@ +package minesweeper + +actual fun hasRightClick() = false diff --git a/examples/graphics-2d/shared/src/macosMain/kotlin/visualeffects/PointerEventKind.macos.kt b/examples/graphics-2d/shared/src/macosMain/kotlin/visualeffects/PointerEventKind.macos.kt new file mode 100644 index 00000000000..7ceb8d6bfe3 --- /dev/null +++ b/examples/graphics-2d/shared/src/macosMain/kotlin/visualeffects/PointerEventKind.macos.kt @@ -0,0 +1,27 @@ +package visualeffects + +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.PointerEventType +import androidx.compose.ui.input.pointer.onPointerEvent + + +@OptIn(ExperimentalComposeUiApi::class) +actual fun Modifier.onPointerEvent( + eventKind: PointerEventKind, + onEvent: Position.() -> Unit +): Modifier { + + val eventType: PointerEventType = when (eventKind) { + PointerEventKind.Move -> PointerEventType.Move + PointerEventKind.In -> PointerEventType.Enter + PointerEventKind.Out -> PointerEventType.Exit + } + + return this.onPointerEvent(eventType) { + Position( + it.changes.first().position.x.toInt(), + it.changes.first().position.y.toInt() + ).onEvent() + } +} diff --git a/examples/minesweeper/.gitignore b/examples/minesweeper/.gitignore deleted file mode 100644 index fedf972a672..00000000000 --- a/examples/minesweeper/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -local.properties -iosApp/Podfile.lock -iosApp/Pods/* -iosApp/iosApp.xcworkspace/* -iosApp/iosApp.xcodeproj/* -!iosApp/iosApp.xcodeproj/project.pbxproj -shared/shared.podspec diff --git a/examples/minesweeper/.run/desktopApp.run.xml b/examples/minesweeper/.run/desktopApp.run.xml deleted file mode 100644 index 7af7e15f4b9..00000000000 --- a/examples/minesweeper/.run/desktopApp.run.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - true - true - false - - - \ No newline at end of file diff --git a/examples/minesweeper/README.md b/examples/minesweeper/README.md deleted file mode 100644 index 68d98e4f57d..00000000000 --- a/examples/minesweeper/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Minesweeper - -A simple game powered by Compose Multiplatform. - -Game can run on Android, iOS, desktop or in a browser. - -## Setting up your development environment - -To setup the environment, please consult these [instructions](https://github.com/JetBrains/compose-multiplatform-template#setting-up-your-development-environment). - -## How to run - -Choose a run configuration for an appropriate target in Android Studio and run it. - -![run-configurations.png](run-configurations.png) - -## Run on desktop via Gradle - -`./gradlew desktopApp:run` - -## Run native on MacOS -`./gradlew runDebugExecutableMacosX64` (Works on Intel processors) - -## Credits - \ No newline at end of file diff --git a/examples/minesweeper/androidApp/build.gradle.kts b/examples/minesweeper/androidApp/build.gradle.kts deleted file mode 100644 index dfd8f1bf236..00000000000 --- a/examples/minesweeper/androidApp/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -plugins { - kotlin("multiplatform") - id("com.android.application") - id("org.jetbrains.compose") -} - -kotlin { - androidTarget() - sourceSets { - val androidMain by getting { - dependencies { - implementation(project(":shared")) - } - } - } -} - -android { - compileSdk = 34 - namespace = "org.jetbrains.minesweeper" - defaultConfig { - applicationId = "org.jetbrains.ComposeMinesweeper" - minSdk = 26 - targetSdk = 34 - versionCode = 1 - versionName = "1.0" - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - jvmToolchain(17) - } -} diff --git a/examples/minesweeper/androidApp/src/androidMain/AndroidManifest.xml b/examples/minesweeper/androidApp/src/androidMain/AndroidManifest.xml deleted file mode 100644 index 137e2497460..00000000000 --- a/examples/minesweeper/androidApp/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/minesweeper/androidApp/src/androidMain/kotlin/MainActivity.kt b/examples/minesweeper/androidApp/src/androidMain/kotlin/MainActivity.kt deleted file mode 100644 index 4970ea42edd..00000000000 --- a/examples/minesweeper/androidApp/src/androidMain/kotlin/MainActivity.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.jetbrains.minesweeper - -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity -import MainView - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - MainView() - } - } -} diff --git a/examples/minesweeper/androidApp/src/androidMain/res/values/strings.xml b/examples/minesweeper/androidApp/src/androidMain/res/values/strings.xml deleted file mode 100644 index 413fe24a13d..00000000000 --- a/examples/minesweeper/androidApp/src/androidMain/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Minesweeper - \ No newline at end of file diff --git a/examples/minesweeper/build.gradle.kts b/examples/minesweeper/build.gradle.kts deleted file mode 100644 index 0c00883af5a..00000000000 --- a/examples/minesweeper/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - // this is necessary to avoid the plugins to be loaded multiple times - // in each subproject's classloader - kotlin("jvm") apply false - kotlin("multiplatform") apply false - kotlin("android") apply false - id("com.android.application") apply false - id("com.android.library") apply false - id("org.jetbrains.compose") apply false -} - -allprojects { - repositories { - google() - mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - } -} diff --git a/examples/minesweeper/desktopApp/build.gradle.kts b/examples/minesweeper/desktopApp/build.gradle.kts deleted file mode 100644 index 730a5109ad6..00000000000 --- a/examples/minesweeper/desktopApp/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat - -plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") -} - -kotlin { - jvm {} - sourceSets { - val jvmMain by getting { - dependencies { - implementation(compose.desktop.currentOs) - implementation(project(":shared")) - } - } - } -} - -compose.desktop { - application { - mainClass = "MainKt" - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "Minesweeper" - packageVersion = "1.0.0" - - windows { - menuGroup = "Compose Examples" - // see https://wixtoolset.org/documentation/manual/v3/howtos/general/generate_guids.html - upgradeUuid = "2bf169f9-d851-49f0-b3a1-308966d473ca" - } - } - } -} diff --git a/examples/minesweeper/desktopApp/src/jvmMain/kotlin/Main.kt b/examples/minesweeper/desktopApp/src/jvmMain/kotlin/Main.kt deleted file mode 100644 index 732c30af6ab..00000000000 --- a/examples/minesweeper/desktopApp/src/jvmMain/kotlin/Main.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.* - -fun main() = application { - val windowState = rememberWindowState() - - Window( - onCloseRequest = ::exitApplication, - resizable = false, - title = "Minesweeper", - icon = painterResource("assets/mine.png"), - state = windowState - ) { - MainView(windowState) - } -} \ No newline at end of file diff --git a/examples/minesweeper/gradle.properties b/examples/minesweeper/gradle.properties deleted file mode 100644 index 73998f2d5e5..00000000000 --- a/examples/minesweeper/gradle.properties +++ /dev/null @@ -1,19 +0,0 @@ -kotlin.code.style=official -xcodeproj=./iosApp -android.useAndroidX=true -org.gradle.jvmargs=-Xmx3g -org.jetbrains.compose.experimental.jscanvas.enabled=true -org.jetbrains.compose.experimental.macos.enabled=true -org.jetbrains.compose.experimental.uikit.enabled=true -kotlin.native.useEmbeddableCompilerJar=true -kotlin.mpp.androidSourceSetLayoutVersion=2 -# Enable kotlin/native experimental memory model -kotlin.native.binary.memoryModel=experimental -kotlin.version=1.9.10 -agp.version=8.0.2 -compose.version=1.5.2 - -# TODO: remove when switching to 1.9.10. See: https://youtrack.jetbrains.com/issue/KT-60852 -# usage: ./gradlew :jsApp:jsBrowserRun -Pworkaround.kotlin.js.kt60852=true -# setting it to `true` breaks other targets (see shared/build.gradle.kts), so it should be used to run the web app only. -workaround.kotlin.js.kt60852=false diff --git a/examples/minesweeper/gradle/wrapper/gradle-wrapper.jar b/examples/minesweeper/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${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='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# 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 ;; #( - MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/examples/minesweeper/gradlew.bat b/examples/minesweeper/gradlew.bat deleted file mode 100644 index f127cfd49d4..00000000000 --- a/examples/minesweeper/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@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 Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@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="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -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 execute - -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 - -: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 %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 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! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/examples/minesweeper/iosApp/Configuration/Config.xcconfig b/examples/minesweeper/iosApp/Configuration/Config.xcconfig deleted file mode 100644 index f752d0e2f8d..00000000000 --- a/examples/minesweeper/iosApp/Configuration/Config.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -TEAM_ID= -BUNDLE_ID=org.jetbrains.Minesweeper -APP_NAME=Minesweeper diff --git a/examples/minesweeper/iosApp/iosApp.xcodeproj/project.pbxproj b/examples/minesweeper/iosApp/iosApp.xcodeproj/project.pbxproj deleted file mode 100644 index 39a69e8216d..00000000000 --- a/examples/minesweeper/iosApp/iosApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,382 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; }; - 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - 7555FF7B242A565900829871 /* Minesweeper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Minesweeper.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AB3632DC29227652001CCB65 /* Config.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - F85CB1118929364A9C6EFABC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 058557D7273AAEEB004C7B11 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 7555FF72242A565900829871 = { - isa = PBXGroup; - children = ( - AB1DB47929225F7C00F7AF9C /* Configuration */, - 7555FF7D242A565900829871 /* iosApp */, - 7555FF7C242A565900829871 /* Products */, - ); - sourceTree = ""; - }; - 7555FF7C242A565900829871 /* Products */ = { - isa = PBXGroup; - children = ( - 7555FF7B242A565900829871 /* Minesweeper.app */, - ); - name = Products; - sourceTree = ""; - }; - 7555FF7D242A565900829871 /* iosApp */ = { - isa = PBXGroup; - children = ( - 058557BA273AAA24004C7B11 /* Assets.xcassets */, - 7555FF82242A565900829871 /* ContentView.swift */, - 7555FF8C242A565B00829871 /* Info.plist */, - 2152FB032600AC8F00CF470E /* iOSApp.swift */, - 058557D7273AAEEB004C7B11 /* Preview Content */, - ); - path = iosApp; - sourceTree = ""; - }; - AB1DB47929225F7C00F7AF9C /* Configuration */ = { - isa = PBXGroup; - children = ( - AB3632DC29227652001CCB65 /* Config.xcconfig */, - ); - path = Configuration; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7555FF7A242A565900829871 /* iosApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; - buildPhases = ( - 0548D1B82A8FD49F002E7F63 /* Compile Kotlin */, - 7555FF77242A565900829871 /* Sources */, - 7555FF79242A565900829871 /* Resources */, - F85CB1118929364A9C6EFABC /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = iosApp; - productName = iosApp; - productReference = 7555FF7B242A565900829871 /* Minesweeper.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7555FF73242A565900829871 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = orgName; - TargetAttributes = { - 7555FF7A242A565900829871 = { - CreatedOnToolsVersion = 11.3.1; - }; - }; - }; - buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 7555FF72242A565900829871; - productRefGroup = 7555FF7C242A565900829871 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7555FF7A242A565900829871 /* iosApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 7555FF79242A565900829871 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 0548D1B82A8FD49F002E7F63 /* Compile Kotlin */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Compile Kotlin"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "cd \"$SRCROOT/..\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 7555FF77242A565900829871 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */, - 7555FF83242A565900829871 /* ContentView.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 7555FFA3242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 7555FFA4242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 7555FFA6242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = "${TEAM_ID}"; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n"; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "shared\n", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; - PRODUCT_NAME = "${APP_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 7555FFA7242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = "${TEAM_ID}"; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n"; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "shared\n", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; - PRODUCT_NAME = "${APP_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA3242A565B00829871 /* Debug */, - 7555FFA4242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA6242A565B00829871 /* Debug */, - 7555FFA7242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7555FF73242A565900829871 /* Project object */; -} diff --git a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index ee7e3ca03f8..00000000000 --- a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index fb88a396bf3..00000000000 --- a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/Contents.json b/examples/minesweeper/iosApp/iosApp/Assets.xcassets/Contents.json deleted file mode 100644 index 4aa7c5350bf..00000000000 --- a/examples/minesweeper/iosApp/iosApp/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/minesweeper/iosApp/iosApp/ContentView.swift b/examples/minesweeper/iosApp/iosApp/ContentView.swift deleted file mode 100644 index f7f6457b31a..00000000000 --- a/examples/minesweeper/iosApp/iosApp/ContentView.swift +++ /dev/null @@ -1,21 +0,0 @@ -import UIKit -import SwiftUI -import shared - -struct ComposeView: UIViewControllerRepresentable { - func makeUIViewController(context: Context) -> UIViewController { - Main_iosKt.MainViewController() - } - - func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} -} - -struct ContentView: View { - var body: some View { - ComposeView() - .ignoresSafeArea(.keyboard) // Compose has own keyboard handler - } -} - - - diff --git a/examples/minesweeper/iosApp/iosApp/Info.plist b/examples/minesweeper/iosApp/iosApp/Info.plist deleted file mode 100644 index 9a269f5eaac..00000000000 --- a/examples/minesweeper/iosApp/iosApp/Info.plist +++ /dev/null @@ -1,48 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - - UILaunchScreen - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/examples/minesweeper/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/examples/minesweeper/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 4aa7c5350bf..00000000000 --- a/examples/minesweeper/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/minesweeper/iosApp/iosApp/iOSApp.swift b/examples/minesweeper/iosApp/iosApp/iOSApp.swift deleted file mode 100644 index 0648e8602f2..00000000000 --- a/examples/minesweeper/iosApp/iosApp/iOSApp.swift +++ /dev/null @@ -1,10 +0,0 @@ -import SwiftUI - -@main -struct iOSApp: App { - var body: some Scene { - WindowGroup { - ContentView() - } - } -} \ No newline at end of file diff --git a/examples/minesweeper/jsApp/src/jsMain/kotlin/main.js.kt b/examples/minesweeper/jsApp/src/jsMain/kotlin/main.js.kt deleted file mode 100644 index b36b64e9ad0..00000000000 --- a/examples/minesweeper/jsApp/src/jsMain/kotlin/main.js.kt +++ /dev/null @@ -1,16 +0,0 @@ - /* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.Window -import org.jetbrains.skiko.wasm.onWasmReady - - -fun main() { - onWasmReady { - Window("Minesweeper") { - MainView() - } - } -} diff --git a/examples/minesweeper/jsApp/src/jsMain/resources/index.html b/examples/minesweeper/jsApp/src/jsMain/resources/index.html deleted file mode 100644 index 9dd212786b6..00000000000 --- a/examples/minesweeper/jsApp/src/jsMain/resources/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Title - - - -

compose multiplatform web demo

-
- -
- - - - \ No newline at end of file diff --git a/examples/minesweeper/run-configurations.png b/examples/minesweeper/run-configurations.png deleted file mode 100644 index d859ff0870f4af0332e8ca15caf4bcbbf94bb6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17480 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 diff --git a/examples/minesweeper/shared/src/androidMain/AndroidManifest.xml b/examples/minesweeper/shared/src/androidMain/AndroidManifest.xml deleted file mode 100644 index 568741e54f2..00000000000 --- a/examples/minesweeper/shared/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/examples/minesweeper/shared/src/androidMain/kotlin/main.android.kt b/examples/minesweeper/shared/src/androidMain/kotlin/main.android.kt deleted file mode 100644 index 460fdeb8f27..00000000000 --- a/examples/minesweeper/shared/src/androidMain/kotlin/main.android.kt +++ /dev/null @@ -1,5 +0,0 @@ -import androidx.compose.runtime.Composable - -@Composable fun MainView() = Game() - -actual fun hasRightClick() = false diff --git a/examples/minesweeper/shared/src/desktopMain/kotlin/main.desktop.kt b/examples/minesweeper/shared/src/desktopMain/kotlin/main.desktop.kt deleted file mode 100644 index ed7f8f9d4b9..00000000000 --- a/examples/minesweeper/shared/src/desktopMain/kotlin/main.desktop.kt +++ /dev/null @@ -1,15 +0,0 @@ -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.window.WindowState - -@Composable -fun MainView(windowState: WindowState) = - MaterialTheme { - Game( - requestWindowSize = { w, h -> - windowState.size = windowState.size.copy(width = w, height = h) - } - ) - } - -actual fun hasRightClick() = true diff --git a/examples/minesweeper/shared/src/iosMain/kotlin/main.ios.kt b/examples/minesweeper/shared/src/iosMain/kotlin/main.ios.kt deleted file mode 100644 index ef0837a8c94..00000000000 --- a/examples/minesweeper/shared/src/iosMain/kotlin/main.ios.kt +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.ComposeUIViewController -import platform.UIKit.UIViewController - -fun MainViewController() : UIViewController = ComposeUIViewController { Game() } - -actual fun hasRightClick() = false \ No newline at end of file diff --git a/examples/minesweeper/shared/src/jsMain/kotlin/main.js.kt b/examples/minesweeper/shared/src/jsMain/kotlin/main.js.kt deleted file mode 100644 index 5e079586366..00000000000 --- a/examples/minesweeper/shared/src/jsMain/kotlin/main.js.kt +++ /dev/null @@ -1,6 +0,0 @@ -import androidx.compose.runtime.Composable - -@Composable -fun MainView() = Game() - -actual fun hasRightClick() = false diff --git a/examples/minesweeper/shared/src/macosMain/kotlin/main.macos.kt b/examples/minesweeper/shared/src/macosMain/kotlin/main.macos.kt deleted file mode 100644 index 88b034d366c..00000000000 --- a/examples/minesweeper/shared/src/macosMain/kotlin/main.macos.kt +++ /dev/null @@ -1,32 +0,0 @@ -import androidx.compose.foundation.* -import androidx.compose.foundation.layout.* -import androidx.compose.material.* -import androidx.compose.runtime.* -import androidx.compose.ui.* -import androidx.compose.ui.geometry.Size -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.drawscope.DrawScope -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.input.pointer.* -import androidx.compose.ui.text.style.* -import androidx.compose.ui.text.font.* -import androidx.compose.ui.unit.* -import androidx.compose.ui.window.Window -import platform.AppKit.NSApplication -import platform.AppKit.NSApp - -fun main() { - NSApplication.sharedApplication() - Window("Minesweeper") { - MaterialTheme { - Game( - requestWindowSize = { _, _ -> - // TODO(not implemented yet - } - ) - } - } - NSApp?.run() -} - -actual fun hasRightClick() = false \ No newline at end of file diff --git a/examples/validateExamplesIos.sh b/examples/validateExamplesIos.sh index 6da14bb2106..3efc7b4a63b 100755 --- a/examples/validateExamplesIos.sh +++ b/examples/validateExamplesIos.sh @@ -33,9 +33,7 @@ runGradle() { runGradle chat runGradle codeviewer -runGradle falling-balls runGradle imageviewer runGradle todoapp-lite -runGradle visual-effects runGradle widgets-gallery -runGradle minesweeper +runGradle graphics-2d diff --git a/examples/visual-effects/.gitignore b/examples/visual-effects/.gitignore deleted file mode 100644 index 180e0343839..00000000000 --- a/examples/visual-effects/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -build/ -/captures -.externalNativeBuild -.cxx -iosApp/Podfile.lock -iosApp/Pods/* -iosApp/iosApp.xcworkspace/* -iosApp/iosApp.xcodeproj/* -!iosApp/iosApp.xcodeproj/project.pbxproj -shared/shared.podspec \ No newline at end of file diff --git a/examples/visual-effects/.run/desktopApp.run.xml b/examples/visual-effects/.run/desktopApp.run.xml deleted file mode 100644 index 0de52186703..00000000000 --- a/examples/visual-effects/.run/desktopApp.run.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - true - true - false - - - \ No newline at end of file diff --git a/examples/visual-effects/README.md b/examples/visual-effects/README.md deleted file mode 100644 index 3074e926f52..00000000000 --- a/examples/visual-effects/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Visual Effects - -Several visual effects implemented with Compose Multiplatform, used in 1.0 release announce video. - -Supported targets: Android, Desktop and iOS. - -## Setting up your development environment - -To setup the environment, please consult these [instructions](https://github.com/JetBrains/compose-multiplatform-template#setting-up-your-development-environment). - -## How to run - -Choose a run configuration for an appropriate target in Android Studio and run it. - -![run-configurations.png](run-configurations.png) - -## Run on desktop via Gradle - -`./gradlew desktopApp:run` - diff --git a/examples/visual-effects/androidApp/build.gradle.kts b/examples/visual-effects/androidApp/build.gradle.kts deleted file mode 100644 index a0575f7eb2e..00000000000 --- a/examples/visual-effects/androidApp/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -plugins { - kotlin("multiplatform") - id("com.android.application") - id("org.jetbrains.compose") -} - -kotlin { - androidTarget() - sourceSets { - val androidMain by getting { - dependencies { - implementation(project(":shared")) - } - } - } -} - -android { - compileSdk = 34 - namespace = "org.jetbrains.compose.demo.visuals" - defaultConfig { - applicationId = "org.jetbrains.VisualEffects" - minSdk = 26 - targetSdk = 34 - versionCode = 1 - versionName = "1.0" - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - jvmToolchain(17) - } -} diff --git a/examples/visual-effects/androidApp/src/androidMain/AndroidManifest.xml b/examples/visual-effects/androidApp/src/androidMain/AndroidManifest.xml deleted file mode 100644 index ad0432f6f63..00000000000 --- a/examples/visual-effects/androidApp/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/visual-effects/androidApp/src/androidMain/kotlin/MainActivity.kt b/examples/visual-effects/androidApp/src/androidMain/kotlin/MainActivity.kt deleted file mode 100644 index 045ce66fb52..00000000000 --- a/examples/visual-effects/androidApp/src/androidMain/kotlin/MainActivity.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.jetbrains.compose.demo.visuals - -import MainView -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.appcompat.app.AppCompatActivity - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - MainView() - } - } -} \ No newline at end of file diff --git a/examples/visual-effects/androidApp/src/androidMain/res/values/strings.xml b/examples/visual-effects/androidApp/src/androidMain/res/values/strings.xml deleted file mode 100644 index d23a35eb385..00000000000 --- a/examples/visual-effects/androidApp/src/androidMain/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Visual Effects - \ No newline at end of file diff --git a/examples/visual-effects/build.gradle.kts b/examples/visual-effects/build.gradle.kts deleted file mode 100644 index 8d0c1f3d7c3..00000000000 --- a/examples/visual-effects/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - // this is necessary to avoid the plugins to be loaded multiple times - // in each subproject's classloader - kotlin("jvm") apply false - kotlin("multiplatform") apply false - kotlin("android") apply false - id("com.android.application") apply false - id("com.android.library") apply false - id("org.jetbrains.compose") apply false -} - -allprojects { - repositories { - google() - mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - mavenLocal() - } -} diff --git a/examples/visual-effects/desktopApp/build.gradle.kts b/examples/visual-effects/desktopApp/build.gradle.kts deleted file mode 100644 index 1cebd3ec6a5..00000000000 --- a/examples/visual-effects/desktopApp/build.gradle.kts +++ /dev/null @@ -1,55 +0,0 @@ -import org.jetbrains.compose.desktop.application.dsl.TargetFormat - -plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") -} - -kotlin { - jvm {} - sourceSets { - val jvmMain by getting { - dependencies { - implementation(compose.desktop.currentOs) - implementation(project(":shared")) - } - } - } -} - -compose.desktop { - application { - mainClass = "org.jetbrains.compose.demo.visuals.MainKt" - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "compose-demo" - packageVersion = "1.0.0" - } - } -} - -afterEvaluate { - val additionalArguments = mutableListOf() - - val runTask = tasks.named("run") { - this.args = additionalArguments - } - - tasks.register("runWords") { - additionalArguments.add("words") - group = "compose desktop" - dependsOn(runTask) - } - - tasks.register("runWave") { - additionalArguments.add("wave") - group = "compose desktop" - dependsOn(runTask) - } - - tasks.register("runNewYear") { - additionalArguments.add("NY") - group = "compose desktop" - dependsOn(runTask) - } -} \ No newline at end of file diff --git a/examples/visual-effects/desktopApp/src/jvmMain/kotlin/main.kt b/examples/visual-effects/desktopApp/src/jvmMain/kotlin/main.kt deleted file mode 100644 index 621ebdf7280..00000000000 --- a/examples/visual-effects/desktopApp/src/jvmMain/kotlin/main.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.jetbrains.compose.demo.visuals - -fun main(args: Array) { - if (args.isEmpty()) return allSamples() - when (val effect = args[0]) { - "words" -> mainWords() - "wave" -> mainWave(false) - "wave-controls" -> mainWave(true) - "NY" -> mainNY() - else -> throw Error("Unknown effect: $effect") - } -} diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties deleted file mode 100644 index 51a3f03b2ce..00000000000 --- a/examples/visual-effects/gradle.properties +++ /dev/null @@ -1,14 +0,0 @@ -kotlin.code.style=official -xcodeproj=./iosApp -android.useAndroidX=true -org.gradle.jvmargs=-Xmx3g -org.jetbrains.compose.experimental.jscanvas.enabled=true -org.jetbrains.compose.experimental.macos.enabled=true -org.jetbrains.compose.experimental.uikit.enabled=true -kotlin.mpp.androidSourceSetLayoutVersion=2 -kotlin.native.useEmbeddableCompilerJar=true -# Enable kotlin/native experimental memory model -kotlin.native.binary.memoryModel=experimental -kotlin.version=1.9.10 -agp.version=8.0.2 -compose.version=1.5.2 diff --git a/examples/visual-effects/gradle/wrapper/gradle-wrapper.jar b/examples/visual-effects/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${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='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# 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 ;; #( - MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/examples/visual-effects/gradlew.bat b/examples/visual-effects/gradlew.bat deleted file mode 100644 index f127cfd49d4..00000000000 --- a/examples/visual-effects/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@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 Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@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="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -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 execute - -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 - -: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 %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 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! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/examples/visual-effects/iosApp/Configuration/Config.xcconfig b/examples/visual-effects/iosApp/Configuration/Config.xcconfig deleted file mode 100644 index bad995c745a..00000000000 --- a/examples/visual-effects/iosApp/Configuration/Config.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -TEAM_ID= -BUNDLE_ID=org.jetbrains.VisualEffects -APP_NAME=VisualEffects diff --git a/examples/visual-effects/iosApp/iosApp.xcodeproj/project.pbxproj b/examples/visual-effects/iosApp/iosApp.xcodeproj/project.pbxproj deleted file mode 100644 index d2282704e82..00000000000 --- a/examples/visual-effects/iosApp/iosApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,382 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; }; - 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - 7555FF7B242A565900829871 /* VisualEffects.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VisualEffects.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AB3632DC29227652001CCB65 /* Config.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - F85CB1118929364A9C6EFABC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 058557D7273AAEEB004C7B11 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 7555FF72242A565900829871 = { - isa = PBXGroup; - children = ( - AB1DB47929225F7C00F7AF9C /* Configuration */, - 7555FF7D242A565900829871 /* iosApp */, - 7555FF7C242A565900829871 /* Products */, - ); - sourceTree = ""; - }; - 7555FF7C242A565900829871 /* Products */ = { - isa = PBXGroup; - children = ( - 7555FF7B242A565900829871 /* VisualEffects.app */, - ); - name = Products; - sourceTree = ""; - }; - 7555FF7D242A565900829871 /* iosApp */ = { - isa = PBXGroup; - children = ( - 058557BA273AAA24004C7B11 /* Assets.xcassets */, - 7555FF82242A565900829871 /* ContentView.swift */, - 7555FF8C242A565B00829871 /* Info.plist */, - 2152FB032600AC8F00CF470E /* iOSApp.swift */, - 058557D7273AAEEB004C7B11 /* Preview Content */, - ); - path = iosApp; - sourceTree = ""; - }; - AB1DB47929225F7C00F7AF9C /* Configuration */ = { - isa = PBXGroup; - children = ( - AB3632DC29227652001CCB65 /* Config.xcconfig */, - ); - path = Configuration; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7555FF7A242A565900829871 /* iosApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; - buildPhases = ( - 0548D1BA2A8FD715002E7F63 /* Compile Kotlin */, - 7555FF77242A565900829871 /* Sources */, - 7555FF79242A565900829871 /* Resources */, - F85CB1118929364A9C6EFABC /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = iosApp; - productName = iosApp; - productReference = 7555FF7B242A565900829871 /* VisualEffects.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7555FF73242A565900829871 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = orgName; - TargetAttributes = { - 7555FF7A242A565900829871 = { - CreatedOnToolsVersion = 11.3.1; - }; - }; - }; - buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 7555FF72242A565900829871; - productRefGroup = 7555FF7C242A565900829871 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7555FF7A242A565900829871 /* iosApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 7555FF79242A565900829871 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 0548D1BA2A8FD715002E7F63 /* Compile Kotlin */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Compile Kotlin"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "cd \"$SRCROOT/..\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 7555FF77242A565900829871 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */, - 7555FF83242A565900829871 /* ContentView.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 7555FFA3242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 7555FFA4242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AB3632DC29227652001CCB65 /* Config.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 7555FFA6242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = "${TEAM_ID}"; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n"; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "shared\n", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; - PRODUCT_NAME = "${APP_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 7555FFA7242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = "${TEAM_ID}"; - ENABLE_PREVIEWS = YES; - FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)\n"; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "shared\n", - ); - PRODUCT_BUNDLE_IDENTIFIER = "${BUNDLE_ID}${TEAM_ID}"; - PRODUCT_NAME = "${APP_NAME}"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA3242A565B00829871 /* Debug */, - 7555FFA4242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA6242A565B00829871 /* Debug */, - 7555FFA7242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7555FF73242A565900829871 /* Project object */; -} diff --git a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index ee7e3ca03f8..00000000000 --- a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index fb88a396bf3..00000000000 --- a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/Contents.json b/examples/visual-effects/iosApp/iosApp/Assets.xcassets/Contents.json deleted file mode 100644 index 4aa7c5350bf..00000000000 --- a/examples/visual-effects/iosApp/iosApp/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/visual-effects/iosApp/iosApp/ContentView.swift b/examples/visual-effects/iosApp/iosApp/ContentView.swift deleted file mode 100644 index f7f6457b31a..00000000000 --- a/examples/visual-effects/iosApp/iosApp/ContentView.swift +++ /dev/null @@ -1,21 +0,0 @@ -import UIKit -import SwiftUI -import shared - -struct ComposeView: UIViewControllerRepresentable { - func makeUIViewController(context: Context) -> UIViewController { - Main_iosKt.MainViewController() - } - - func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} -} - -struct ContentView: View { - var body: some View { - ComposeView() - .ignoresSafeArea(.keyboard) // Compose has own keyboard handler - } -} - - - diff --git a/examples/visual-effects/iosApp/iosApp/Info.plist b/examples/visual-effects/iosApp/iosApp/Info.plist deleted file mode 100644 index 9a269f5eaac..00000000000 --- a/examples/visual-effects/iosApp/iosApp/Info.plist +++ /dev/null @@ -1,48 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - - UILaunchScreen - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/examples/visual-effects/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/examples/visual-effects/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 4aa7c5350bf..00000000000 --- a/examples/visual-effects/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/examples/visual-effects/iosApp/iosApp/iOSApp.swift b/examples/visual-effects/iosApp/iosApp/iOSApp.swift deleted file mode 100644 index 0648e8602f2..00000000000 --- a/examples/visual-effects/iosApp/iosApp/iOSApp.swift +++ /dev/null @@ -1,10 +0,0 @@ -import SwiftUI - -@main -struct iOSApp: App { - var body: some Scene { - WindowGroup { - ContentView() - } - } -} \ No newline at end of file diff --git a/examples/visual-effects/run-configurations.png b/examples/visual-effects/run-configurations.png deleted file mode 100644 index d859ff0870f4af0332e8ca15caf4bcbbf94bb6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17480 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 diff --git a/examples/visual-effects/settings.gradle.kts b/examples/visual-effects/settings.gradle.kts deleted file mode 100644 index 1b7a2ddc8b2..00000000000 --- a/examples/visual-effects/settings.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - google() - } - - plugins { - val kotlinVersion = extra["kotlin.version"] as String - val agpVersion = extra["agp.version"] as String - val composeVersion = extra["compose.version"] as String - - kotlin("jvm").version(kotlinVersion) - kotlin("multiplatform").version(kotlinVersion) - kotlin("android").version(kotlinVersion) - id("com.android.base").version(agpVersion) - id("com.android.application").version(agpVersion) - id("com.android.library").version(agpVersion) - id("org.jetbrains.compose").version(composeVersion) - } -} - -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0") -} - -rootProject.name = "visual-effects" - -include(":androidApp") -include(":shared") -include(":desktopApp") diff --git a/examples/visual-effects/shared/build.gradle.kts b/examples/visual-effects/shared/build.gradle.kts deleted file mode 100644 index aa74c786165..00000000000 --- a/examples/visual-effects/shared/build.gradle.kts +++ /dev/null @@ -1,80 +0,0 @@ -plugins { - kotlin("multiplatform") - id("com.android.library") - id("org.jetbrains.compose") -} - -version = "1.0-SNAPSHOT" - -kotlin { - androidTarget() - - jvm("desktop") - - listOf( - iosX64(), - iosArm64(), - iosSimulatorArm64() - ).forEach { iosTarget -> - iosTarget.binaries.framework { - baseName = "shared" - isStatic = true - } - } - - sourceSets { - val commonMain by getting { - dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material) - implementation(compose.materialIconsExtended) - @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) - implementation(compose.components.resources) - } - } - val androidMain by getting { - dependencies { - api("androidx.activity:activity-compose:1.7.2") - api("androidx.appcompat:appcompat:1.6.1") - api("androidx.core:core-ktx:1.10.1") - } - } - val iosMain by creating { - dependsOn(commonMain) - } - val iosX64Main by getting { - dependsOn(iosMain) - } - val iosArm64Main by getting { - dependsOn(iosMain) - } - val iosSimulatorArm64Main by getting { - dependsOn(iosMain) - } - val desktopMain by getting { - dependencies { - implementation(compose.desktop.common) - } - } - } -} - -android { - compileSdk = 34 - namespace = "org.jetbrains.visualeffects" - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - sourceSets["main"].resources.srcDirs("src/commonMain/resources") - - defaultConfig { - minSdk = 26 - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - jvmToolchain(17) - } -} diff --git a/examples/visual-effects/shared/src/androidMain/AndroidManifest.xml b/examples/visual-effects/shared/src/androidMain/AndroidManifest.xml deleted file mode 100644 index de749acb75f..00000000000 --- a/examples/visual-effects/shared/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/examples/visual-effects/shared/src/androidMain/kotlin/main.android.kt b/examples/visual-effects/shared/src/androidMain/kotlin/main.android.kt deleted file mode 100644 index 137c31e24a1..00000000000 --- a/examples/visual-effects/shared/src/androidMain/kotlin/main.android.kt +++ /dev/null @@ -1,5 +0,0 @@ -import androidx.compose.runtime.Composable -import org.jetbrains.compose.demo.visuals.AllSamplesView - -@Composable -fun MainView() = AllSamplesView() \ No newline at end of file diff --git a/examples/visual-effects/shared/src/androidMain/kotlin/platform/NanoTime.kt b/examples/visual-effects/shared/src/androidMain/kotlin/platform/NanoTime.kt deleted file mode 100644 index ebfd7e4ac62..00000000000 --- a/examples/visual-effects/shared/src/androidMain/kotlin/platform/NanoTime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.compose.demo.visuals.platform - -actual fun nanoTime(): Long = System.nanoTime() \ No newline at end of file diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/AllSamlesView.kt b/examples/visual-effects/shared/src/commonMain/kotlin/AllSamlesView.kt deleted file mode 100644 index f9748e02e30..00000000000 --- a/examples/visual-effects/shared/src/commonMain/kotlin/AllSamlesView.kt +++ /dev/null @@ -1,90 +0,0 @@ -package org.jetbrains.compose.demo.visuals - -import androidx.compose.foundation.layout.* -import androidx.compose.material.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun SampleWithTopAppBar(sample: Screen, state: MutableState, content: @Composable (PaddingValues) -> Unit) { - Box(modifier = Modifier.fillMaxSize()) { - Scaffold( - topBar = { - TopAppBar( - title = { Text(text = sample.screen) }, - navigationIcon = - { - IconButton(onClick = {state.value = Screen.CHOOSE_SAMPLE}) { - Icon( - imageVector = Icons.Filled.ArrowBack, - contentDescription = "Back" - ) - } - } - ) - }, - content = content - ) - } -} - -enum class Screen(val screen: String) { - CHOOSE_SAMPLE("Choose a demo:"), - WORDS("Rotating Words"), - WAVE("Wave Effect"), - NY("Happy New Year!"); -} - -@Composable -fun MyButton(screenState: MutableState, to: Screen) { - Button(onClick = { - screenState.value = to - }) { - Text(fontSize = 20.sp, text = to.screen) - } -} - -@Composable -fun AllSamplesView() { - MaterialTheme { - val screenState: MutableState = remember { mutableStateOf(Screen.CHOOSE_SAMPLE) } - when (screenState.value) { - Screen.CHOOSE_SAMPLE -> { - Column(modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally) - { - Text(modifier = Modifier.padding(10.dp), fontSize = 30.sp, text = Screen.CHOOSE_SAMPLE.screen) - MyButton(screenState, Screen.WORDS) - MyButton(screenState, Screen.WAVE) - MyButton(screenState, Screen.NY) - } - } - - Screen.WORDS -> { - SampleWithTopAppBar(Screen.WORDS, screenState) { - RotatingWords() - } - } - Screen.WAVE -> { - SampleWithTopAppBar(Screen.WAVE, screenState) { - WaveEffectGrid() - } - } - - Screen.NY -> { - SampleWithTopAppBar(Screen.NY, screenState) { - NYContent() - } - } - } - } -} diff --git a/examples/visual-effects/shared/src/commonMain/kotlin/platform/NanoTime.kt b/examples/visual-effects/shared/src/commonMain/kotlin/platform/NanoTime.kt deleted file mode 100644 index 0fc90a38cae..00000000000 --- a/examples/visual-effects/shared/src/commonMain/kotlin/platform/NanoTime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.compose.demo.visuals.platform - -expect fun nanoTime(): Long \ No newline at end of file diff --git a/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.png b/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.png deleted file mode 100644 index a73ddd79899482e2f1252de2a3e9d4b8225f140b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17662 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 diff --git a/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.svg b/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.svg deleted file mode 100644 index 3e5ce57f729..00000000000 --- a/examples/visual-effects/shared/src/commonMain/resources/compose-community-primary.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - diff --git a/examples/visual-effects/shared/src/desktopMain/kotlin/WaveSettings.kt b/examples/visual-effects/shared/src/desktopMain/kotlin/WaveSettings.kt deleted file mode 100644 index fcb552987e4..00000000000 --- a/examples/visual-effects/shared/src/desktopMain/kotlin/WaveSettings.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.demo.visuals - -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.width -import androidx.compose.material.Checkbox -import androidx.compose.material.Slider -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp - -internal class ColorSettings { - var enabled by mutableStateOf(true) - var waveLength by mutableStateOf(30.0) - var simple by mutableStateOf(true) - var period by mutableStateOf(80.0) -} - -internal class SettingsState { - companion object { - var red by mutableStateOf(ColorSettings()) - var green by mutableStateOf(ColorSettings()) - var blue by mutableStateOf(ColorSettings()) - } -} - -@Composable -internal fun SettingsPanel(settings: ColorSettings, name: String) { - Row { - Text(name) - Checkbox(settings.enabled, onCheckedChange = { settings.enabled = it }) - Checkbox(settings.simple, onCheckedChange = { settings.simple = it }) - Slider( - (settings.waveLength.toFloat() - 10) / 90, - { settings.waveLength = 10 + 90 * it.toDouble() }, - Modifier.width(100.dp) - ) - Slider( - (settings.period.toFloat() - 10) / 90, - { settings.period = 10 + 90 * it.toDouble() }, - Modifier.width(100.dp) - ) - } -} diff --git a/examples/visual-effects/shared/src/desktopMain/kotlin/main.desktop.kt b/examples/visual-effects/shared/src/desktopMain/kotlin/main.desktop.kt deleted file mode 100644 index 8861ae7ddb3..00000000000 --- a/examples/visual-effects/shared/src/desktopMain/kotlin/main.desktop.kt +++ /dev/null @@ -1,59 +0,0 @@ -package org.jetbrains.compose.demo.visuals - -import androidx.compose.foundation.layout.Column -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.unit.DpSize -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.* - -fun mainWords() = singleWindowApplication( - title = "Compose Demo", state = WindowState(size = DpSize(830.dp, 830.dp)) -) { - RotatingWords() -} - -@Composable -fun WaveEffect(onCloseRequest: () -> Unit, showControls: Boolean) { - val windowState = remember { WindowState(width = 1200.dp, height = 800.dp) } - Window(onCloseRequest = {}, undecorated = true, transparent = true, state = windowState) { - WaveEffectGrid() - } - - if (showControls) { - Window( - onCloseRequest = onCloseRequest, - state = WindowState(width = 200.dp, height = 400.dp, position = WindowPosition(1400.dp, 200.dp)) - ) { - Column { - SettingsPanel(SettingsState.red, "Red") - SettingsPanel(SettingsState.green, "Green") - SettingsPanel(SettingsState.blue, "Blue") - } - } - } -} - -fun mainWave(controls: Boolean) = application { - WaveEffect(::exitApplication, controls) -} - -@Composable -fun NYWindow(onCloseRequest: () -> Unit) { - val windowState = remember { WindowState(width = width.dp, height = height.dp) } - Window(onCloseRequest = onCloseRequest, undecorated = true, transparent = true, state = windowState) { - NYContent() - } -} - -fun mainNY() = application { - NYWindow(::exitApplication) -} - - -fun allSamples() = application { - val windowState = remember { WindowState(width = 1200.dp, height = 900.dp) } - Window(onCloseRequest = ::exitApplication, title = "Visual effects", undecorated = false, transparent = false, state = windowState) { - AllSamplesView() - } -} diff --git a/examples/visual-effects/shared/src/desktopMain/kotlin/platform/NanoTime.kt b/examples/visual-effects/shared/src/desktopMain/kotlin/platform/NanoTime.kt deleted file mode 100644 index ebfd7e4ac62..00000000000 --- a/examples/visual-effects/shared/src/desktopMain/kotlin/platform/NanoTime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.compose.demo.visuals.platform - -actual fun nanoTime(): Long = System.nanoTime() \ No newline at end of file diff --git a/examples/visual-effects/shared/src/iosMain/kotlin/main.ios.kt b/examples/visual-effects/shared/src/iosMain/kotlin/main.ios.kt deleted file mode 100644 index c8004b488b0..00000000000 --- a/examples/visual-effects/shared/src/iosMain/kotlin/main.ios.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -import androidx.compose.ui.window.ComposeUIViewController -import org.jetbrains.compose.demo.visuals.AllSamplesView -import platform.UIKit.UIViewController - -fun MainViewController() : UIViewController = ComposeUIViewController { AllSamplesView() } diff --git a/examples/visual-effects/shared/src/iosMain/kotlin/platform/NanoTime.kt b/examples/visual-effects/shared/src/iosMain/kotlin/platform/NanoTime.kt deleted file mode 100644 index 334c22b7817..00000000000 --- a/examples/visual-effects/shared/src/iosMain/kotlin/platform/NanoTime.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.jetbrains.compose.demo.visuals.platform - -actual fun nanoTime(): Long = kotlin.system.getTimeNanos() \ No newline at end of file From cd45caaf5e0efe36dbcc3c46f25865a127de0575 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Tue, 10 Oct 2023 21:31:32 +0200 Subject: [PATCH 09/11] Update `Dialog` usages in tutorial (#3798) Update tutorial after [renaming](https://github.com/JetBrains/compose-multiplatform-core/pull/661) --- tutorials/Window_API_new/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tutorials/Window_API_new/README.md b/tutorials/Window_API_new/README.md index ffe0b42b057..497998ff8c7 100644 --- a/tutorials/Window_API_new/README.md +++ b/tutorials/Window_API_new/README.md @@ -94,7 +94,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogWindow import androidx.compose.ui.window.Window import androidx.compose.ui.window.application @@ -107,7 +107,7 @@ fun main() = application { onCloseRequest = { isAskingToClose = true } ) { if (isAskingToClose) { - Dialog( + DialogWindow( onCloseRequest = { isAskingToClose = false }, title = "Close the document without saving?", ) { @@ -432,8 +432,8 @@ private fun onWindowRelocate(position: WindowPosition) { ## Dialogs There are two types of window – modal and regular. Below are the functions for creating each: -1. Window – regular window type. -2. Dialog – modal window type. This type locks its parent window until the user is finished working with it and closes the modal window. +1. `Window` – regular window type. +2. `DialogWindow` – modal window type. This type locks its parent window until the user is finished working with it and closes the modal window. You can see an example of both types of window below. @@ -445,7 +445,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment -import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogWindow import androidx.compose.ui.window.Window import androidx.compose.ui.window.WindowPosition import androidx.compose.ui.window.application @@ -462,7 +462,7 @@ fun main() = application { } if (isDialogOpen) { - Dialog( + DialogWindow( onCloseRequest = { isDialogOpen = false }, state = rememberDialogState(position = WindowPosition(Alignment.Center)) ) { @@ -584,7 +584,7 @@ fun main() = application { } } ``` -Note that `WindowDraggableArea` can be used only inside `singleWindowApplication`, `Window` and `Dialog`. If you need to use it in another Composable function, pass `WindowScope` as a receiver there: +Note that `WindowDraggableArea` can be used only inside `singleWindowApplication`, `Window` and `DialogWindow`. If you need to use it in another Composable function, pass `WindowScope` as a receiver there: ```kotlin import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box From acbfd5d39941c2023bca8de9244063dc1ccc5bc3 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Wed, 11 Oct 2023 14:38:46 +0400 Subject: [PATCH 10/11] Add graphics-2d to validateExamples.sh (#3802) --- examples/validateExamples.sh | 3 +-- examples/validateExamplesAndroid.sh | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/validateExamples.sh b/examples/validateExamples.sh index 6925f607d02..085bd4e5f0b 100755 --- a/examples/validateExamples.sh +++ b/examples/validateExamples.sh @@ -25,6 +25,5 @@ runGradle imageviewer packageDistributionForCurrentOS runGradle issues packageDistributionForCurrentOS runGradle notepad packageDistributionForCurrentOS runGradle todoapp-lite packageDistributionForCurrentOS -runGradle minesweeper packageDistributionForCurrentOS -runGradle visual-effects packageDistributionForCurrentOS +runGradle graphics-2d packageDistributionForCurrentOS runGradle widgets-gallery packageDistributionForCurrentOS diff --git a/examples/validateExamplesAndroid.sh b/examples/validateExamplesAndroid.sh index 24d077f496f..c7a581a6574 100644 --- a/examples/validateExamplesAndroid.sh +++ b/examples/validateExamplesAndroid.sh @@ -24,7 +24,7 @@ runGradle chat installDebug runGradle codeviewer installDebug runGradle imageviewer installDebug runGradle issues installDebug -runGradle minesweeper installDebug +runGradle graphics-2d installDebug runGradle todoapp-lite installDebug runGradle widgets-gallery installDebug runGradle todoapp installDebug From b112e0865d5020d0be341e856a8baa36ed807393 Mon Sep 17 00:00:00 2001 From: Oleksandr Karpovich Date: Wed, 11 Oct 2023 14:19:23 +0200 Subject: [PATCH 11/11] Support kotlin 1.9.20-RC (#3804) --- .../org/jetbrains/compose/ComposeCompilerCompatibility.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerCompatibility.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerCompatibility.kt index 9ef6c357d9b..73b694b91a3 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerCompatibility.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/ComposeCompilerCompatibility.kt @@ -17,7 +17,8 @@ internal object ComposeCompilerCompatibility { "1.9.0" to "1.5.1", "1.9.10" to "1.5.2", "1.9.20-Beta" to "1.5.2.1-Beta2", - "1.9.20-Beta2" to "1.5.2.1-Beta3" + "1.9.20-Beta2" to "1.5.2.1-Beta3", + "1.9.20-RC" to "1.5.2.1-rc01", ) fun compilerVersionFor(kotlinVersion: String): String {