From a208ecba7341e206fec64cede27aac008a2dd689 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Fri, 30 Sep 2022 19:26:10 +0200 Subject: [PATCH 01/26] Upgrade to 1.2.0-beta01 --- ci/compose-uber-jar/gradle.properties | 2 +- components/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- .../gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/todoapp/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/web-compose-bird/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- gradle-plugins/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 2 +- .../multiplatform-template/gradle.properties | 2 +- templates/web-template/gradle.properties | 2 +- tools/{replace.sh => replaceVersion.sh} | 0 tutorials/Getting_Started/README.md | 4 +- .../Image_And_Icons_Manipulations/README.md | 626 +++++++++--------- tutorials/Web/Getting_Started/README.md | 2 +- web/gradle.properties | 4 +- 25 files changed, 338 insertions(+), 338 deletions(-) rename tools/{replace.sh => replaceVersion.sh} (100%) mode change 100755 => 100644 diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 03b9d463c9..e1ffd26e7f 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.1.0 +compose.version=1.2.0-beta01 kotlin.code.style=official diff --git a/components/gradle.properties b/components/gradle.properties index 8fb205f495..32b977f6ec 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -5,4 +5,4 @@ kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ kotlin.version=1.6.10 # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 6849fa0b48..0138e3e222 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index 9bb8d52f7d..b2088a7936 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 6849fa0b48..0138e3e222 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties index bf812e078f..30ecbccfb6 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties +++ b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index 9bb8d52f7d..b2088a7936 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 242c14d70f..085bd89169 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -21,4 +21,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index 654c3e3d5f..69de234bdd 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.6.10 -compose.version=1.1.0 \ No newline at end of file +compose.version=1.2.0-beta01 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 6849fa0b48..0138e3e222 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index b8b81092a6..8cbedcaab2 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -25,4 +25,4 @@ kotlin.native.disableCompilerDaemon=true #todo remove -Pkotlin.version=1.6.20 from Xcode project, when stable version on Compose with Koltin 1.6.20 or later released kotlin.version=1.6.10 -compose.version=1.1.0 \ No newline at end of file +compose.version=1.2.0-beta01 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index 9bb8d52f7d..b2088a7936 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index 2e1d6a4d40..34ea8f9ae0 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index 9bb8d52f7d..b2088a7936 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index 9bb8d52f7d..b2088a7936 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index a960629879..83dde7351b 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 agp.version=7.0.4 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index 4ecce17018..0bdfa2f2af 100644 --- a/gradle-plugins/gradle.properties +++ b/gradle-plugins/gradle.properties @@ -6,7 +6,7 @@ kotlin.code.style=official # unless overridden by COMPOSE_GRADLE_PLUGIN_COMPOSE_VERSION env var. # # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-alpha01-dev774 +compose.version=1.2.0-beta01 compose.compiler.version=1.3.0-alpha01 diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index 5679ab5bab..ebf7b99bee 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index c0554eeeca..eebc300cba 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -4,4 +4,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index 5679ab5bab..ebf7b99bee 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.1.0 +compose.version=1.2.0-beta01 diff --git a/tools/replace.sh b/tools/replaceVersion.sh old mode 100755 new mode 100644 similarity index 100% rename from tools/replace.sh rename to tools/replaceVersion.sh diff --git a/tutorials/Getting_Started/README.md b/tutorials/Getting_Started/README.md index 7657d5f426..88b9f02621 100644 --- a/tutorials/Getting_Started/README.md +++ b/tutorials/Getting_Started/README.md @@ -45,7 +45,7 @@ For the latest versions, see the [latest versions](https://github.com/JetBrains/ ``` plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.1.0" + id("org.jetbrains.compose") version "1.2.0-beta01" } ``` @@ -81,7 +81,7 @@ import org.jetbrains.compose.compose plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.1.0" + id("org.jetbrains.compose") version "1.2.0-beta01" } repositories { diff --git a/tutorials/Image_And_Icons_Manipulations/README.md b/tutorials/Image_And_Icons_Manipulations/README.md index 653db7a3e0..227fa791b9 100755 --- a/tutorials/Image_And_Icons_Manipulations/README.md +++ b/tutorials/Image_And_Icons_Manipulations/README.md @@ -1,313 +1,313 @@ -# Image and in-app icons manipulations - -## What is covered - -In this tutorial we will show you how to work with images using Compose for Desktop. - -## Loading images from resources - -Using images from application resources is very simple. Suppose we have a PNG image that is placed in the `resources` directory in our project. For this tutorial we will use the image sample: - -Sample - -```kotlin -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.singleWindowApplication - -fun main() = singleWindowApplication { - Image( - painter = painterResource("sample.png"), - contentDescription = "Sample", - modifier = Modifier.fillMaxSize() - ) -} -``` - -`painterResource` supports raster (BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP) and vector formats (SVG, [XML vector drawable](https://developer.android.com/guide/topics/graphics/vector-drawable-resources)). - -Resources - -## Loading images from device storage or network asynchronously - -To load an image stored in the device memory (or from network) you can use `loadImageBitmap`, `loadSvgPainter` or `loadXmlImageVector`. The example below shows how to use them to load an image asynchronously. - -```kotlin -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.width -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.produceState -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.loadImageBitmap -import androidx.compose.ui.res.loadSvgPainter -import androidx.compose.ui.res.loadXmlImageVector -import androidx.compose.ui.unit.Density -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.singleWindowApplication -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import org.xml.sax.InputSource -import java.io.File -import java.io.IOException -import java.net.URL - -fun main() = singleWindowApplication { - val density = LocalDensity.current - Column { - AsyncImage( - load = { loadImageBitmap(File("sample.png")) }, - painterFor = { remember { BitmapPainter(it) } }, - contentDescription = "Sample", - modifier = Modifier.width(200.dp) - ) - AsyncImage( - load = { loadSvgPainter("https://github.com/JetBrains/compose-jb/raw/master/artwork/idea-logo.svg", density) }, - painterFor = { it }, - contentDescription = "Idea logo", - contentScale = ContentScale.FillWidth, - modifier = Modifier.width(200.dp) - ) - AsyncImage( - load = { loadXmlImageVector(File("compose-logo.xml"), density) }, - painterFor = { rememberVectorPainter(it) }, - contentDescription = "Compose logo", - contentScale = ContentScale.FillWidth, - modifier = Modifier.width(200.dp) - ) - } -} - -@Composable -fun AsyncImage( - load: suspend () -> T, - painterFor: @Composable (T) -> Painter, - contentDescription: String, - modifier: Modifier = Modifier, - contentScale: ContentScale = ContentScale.Fit, -) { - val image: T? by produceState(null) { - value = withContext(Dispatchers.IO) { - try { - load() - } catch (e: IOException) { - // instead of printing to console, you can also write this to log, - // or show some error placeholder - e.printStackTrace() - null - } - } - } - - if (image != null) { - Image( - painter = painterFor(image!!), - contentDescription = contentDescription, - contentScale = contentScale, - modifier = modifier - ) - } -} - -/* Loading from file with java.io API */ - -fun loadImageBitmap(file: File): ImageBitmap = - file.inputStream().buffered().use(::loadImageBitmap) - -fun loadSvgPainter(file: File, density: Density): Painter = - file.inputStream().buffered().use { loadSvgPainter(it, density) } - -fun loadXmlImageVector(file: File, density: Density): ImageVector = - file.inputStream().buffered().use { loadXmlImageVector(InputSource(it), density) } - -/* Loading from network with java.net API */ - -fun loadImageBitmap(url: String): ImageBitmap = - URL(url).openStream().buffered().use(::loadImageBitmap) - -fun loadSvgPainter(url: String, density: Density): Painter = - URL(url).openStream().buffered().use { loadSvgPainter(it, density) } - -fun loadXmlImageVector(url: String, density: Density): ImageVector = - URL(url).openStream().buffered().use { loadXmlImageVector(InputSource(it), density) } - -/* Loading from network with Ktor client API (https://ktor.io/docs/client.html). */ - -/* - -suspend fun loadImageBitmap(url: String): ImageBitmap = - urlStream(url).use(::loadImageBitmap) - -suspend fun loadSvgPainter(url: String, density: Density): Painter = - urlStream(url).use { loadSvgPainter(it, density) } - -suspend fun loadXmlImageVector(url: String, density: Density): ImageVector = - urlStream(url).use { loadXmlImageVector(InputSource(it), density) } - -@OptIn(KtorExperimentalAPI::class) -private suspend fun urlStream(url: String) = HttpClient(CIO).use { - ByteArrayInputStream(it.get(url)) -} - - */ -``` - -Storage - -[PNG](sample.png) - -[SVG](../../artwork/idea-logo.svg) - -[XML vector drawable](../../artwork/compose-logo.xml) - -## Drawing images using Canvas -```kotlin -import androidx.compose.foundation.Canvas -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.geometry.Size -import androidx.compose.ui.graphics.Paint -import androidx.compose.ui.graphics.drawscope.drawIntoCanvas -import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.graphics.withSave -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.loadImageBitmap -import androidx.compose.ui.res.loadSvgPainter -import androidx.compose.ui.res.loadXmlImageVector -import androidx.compose.ui.res.useResource -import androidx.compose.ui.window.singleWindowApplication -import org.xml.sax.InputSource - -fun main() = singleWindowApplication { - val density = LocalDensity.current // to calculate the intrinsic size of vector images (SVG, XML) - - val sample = remember { - useResource("sample.png", ::loadImageBitmap) - } - val ideaLogo = remember { - useResource("idea-logo.svg") { loadSvgPainter(it, density) } - } - val composeLogo = rememberVectorPainter( - remember { - useResource("compose-logo.xml") { loadXmlImageVector(InputSource(it), density) } - } - ) - - Canvas( - modifier = Modifier.fillMaxSize() - ) { - drawIntoCanvas { canvas -> - canvas.withSave { - canvas.drawImage(sample, Offset.Zero, Paint()) - canvas.translate(sample.width.toFloat(), 0f) - with(ideaLogo) { - draw(ideaLogo.intrinsicSize) - } - canvas.translate(ideaLogo.intrinsicSize.width, 0f) - with(composeLogo) { - draw(Size(100f, 100f)) - } - } - } - } -} -``` - -[PNG](sample.png) - -[SVG](../../artwork/idea-logo.svg) - -[XML vector drawable](../../artwork/compose-logo.xml) - -## Setting the application window icon - -You can set the icon for the window via parameter in the `Window` function. - -Note that to change the icon on the taskbar on some OS (macOs), you should change icon in [build.gradle](/tutorials/Native_distributions_and_local_execution#app-icon) - -```kotlin -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.paint -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application - -fun main() = application { - val icon = painterResource("sample.png") - Window( - onCloseRequest = ::exitApplication, - icon = icon - ) { - Box(Modifier.paint(icon).fillMaxSize()) - } -} -``` - -Window icon - -In case of `singleWindowApplication` usage, you can use the following approach: - -```kotlin -import androidx.compose.material.Text -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.res.loadImageBitmap -import androidx.compose.ui.res.useResource -import androidx.compose.ui.window.singleWindowApplication - -fun main() { - val icon = BitmapPainter(useResource("sample.png", ::loadImageBitmap)) - singleWindowApplication(icon = icon) { - Text("Hello World!") - } -} -``` - -## Setting the application tray icon - -You can create a tray icon for your application: - -```kotlin -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.Tray -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application - -fun main() = application { - val icon = painterResource("sample.png") - - Tray( - icon = icon, - menu = { - Item("Quit App", onClick = ::exitApplication) - } - ) - - Window(onCloseRequest = ::exitApplication, icon = icon) { - Image( - painter = icon, - contentDescription = "Icon", - modifier = Modifier.fillMaxSize() - ) - } -} -``` - -Tray icon +# Image and in-app icons manipulations + +## What is covered + +In this tutorial we will show you how to work with images using Compose for Desktop. + +## Loading images from resources + +Using images from application resources is very simple. Suppose we have a PNG image that is placed in the `resources` directory in our project. For this tutorial we will use the image sample: + +Sample + +```kotlin +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.window.singleWindowApplication + +fun main() = singleWindowApplication { + Image( + painter = painterResource("sample.png"), + contentDescription = "Sample", + modifier = Modifier.fillMaxSize() + ) +} +``` + +`painterResource` supports raster (BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP) and vector formats (SVG, [XML vector drawable](https://developer.android.com/guide/topics/graphics/vector-drawable-resources)). + +Resources + +## Loading images from device storage or network asynchronously + +To load an image stored in the device memory (or from network) you can use `loadImageBitmap`, `loadSvgPainter` or `loadXmlImageVector`. The example below shows how to use them to load an image asynchronously. + +```kotlin +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.loadImageBitmap +import androidx.compose.ui.res.loadSvgPainter +import androidx.compose.ui.res.loadXmlImageVector +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.singleWindowApplication +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.xml.sax.InputSource +import java.io.File +import java.io.IOException +import java.net.URL + +fun main() = singleWindowApplication { + val density = LocalDensity.current + Column { + AsyncImage( + load = { loadImageBitmap(File("sample.png")) }, + painterFor = { remember { BitmapPainter(it) } }, + contentDescription = "Sample", + modifier = Modifier.width(200.dp) + ) + AsyncImage( + load = { loadSvgPainter("https://github.com/JetBrains/compose-jb/raw/master/artwork/idea-logo.svg", density) }, + painterFor = { it }, + contentDescription = "Idea logo", + contentScale = ContentScale.FillWidth, + modifier = Modifier.width(200.dp) + ) + AsyncImage( + load = { loadXmlImageVector(File("compose-logo.xml"), density) }, + painterFor = { rememberVectorPainter(it) }, + contentDescription = "Compose logo", + contentScale = ContentScale.FillWidth, + modifier = Modifier.width(200.dp) + ) + } +} + +@Composable +fun AsyncImage( + load: suspend () -> T, + painterFor: @Composable (T) -> Painter, + contentDescription: String, + modifier: Modifier = Modifier, + contentScale: ContentScale = ContentScale.Fit, +) { + val image: T? by produceState(null) { + value = withContext(Dispatchers.IO) { + try { + load() + } catch (e: IOException) { + // instead of printing to console, you can also write this to log, + // or show some error placeholder + e.printStackTrace() + null + } + } + } + + if (image != null) { + Image( + painter = painterFor(image!!), + contentDescription = contentDescription, + contentScale = contentScale, + modifier = modifier + ) + } +} + +/* Loading from file with java.io API */ + +fun loadImageBitmap(file: File): ImageBitmap = + file.inputStream().buffered().use(::loadImageBitmap) + +fun loadSvgPainter(file: File, density: Density): Painter = + file.inputStream().buffered().use { loadSvgPainter(it, density) } + +fun loadXmlImageVector(file: File, density: Density): ImageVector = + file.inputStream().buffered().use { loadXmlImageVector(InputSource(it), density) } + +/* Loading from network with java.net API */ + +fun loadImageBitmap(url: String): ImageBitmap = + URL(url).openStream().buffered().use(::loadImageBitmap) + +fun loadSvgPainter(url: String, density: Density): Painter = + URL(url).openStream().buffered().use { loadSvgPainter(it, density) } + +fun loadXmlImageVector(url: String, density: Density): ImageVector = + URL(url).openStream().buffered().use { loadXmlImageVector(InputSource(it), density) } + +/* Loading from network with Ktor client API (https://ktor.io/docs/client.html). */ + +/* + +suspend fun loadImageBitmap(url: String): ImageBitmap = + urlStream(url).use(::loadImageBitmap) + +suspend fun loadSvgPainter(url: String, density: Density): Painter = + urlStream(url).use { loadSvgPainter(it, density) } + +suspend fun loadXmlImageVector(url: String, density: Density): ImageVector = + urlStream(url).use { loadXmlImageVector(InputSource(it), density) } + +@OptIn(KtorExperimentalAPI::class) +private suspend fun urlStream(url: String) = HttpClient(CIO).use { + ByteArrayInputStream(it.get(url)) +} + + */ +``` + +Storage + +[PNG](sample.png) + +[SVG](../../artwork/idea-logo.svg) + +[XML vector drawable](../../artwork/compose-logo.xml) + +## Drawing images using Canvas +```kotlin +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Paint +import androidx.compose.ui.graphics.drawscope.drawIntoCanvas +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.graphics.withSave +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.loadImageBitmap +import androidx.compose.ui.res.loadSvgPainter +import androidx.compose.ui.res.loadXmlImageVector +import androidx.compose.ui.res.useResource +import androidx.compose.ui.window.singleWindowApplication +import org.xml.sax.InputSource + +fun main() = singleWindowApplication { + val density = LocalDensity.current // to calculate the intrinsic size of vector images (SVG, XML) + + val sample = remember { + useResource("sample.png", ::loadImageBitmap) + } + val ideaLogo = remember { + useResource("idea-logo.svg") { loadSvgPainter(it, density) } + } + val composeLogo = rememberVectorPainter( + remember { + useResource("compose-logo.xml") { loadXmlImageVector(InputSource(it), density) } + } + ) + + Canvas( + modifier = Modifier.fillMaxSize() + ) { + drawIntoCanvas { canvas -> + canvas.withSave { + canvas.drawImage(sample, Offset.Zero, Paint()) + canvas.translate(sample.width.toFloat(), 0f) + with(ideaLogo) { + draw(ideaLogo.intrinsicSize) + } + canvas.translate(ideaLogo.intrinsicSize.width, 0f) + with(composeLogo) { + draw(Size(100f, 100f)) + } + } + } + } +} +``` + +[PNG](sample.png) + +[SVG](../../artwork/idea-logo.svg) + +[XML vector drawable](../../artwork/compose-logo.xml) + +## Setting the application window icon + +You can set the icon for the window via parameter in the `Window` function. + +Note that to change the icon on the taskbar on some OS (macOs), you should change icon in [build.gradle](/tutorials/Native_distributions_and_local_execution#app-icon) + +```kotlin +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.paint +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application + +fun main() = application { + val icon = painterResource("sample.png") + Window( + onCloseRequest = ::exitApplication, + icon = icon + ) { + Box(Modifier.paint(icon).fillMaxSize()) + } +} +``` + +Window icon + +In case of `singleWindowApplication` usage, you can use the following approach: + +```kotlin +import androidx.compose.material.Text +import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.res.loadImageBitmap +import androidx.compose.ui.res.useResource +import androidx.compose.ui.window.singleWindowApplication + +fun main() { + val icon = BitmapPainter(useResource("sample.png", ::loadImageBitmap)) + singleWindowApplication(icon = icon) { + Text("Hello World!") + } +} +``` + +## Setting the application tray icon + +You can create a tray icon for your application: + +```kotlin +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.window.Tray +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application + +fun main() = application { + val icon = painterResource("sample.png") + + Tray( + icon = icon, + menu = { + Item("Quit App", onClick = ::exitApplication) + } + ) + + Window(onCloseRequest = ::exitApplication, icon = icon) { + Image( + painter = icon, + contentDescription = "Icon", + modifier = Modifier.fillMaxSize() + ) + } +} +``` + +Tray icon diff --git a/tutorials/Web/Getting_Started/README.md b/tutorials/Web/Getting_Started/README.md index be90390b33..8ffba1bb35 100644 --- a/tutorials/Web/Getting_Started/README.md +++ b/tutorials/Web/Getting_Started/README.md @@ -39,7 +39,7 @@ pluginManagement { // Add compose gradle plugin plugins { kotlin("multiplatform") version "1.6.10" - id("org.jetbrains.compose") version "1.1.0" + id("org.jetbrains.compose") version "1.2.0-beta01" } // Add maven repositories diff --git a/web/gradle.properties b/web/gradle.properties index 18004c5d53..89ae2bff65 100644 --- a/web/gradle.properties +++ b/web/gradle.properties @@ -1,5 +1,5 @@ -COMPOSE_CORE_VERSION=1.1.0 -COMPOSE_WEB_VERSION=1.1.0 +COMPOSE_CORE_VERSION=1.2.0-beta01 +COMPOSE_WEB_VERSION=1.2.0-beta01 compose.web.buildSamples=false compose.web.tests.integration.withFirefox compose.web.tests.skip.benchmarks=false From 9fa322a3eeab69dae1033d3a04e98644d1b93b71 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 3 Oct 2022 01:51:23 +0200 Subject: [PATCH 02/26] Upgrade to 1.2.0-beta02 --- ci/compose-uber-jar/gradle.properties | 2 +- components/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- .../gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/todoapp/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/web-compose-bird/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- gradle-plugins/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 2 +- templates/multiplatform-template/gradle.properties | 2 +- templates/web-template/gradle.properties | 2 +- tutorials/Getting_Started/README.md | 4 ++-- tutorials/Web/Getting_Started/README.md | 2 +- web/gradle.properties | 4 ++-- 23 files changed, 25 insertions(+), 25 deletions(-) diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index e1ffd26e7f..293f8c3ab2 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 kotlin.code.style=official diff --git a/components/gradle.properties b/components/gradle.properties index 32b977f6ec..69d9b2497f 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -5,4 +5,4 @@ kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ kotlin.version=1.6.10 # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 0138e3e222..d44da6245d 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index b2088a7936..9320ccb803 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 0138e3e222..d44da6245d 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties index 30ecbccfb6..fb5fd12f60 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties +++ b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index b2088a7936..9320ccb803 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 085bd89169..9e4cbc180a 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -21,4 +21,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index 69de234bdd..fbcbd8baf2 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.6.10 -compose.version=1.2.0-beta01 \ No newline at end of file +compose.version=1.2.0-beta02 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 0138e3e222..d44da6245d 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index 8cbedcaab2..0d0303ccf1 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -25,4 +25,4 @@ kotlin.native.disableCompilerDaemon=true #todo remove -Pkotlin.version=1.6.20 from Xcode project, when stable version on Compose with Koltin 1.6.20 or later released kotlin.version=1.6.10 -compose.version=1.2.0-beta01 \ No newline at end of file +compose.version=1.2.0-beta02 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index b2088a7936..9320ccb803 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index 34ea8f9ae0..e06e32b7ca 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index b2088a7936..9320ccb803 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index b2088a7936..9320ccb803 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 83dde7351b..0c37e53626 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 agp.version=7.0.4 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index 0bdfa2f2af..7444f15a10 100644 --- a/gradle-plugins/gradle.properties +++ b/gradle-plugins/gradle.properties @@ -6,7 +6,7 @@ kotlin.code.style=official # unless overridden by COMPOSE_GRADLE_PLUGIN_COMPOSE_VERSION env var. # # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 compose.compiler.version=1.3.0-alpha01 diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index ebf7b99bee..e5fe2224ff 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index eebc300cba..0bef9fedec 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -4,4 +4,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.6.10 agp.version=7.0.4 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index ebf7b99bee..e5fe2224ff 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.6.10 -compose.version=1.2.0-beta01 +compose.version=1.2.0-beta02 diff --git a/tutorials/Getting_Started/README.md b/tutorials/Getting_Started/README.md index 88b9f02621..8f4f07f526 100644 --- a/tutorials/Getting_Started/README.md +++ b/tutorials/Getting_Started/README.md @@ -45,7 +45,7 @@ For the latest versions, see the [latest versions](https://github.com/JetBrains/ ``` plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta01" + id("org.jetbrains.compose") version "1.2.0-beta02" } ``` @@ -81,7 +81,7 @@ import org.jetbrains.compose.compose plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta01" + id("org.jetbrains.compose") version "1.2.0-beta02" } repositories { diff --git a/tutorials/Web/Getting_Started/README.md b/tutorials/Web/Getting_Started/README.md index 8ffba1bb35..d93405c203 100644 --- a/tutorials/Web/Getting_Started/README.md +++ b/tutorials/Web/Getting_Started/README.md @@ -39,7 +39,7 @@ pluginManagement { // Add compose gradle plugin plugins { kotlin("multiplatform") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta01" + id("org.jetbrains.compose") version "1.2.0-beta02" } // Add maven repositories diff --git a/web/gradle.properties b/web/gradle.properties index 89ae2bff65..86be125a08 100644 --- a/web/gradle.properties +++ b/web/gradle.properties @@ -1,5 +1,5 @@ -COMPOSE_CORE_VERSION=1.2.0-beta01 -COMPOSE_WEB_VERSION=1.2.0-beta01 +COMPOSE_CORE_VERSION=1.2.0-beta02 +COMPOSE_WEB_VERSION=1.2.0-beta02 compose.web.buildSamples=false compose.web.tests.integration.withFirefox compose.web.tests.skip.benchmarks=false From 5d67a73f804b4304ae08befad66ecda6f847a242 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 3 Oct 2022 01:56:58 +0200 Subject: [PATCH 03/26] Update Kotlin version --- components/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- .../gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/todoapp/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/web-compose-bird/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 2 +- .../multiplatform-template/gradle.properties | 2 +- templates/web-template/gradle.properties | 2 +- tools/replaceVersion.sh | 36 +++++++++++-------- 19 files changed, 40 insertions(+), 32 deletions(-) diff --git a/components/gradle.properties b/components/gradle.properties index 69d9b2497f..2d1cbfc56e 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -3,6 +3,6 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ -kotlin.version=1.6.10 +kotlin.version=1.7.10 # __LATEST_COMPOSE_RELEASE_VERSION__ compose.version=1.2.0-beta02 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index d44da6245d..4e152adc88 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 agp.version=7.0.4 compose.version=1.2.0-beta02 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index 9320ccb803..d880388dbc 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index d44da6245d..4e152adc88 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 agp.version=7.0.4 compose.version=1.2.0-beta02 diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties index fb5fd12f60..68c9c73f4e 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties +++ b/examples/intellij-plugin-with-experimental-shared-base/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index 9320ccb803..d880388dbc 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 9e4cbc180a..1a47da5db3 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -19,6 +19,6 @@ kotlin.code.style=official android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -kotlin.version=1.6.10 +kotlin.version=1.7.10 agp.version=7.0.4 compose.version=1.2.0-beta02 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index fbcbd8baf2..be18f523d0 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.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index d44da6245d..4e152adc88 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 agp.version=7.0.4 compose.version=1.2.0-beta02 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index 0d0303ccf1..6f6c73b830 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -24,5 +24,5 @@ org.gradle.caching=true kotlin.native.disableCompilerDaemon=true #todo remove -Pkotlin.version=1.6.20 from Xcode project, when stable version on Compose with Koltin 1.6.20 or later released -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index 9320ccb803..d880388dbc 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index e06e32b7ca..54c4fa28f2 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,4 +1,4 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index 9320ccb803..d880388dbc 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index 9320ccb803..d880388dbc 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 0c37e53626..96e0eb201f 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 agp.version=7.0.4 diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index e5fe2224ff..ff18ff3858 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index 0bef9fedec..c3fa47e4a5 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -2,6 +2,6 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 agp.version=7.0.4 compose.version=1.2.0-beta02 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index e5fe2224ff..ff18ff3858 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.6.10 +kotlin.version=1.7.10 compose.version=1.2.0-beta02 diff --git a/tools/replaceVersion.sh b/tools/replaceVersion.sh index 46512a1c10..5b620083ea 100644 --- a/tools/replaceVersion.sh +++ b/tools/replaceVersion.sh @@ -15,11 +15,18 @@ declare -a folders=( "tutorials" ) -if [ -z "$@" ]; then -echo "Specify Compose version. For example: ./replace.sh 1.0.0-rc6" +if [ -z "$1" ]; then +echo "Specify Compose version. For example: ./replace.sh 1.2.0-beta02 1.7.10" exit 1 fi -COMPOSE_VERSION=$@ + +if [ -z "$2" ]; then +echo "Specify Kotlin version. For example: ./replace.sh 1.2.0-beta02 1.7.10" +exit 1 +fi + +COMPOSE_VERSION=$1 +KOTLIN_VERSION=$2 if [[ $OSTYPE == 'darwin'* ]]; then SED=gsed @@ -27,25 +34,26 @@ else SED=sed fi -replaceCompose() { +replaceVersion() { $SED -i -e "s/$1/$2/g" $3 } -replaceComposeInFile() { +replaceVersionInFile() { echo "Replace in $1" - replaceCompose '^compose.version=.*' 'compose.version='"$COMPOSE_VERSION"'' $1 - replaceCompose '^COMPOSE_CORE_VERSION=.*' 'COMPOSE_CORE_VERSION='"$COMPOSE_VERSION"'' $1 - replaceCompose '^COMPOSE_WEB_VERSION=.*' 'COMPOSE_WEB_VERSION='"$COMPOSE_VERSION"'' $1 - replaceCompose 'id("org.jetbrains.compose") version ".*"' 'id("org.jetbrains.compose") version "'"$COMPOSE_VERSION"'"' $1 - replaceCompose '"org.jetbrains.compose:compose-gradle-plugin:.*"' '"org.jetbrains.compose:compose-gradle-plugin:'"$COMPOSE_VERSION"'"' $1 + replaceVersion '^compose.version=.*' 'compose.version='"$COMPOSE_VERSION"'' $1 + replaceVersion '^COMPOSE_CORE_VERSION=.*' 'COMPOSE_CORE_VERSION='"$COMPOSE_VERSION"'' $1 + replaceVersion '^COMPOSE_WEB_VERSION=.*' 'COMPOSE_WEB_VERSION='"$COMPOSE_VERSION"'' $1 + replaceVersion 'id("org.jetbrains.compose") version ".*"' 'id("org.jetbrains.compose") version "'"$COMPOSE_VERSION"'"' $1 + replaceVersion '"org.jetbrains.compose:compose-gradle-plugin:.*"' '"org.jetbrains.compose:compose-gradle-plugin:'"$COMPOSE_VERSION"'"' $1 + replaceVersion '^kotlin.version=.*' 'kotlin.version='"$KOTLIN_VERSION"'' $1 } -replaceComposeInFolder() { - find $ROOT/$1 -wholename $2 -not -path "**/build**" -not -path "**/.gradle**" | while read file; do replaceComposeInFile "$file"; done +replaceVersionInFolder() { + find $ROOT/$1 -wholename $2 -not -path "**/build**" -not -path "**/.gradle**" | while read file; do replaceVersionInFile "$file"; done } for folder in "${folders[@]}" do - replaceComposeInFolder $folder "**gradle.properties" - replaceComposeInFolder $folder "**README.md" + replaceVersionInFolder $folder "**gradle.properties" + replaceVersionInFolder $folder "**README.md" done From 49e1065bb18041d1c1930e4d377c68de3c1b6011 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" <99798741+dima-avdeev-jb@users.noreply.github.com> Date: Mon, 3 Oct 2022 23:04:02 +0400 Subject: [PATCH 04/26] update gradle wrapper 7.5.1 (#2352) --- examples/codeviewer/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/falling-balls/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/imageviewer/gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../intellij-plugin/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/issues/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/notepad/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/todoapp-lite/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/todoapp/gradle/wrapper/gradle-wrapper.properties | 2 +- .../visual-effects/gradle/wrapper/gradle-wrapper.properties | 2 +- .../web-compose-bird/gradle/wrapper/gradle-wrapper.properties | 2 +- .../web-compose-in-js/gradle/wrapper/gradle-wrapper.properties | 2 +- examples/web-landing/gradle/wrapper/gradle-wrapper.properties | 2 +- .../web-with-react/gradle/wrapper/gradle-wrapper.properties | 2 +- .../widgets-gallery/gradle/wrapper/gradle-wrapper.properties | 2 +- .../examples/chat-mpp/gradle/wrapper/gradle-wrapper.properties | 2 +- .../falling-balls-mpp/gradle/wrapper/gradle-wrapper.properties | 2 +- .../minesweeper/gradle/wrapper/gradle-wrapper.properties | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/codeviewer/gradle/wrapper/gradle-wrapper.properties b/examples/codeviewer/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/codeviewer/gradle/wrapper/gradle-wrapper.properties +++ b/examples/codeviewer/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/falling-balls/gradle/wrapper/gradle-wrapper.properties b/examples/falling-balls/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/falling-balls/gradle/wrapper/gradle-wrapper.properties +++ b/examples/falling-balls/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/imageviewer/gradle/wrapper/gradle-wrapper.properties b/examples/imageviewer/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100755 --- a/examples/imageviewer/gradle/wrapper/gradle-wrapper.properties +++ b/examples/imageviewer/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties b/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties +++ b/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/intellij-plugin/gradle/wrapper/gradle-wrapper.properties b/examples/intellij-plugin/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/intellij-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/examples/intellij-plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/issues/gradle/wrapper/gradle-wrapper.properties b/examples/issues/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/issues/gradle/wrapper/gradle-wrapper.properties +++ b/examples/issues/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/notepad/gradle/wrapper/gradle-wrapper.properties b/examples/notepad/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/notepad/gradle/wrapper/gradle-wrapper.properties +++ b/examples/notepad/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/todoapp-lite/gradle/wrapper/gradle-wrapper.properties b/examples/todoapp-lite/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100755 --- a/examples/todoapp-lite/gradle/wrapper/gradle-wrapper.properties +++ b/examples/todoapp-lite/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/todoapp/gradle/wrapper/gradle-wrapper.properties b/examples/todoapp/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100755 --- a/examples/todoapp/gradle/wrapper/gradle-wrapper.properties +++ b/examples/todoapp/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/visual-effects/gradle/wrapper/gradle-wrapper.properties b/examples/visual-effects/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/visual-effects/gradle/wrapper/gradle-wrapper.properties +++ b/examples/visual-effects/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/web-compose-bird/gradle/wrapper/gradle-wrapper.properties b/examples/web-compose-bird/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/web-compose-bird/gradle/wrapper/gradle-wrapper.properties +++ b/examples/web-compose-bird/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/web-compose-in-js/gradle/wrapper/gradle-wrapper.properties b/examples/web-compose-in-js/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/web-compose-in-js/gradle/wrapper/gradle-wrapper.properties +++ b/examples/web-compose-in-js/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/web-landing/gradle/wrapper/gradle-wrapper.properties b/examples/web-landing/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/web-landing/gradle/wrapper/gradle-wrapper.properties +++ b/examples/web-landing/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/web-with-react/gradle/wrapper/gradle-wrapper.properties b/examples/web-with-react/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/web-with-react/gradle/wrapper/gradle-wrapper.properties +++ b/examples/web-with-react/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/widgets-gallery/gradle/wrapper/gradle-wrapper.properties b/examples/widgets-gallery/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/examples/widgets-gallery/gradle/wrapper/gradle-wrapper.properties +++ b/examples/widgets-gallery/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/experimental/examples/chat-mpp/gradle/wrapper/gradle-wrapper.properties b/experimental/examples/chat-mpp/gradle/wrapper/gradle-wrapper.properties index aa991fceae..ae04661ee7 100644 --- a/experimental/examples/chat-mpp/gradle/wrapper/gradle-wrapper.properties +++ b/experimental/examples/chat-mpp/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/experimental/examples/falling-balls-mpp/gradle/wrapper/gradle-wrapper.properties b/experimental/examples/falling-balls-mpp/gradle/wrapper/gradle-wrapper.properties index aa991fceae..ae04661ee7 100644 --- a/experimental/examples/falling-balls-mpp/gradle/wrapper/gradle-wrapper.properties +++ b/experimental/examples/falling-balls-mpp/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/experimental/examples/minesweeper/gradle/wrapper/gradle-wrapper.properties b/experimental/examples/minesweeper/gradle/wrapper/gradle-wrapper.properties index aa991fceae..ae04661ee7 100644 --- a/experimental/examples/minesweeper/gradle/wrapper/gradle-wrapper.properties +++ b/experimental/examples/minesweeper/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From ae1f72d7d5f4185359cb566b6d04fa372817acc8 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 3 Oct 2022 20:57:56 +0200 Subject: [PATCH 05/26] Update Android Examples --- examples/codeviewer/android/build.gradle.kts | 8 +- .../android/src/main/AndroidManifest.xml | 2 +- examples/codeviewer/build.gradle.kts | 8 -- examples/codeviewer/common/build.gradle.kts | 17 ++--- .../jetbrains/codeviewer/platform/Mouse.kt | 6 -- .../codeviewer/platform/Resources.kt | 4 +- .../codeviewer/platform/Scrollbar.kt | 1 - .../jetbrains/codeviewer/platform/Mouse.kt | 7 -- .../codeviewer/platform/Resources.kt | 2 +- .../jetbrains/codeviewer/ui/common/Fonts.kt | 18 ++--- .../codeviewer/ui/filetree/FileTreeView.kt | 21 ++---- .../jetbrains/codeviewer/platform/Mouse.kt | 11 --- .../codeviewer/platform/Resources.kt | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/imageviewer/android/build.gradle.kts | 8 +- .../android/src/main/AndroidManifest.xml | 2 +- examples/imageviewer/common/build.gradle.kts | 10 +-- .../example/imageviewer/view/AndroidHover.kt | 10 --- .../imageviewer/view/PointerMoveFilter.kt | 10 --- .../imageviewer/view/FullscreenImage.kt | 74 +++++++------------ .../example/imageviewer/view/MainScreen.kt | 61 +++++---------- .../example/imageviewer/view/MouseHover.kt | 13 ---- examples/imageviewer/gradle.properties | 2 +- examples/issues/android/build.gradle.kts | 6 +- .../android/src/main/AndroidManifest.xml | 2 +- examples/issues/common/build.gradle.kts | 8 +- .../examples/jetissues/view/JetIssuesView.kt | 13 +++- examples/issues/gradle.properties | 2 +- .../todoapp-lite/android/build.gradle.kts | 10 +-- .../android/src/main/AndroidManifest.xml | 2 +- examples/todoapp-lite/common/build.gradle.kts | 6 +- examples/todoapp-lite/gradle.properties | 2 +- examples/visual-effects/.gitignore | 15 ++++ .../widgets-gallery/android/build.gradle.kts | 6 +- .../android/src/main/AndroidManifest.xml | 3 +- .../widgets-gallery/common/build.gradle.kts | 10 +-- .../compose/demo/widgets/platform/Mouse.kt | 6 -- .../demo/widgets/platform/Resources.kt | 6 +- .../compose/demo/widgets/platform/Mouse.kt | 6 -- .../compose/demo/widgets/ui/MainView.kt | 18 ++--- .../compose/demo/widgets/ui/WidgetsType.kt | 8 +- .../compose/demo/widgets/ui/utils/Text.kt | 2 +- .../compose/demo/widgets/platform/Mouse.kt | 8 -- examples/widgets-gallery/gradle.properties | 2 +- 44 files changed, 157 insertions(+), 283 deletions(-) delete mode 100644 examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt delete mode 100644 examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt delete mode 100644 examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt create mode 100644 examples/visual-effects/.gitignore diff --git a/examples/codeviewer/android/build.gradle.kts b/examples/codeviewer/android/build.gradle.kts index 1a03c22b9f..13073d45fb 100644 --- a/examples/codeviewer/android/build.gradle.kts +++ b/examples/codeviewer/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdkVersion(31) + compileSdk = 32 defaultConfig { - minSdkVersion(26) - targetSdkVersion(31) + minSdk = 26 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -22,5 +22,5 @@ android { dependencies { implementation(project(":common")) - implementation("androidx.activity:activity-compose:1.4.0") + implementation("androidx.activity:activity-compose:1.5.0") } \ No newline at end of file diff --git a/examples/codeviewer/android/src/main/AndroidManifest.xml b/examples/codeviewer/android/src/main/AndroidManifest.xml index 64ddd4d7c6..308d3a79b5 100644 --- a/examples/codeviewer/android/src/main/AndroidManifest.xml +++ b/examples/codeviewer/android/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ + > diff --git a/examples/codeviewer/build.gradle.kts b/examples/codeviewer/build.gradle.kts index 59387d208b..bf95fe23b1 100644 --- a/examples/codeviewer/build.gradle.kts +++ b/examples/codeviewer/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { // this is necessary to avoid the plugins to be loaded multiple times // in each subproject's classloader @@ -17,10 +15,4 @@ subprojects { mavenCentral() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } - - plugins.withId("org.jetbrains.kotlin.multiplatform") { - tasks.withType { - kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" - } - } } diff --git a/examples/codeviewer/common/build.gradle.kts b/examples/codeviewer/common/build.gradle.kts index 08fb9990fa..1b8e451301 100644 --- a/examples/codeviewer/common/build.gradle.kts +++ b/examples/codeviewer/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") @@ -22,8 +20,8 @@ kotlin { named("androidMain") { kotlin.srcDirs("src/jvmMain/kotlin") dependencies { - api("androidx.appcompat:appcompat:1.4.1") - api("androidx.core:core-ktx:1.7.0") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.8.0") } } named("desktopMain") { @@ -36,16 +34,11 @@ kotlin { } android { - compileSdkVersion(31) + compileSdk = 32 defaultConfig { - minSdkVersion(21) - targetSdkVersion(31) - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + minSdk = 26 + targetSdk = 32 } sourceSets { diff --git a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt index d35c300295..4095a8bf60 100644 --- a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt +++ b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt @@ -3,10 +3,4 @@ package org.jetbrains.codeviewer.platform import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -actual fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this - actual fun Modifier.cursorForHorizontalResize() = this \ No newline at end of file diff --git a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt index f08c93a6cc..ad049b6045 100644 --- a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt +++ b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt @@ -1,13 +1,15 @@ package org.jetbrains.codeviewer.platform +import android.annotation.SuppressLint import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +@SuppressLint("DiscouragedApi") @Composable -actual fun Font(name: String, res: String, weight: FontWeight, style: FontStyle): Font { +actual fun font(name: String, res: String, weight: FontWeight, style: FontStyle): Font { val context = LocalContext.current val id = context.resources.getIdentifier(res, "font", context.packageName) return Font(id, weight, style) diff --git a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Scrollbar.kt b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Scrollbar.kt index 52c58a9dc3..8832527ae0 100644 --- a/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Scrollbar.kt +++ b/examples/codeviewer/common/src/androidMain/kotlin/org/jetbrains/codeviewer/platform/Scrollbar.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.ScrollState import androidx.compose.foundation.lazy.LazyListState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.Dp @Composable actual fun VerticalScrollbar( diff --git a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt index 4ce937e23c..28a5c3dec9 100644 --- a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt +++ b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt @@ -1,12 +1,5 @@ package org.jetbrains.codeviewer.platform import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset - -expect fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean = { true }, - onExit: () -> Boolean = { true }, - onMove: (Offset) -> Boolean = { true } -): Modifier expect fun Modifier.cursorForHorizontalResize(): Modifier \ No newline at end of file diff --git a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt index 00fa6102a2..d22698e61b 100644 --- a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt +++ b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt @@ -6,4 +6,4 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight @Composable -expect fun Font(name: String, res: String, weight: FontWeight, style: FontStyle): Font \ No newline at end of file +expect fun font(name: String, res: String, weight: FontWeight, style: FontStyle): Font \ No newline at end of file diff --git a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/common/Fonts.kt b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/common/Fonts.kt index 09a81d77f3..70461d77e5 100644 --- a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/common/Fonts.kt +++ b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/common/Fonts.kt @@ -4,57 +4,57 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight -import org.jetbrains.codeviewer.platform.Font +import org.jetbrains.codeviewer.platform.font object Fonts { @Composable fun jetbrainsMono() = FontFamily( - Font( + font( "JetBrains Mono", "jetbrainsmono_regular", FontWeight.Normal, FontStyle.Normal ), - Font( + font( "JetBrains Mono", "jetbrainsmono_italic", FontWeight.Normal, FontStyle.Italic ), - Font( + font( "JetBrains Mono", "jetbrainsmono_bold", FontWeight.Bold, FontStyle.Normal ), - Font( + font( "JetBrains Mono", "jetbrainsmono_bold_italic", FontWeight.Bold, FontStyle.Italic ), - Font( + font( "JetBrains Mono", "jetbrainsmono_extrabold", FontWeight.ExtraBold, FontStyle.Normal ), - Font( + font( "JetBrains Mono", "jetbrainsmono_extrabold_italic", FontWeight.ExtraBold, FontStyle.Italic ), - Font( + font( "JetBrains Mono", "jetbrainsmono_medium", FontWeight.Medium, FontStyle.Normal ), - Font( + font( "JetBrains Mono", "jetbrainsmono_medium_italic", FontWeight.Medium, diff --git a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/filetree/FileTreeView.kt b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/filetree/FileTreeView.kt index e570279036..9bc690a7a5 100644 --- a/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/filetree/FileTreeView.kt +++ b/examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/filetree/FileTreeView.kt @@ -1,6 +1,9 @@ package org.jetbrains.codeviewer.ui.filetree import androidx.compose.foundation.clickable +import androidx.compose.foundation.hoverable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState @@ -11,6 +14,7 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -24,7 +28,6 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.jetbrains.codeviewer.platform.VerticalScrollbar -import org.jetbrains.codeviewer.platform.pointerMoveFilter import org.jetbrains.codeviewer.util.withoutWidthConstraints @Composable @@ -76,25 +79,17 @@ private fun FileTreeItemView(fontSize: TextUnit, height: Dp, model: FileTree.Ite .height(height) .fillMaxWidth() ) { - val active = remember { mutableStateOf(false) } + val interactionSource = remember { MutableInteractionSource() } + val active by interactionSource.collectIsHoveredAsState() FileItemIcon(Modifier.align(Alignment.CenterVertically), model) Text( text = model.name, - color = if (active.value) LocalContentColor.current.copy(alpha = 0.60f) else LocalContentColor.current, + color = if (active) LocalContentColor.current.copy(alpha = 0.60f) else LocalContentColor.current, modifier = Modifier .align(Alignment.CenterVertically) .clipToBounds() - .pointerMoveFilter( - onEnter = { - active.value = true - true - }, - onExit = { - active.value = false - true - } - ), + .hoverable(interactionSource), softWrap = true, fontSize = fontSize, overflow = TextOverflow.Ellipsis, diff --git a/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt b/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt index 2fb7d7887c..7726dbb3e7 100644 --- a/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt +++ b/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt @@ -2,20 +2,9 @@ package org.jetbrains.codeviewer.platform import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.pointer.PointerIcon import androidx.compose.ui.input.pointer.pointerHoverIcon -import androidx.compose.ui.input.pointer.pointerMoveFilter import java.awt.Cursor -@OptIn(ExperimentalComposeUiApi::class) -actual fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this.pointerMoveFilter(onEnter = onEnter, onExit = onExit, onMove = onMove) - - -@OptIn(ExperimentalComposeUiApi::class) actual fun Modifier.cursorForHorizontalResize(): Modifier = this.pointerHoverIcon(PointerIcon(Cursor(Cursor.E_RESIZE_CURSOR))) diff --git a/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt b/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt index 89efa1ddd3..fdecfe3ceb 100644 --- a/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt +++ b/examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Resources.kt @@ -6,5 +6,5 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight @Composable -actual fun Font(name: String, res: String, weight: FontWeight, style: FontStyle): Font = +actual fun font(name: String, res: String, weight: FontWeight, style: FontStyle): Font = androidx.compose.ui.text.platform.Font("font/$res.ttf", weight, style) \ No newline at end of file diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 4e152adc88..ef72cbf492 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.7.10 -agp.version=7.0.4 +agp.version=7.1.3 compose.version=1.2.0-beta02 diff --git a/examples/imageviewer/android/build.gradle.kts b/examples/imageviewer/android/build.gradle.kts index 58c1d38d15..d5807ca5f3 100755 --- a/examples/imageviewer/android/build.gradle.kts +++ b/examples/imageviewer/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -22,5 +22,5 @@ android { dependencies { implementation(project(":common")) - implementation("androidx.activity:activity-compose:1.3.1") + implementation("androidx.activity:activity-compose:1.5.0") } diff --git a/examples/imageviewer/android/src/main/AndroidManifest.xml b/examples/imageviewer/android/src/main/AndroidManifest.xml index c8d8007950..5b1501c058 100755 --- a/examples/imageviewer/android/src/main/AndroidManifest.xml +++ b/examples/imageviewer/android/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ + > diff --git a/examples/imageviewer/common/build.gradle.kts b/examples/imageviewer/common/build.gradle.kts index 1ad8f76dfd..f956ba0d9d 100755 --- a/examples/imageviewer/common/build.gradle.kts +++ b/examples/imageviewer/common/build.gradle.kts @@ -20,8 +20,8 @@ kotlin { } named("androidMain") { dependencies { - api("androidx.appcompat:appcompat:1.3.1") - api("androidx.core:core-ktx:1.3.1") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.8.0") implementation("io.ktor:ktor-client-cio:1.4.1") } } @@ -35,11 +35,11 @@ kotlin { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt b/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt deleted file mode 100644 index 1a5d3c9173..0000000000 --- a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt +++ /dev/null @@ -1,10 +0,0 @@ -package example.imageviewer.view - -import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset - -actual fun Modifier.hover( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this \ No newline at end of file diff --git a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt deleted file mode 100644 index 7eb8ec6adc..0000000000 --- a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt +++ /dev/null @@ -1,10 +0,0 @@ -package example.imageviewer.view - -import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset - -expect fun Modifier.hover( - onEnter: () -> Boolean = { true }, - onExit: () -> Boolean = { true }, - onMove: (Offset) -> Boolean = { true } -): Modifier \ No newline at end of file diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullscreenImage.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullscreenImage.kt index cd27a48085..e8e91e4930 100644 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullscreenImage.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullscreenImage.kt @@ -1,8 +1,6 @@ package example.imageviewer.view -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.* import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -12,22 +10,20 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.key @@ -36,14 +32,12 @@ import androidx.compose.ui.input.key.KeyEventType import androidx.compose.ui.input.key.onPreviewKeyEvent import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.WindowSize import example.imageviewer.core.FilterType import example.imageviewer.model.AppState import example.imageviewer.model.ContentState import example.imageviewer.model.ScreenType import example.imageviewer.ResString import example.imageviewer.style.DarkGray -import example.imageviewer.style.DarkGreen import example.imageviewer.style.Foreground import example.imageviewer.style.MiniatureColor import example.imageviewer.style.TranslucentBlack @@ -74,7 +68,8 @@ fun ToolBar( text: String, content: ContentState ) { - val backButtonHover = remember { mutableStateOf(false) } + val backButtonInteractionSource = remember { MutableInteractionSource() } + val backButtonHover by backButtonInteractionSource.collectIsHoveredAsState() Surface( color = MiniatureColor, modifier = Modifier.height(44.dp) @@ -87,16 +82,9 @@ fun ToolBar( ) { Tooltip(ResString.back) { Clickable( - modifier = Modifier.hover( - onEnter = { - backButtonHover.value = true - false - }, - onExit = { - backButtonHover.value = false - false - }) - .background(color = if (backButtonHover.value) TranslucentBlack else Transparent), + modifier = Modifier + .hoverable(backButtonInteractionSource) + .background(color = if (backButtonHover) TranslucentBlack else Transparent), onClick = { if (content.isContentReady()) { content.restoreMainImage() @@ -145,33 +133,27 @@ fun FilterButton( type: FilterType, modifier: Modifier = Modifier.size(38.dp) ) { - val filterButtonHover = remember { mutableStateOf(false) } - Box( - modifier = Modifier.background(color = Transparent).clip(CircleShape) - ) { - Tooltip("$type") { - Clickable( - modifier = Modifier.hover( - onEnter = { - filterButtonHover.value = true - false - }, - onExit = { - filterButtonHover.value = false - false - }) - .background(color = if (filterButtonHover.value) TranslucentBlack else Transparent), - onClick = { content.toggleFilter(type)} - ) { - Image( - getFilterImage(type = type, content = content), - contentDescription = null, - modifier - ) - } + val interactionSource = remember { MutableInteractionSource() } + val filterButtonHover by interactionSource.collectIsHoveredAsState() + Box( + modifier = Modifier.background(color = Transparent).clip(CircleShape) + ) { + Tooltip("$type") { + Clickable( + modifier = Modifier + .hoverable(interactionSource) + .background(color = if (filterButtonHover) TranslucentBlack else Transparent), + onClick = { content.toggleFilter(type)} + ) { + Image( + getFilterImage(type = type, content = content), + contentDescription = null, + modifier + ) } } - Spacer(Modifier.width(20.dp)) + } + Spacer(Modifier.width(20.dp)) } @Composable diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt index ab57a2b9ad..df9d1d3e2e 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt @@ -1,9 +1,6 @@ package example.imageviewer.view -import androidx.compose.foundation.Image -import androidx.compose.foundation.VerticalScrollbar -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable +import androidx.compose.foundation.* import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -12,17 +9,12 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.rememberScrollbarAdapter -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material.Card import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Divider @@ -31,6 +23,7 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -81,7 +74,8 @@ fun TopContent(content: ContentState) { @Composable fun TitleBar(text: String, content: ContentState) { - val refreshButtonHover = remember { mutableStateOf(false) } + val interactionSource = remember { MutableInteractionSource() } + val refreshButtonHover by interactionSource.collectIsHoveredAsState() TopAppBar( backgroundColor = DarkGreen, title = { @@ -98,17 +92,9 @@ fun TitleBar(text: String, content: ContentState) { ) { Tooltip(ResString.refresh) { Clickable( - modifier = Modifier.hover( - onEnter = { - refreshButtonHover.value = true - false - }, - onExit = { - refreshButtonHover.value = false - false - } - ) - .background(color = if (refreshButtonHover.value) TranslucentBlack else Transparent), + modifier = Modifier + .hoverable(interactionSource) + .background(color = if (refreshButtonHover) TranslucentBlack else Transparent), onClick = { if (content.isContentReady()) { content.refresh() @@ -160,20 +146,15 @@ fun Miniature( picture: Picture, content: ContentState ) { - val cardHover = remember { mutableStateOf(false) } - val infoButtonHover = remember { mutableStateOf(false) } + val cardHoverInteractionSource = remember { MutableInteractionSource() } + val cardHover by cardHoverInteractionSource.collectIsHoveredAsState() + val infoButtonInteractionSource = remember { MutableInteractionSource() } + val infoButtonHover by infoButtonInteractionSource.collectIsHoveredAsState() Card( - backgroundColor = if (cardHover.value) MiniatureHoverColor else MiniatureColor, + backgroundColor = if (cardHover) MiniatureHoverColor else MiniatureColor, modifier = Modifier.padding(start = 10.dp, end = 18.dp).height(70.dp) .fillMaxWidth() - .hover(onEnter = { - cardHover.value = true - false - }, - onExit = { - cardHover.value = false - false - }) + .hoverable(cardHoverInteractionSource) .clickable { content.setMainImage(picture) }, @@ -209,16 +190,8 @@ fun Miniature( Clickable( modifier = Modifier.height(70.dp) .width(30.dp) - .hover( - onEnter = { - infoButtonHover.value = true - false - }, - onExit = { - infoButtonHover.value = false - false - }) - .background(color = if (infoButtonHover.value) TranslucentWhite else Transparent), + .hoverable(infoButtonInteractionSource) + .background(color = if (infoButtonHover) TranslucentWhite else Transparent), onClick = { showPopUpMessage( "${ResString.picture} " + diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt deleted file mode 100644 index 2f0acedcd2..0000000000 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt +++ /dev/null @@ -1,13 +0,0 @@ -package example.imageviewer.view - -import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.Modifier -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.input.pointer.pointerMoveFilter - -@OptIn(ExperimentalComposeUiApi::class) -actual fun Modifier.hover( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this.pointerMoveFilter(onEnter = onEnter, onExit = onExit, onMove = onMove) \ No newline at end of file diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 4e152adc88..ef72cbf492 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.7.10 -agp.version=7.0.4 +agp.version=7.1.3 compose.version=1.2.0-beta02 diff --git a/examples/issues/android/build.gradle.kts b/examples/issues/android/build.gradle.kts index 73574362f6..d5807ca5f3 100644 --- a/examples/issues/android/build.gradle.kts +++ b/examples/issues/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { minSdk = 26 - targetSdk = 31 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -22,5 +22,5 @@ android { dependencies { implementation(project(":common")) - implementation("androidx.activity:activity-compose:1.3.1") + implementation("androidx.activity:activity-compose:1.5.0") } diff --git a/examples/issues/android/src/main/AndroidManifest.xml b/examples/issues/android/src/main/AndroidManifest.xml index 37db4c8f9b..76e9f4d885 100644 --- a/examples/issues/android/src/main/AndroidManifest.xml +++ b/examples/issues/android/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ + > diff --git a/examples/issues/common/build.gradle.kts b/examples/issues/common/build.gradle.kts index 65d9d2e6db..e71878fa48 100644 --- a/examples/issues/common/build.gradle.kts +++ b/examples/issues/common/build.gradle.kts @@ -24,8 +24,8 @@ kotlin { named("androidMain") { kotlin.srcDirs("src/jvmAndAndroidMain/kotlin") dependencies { - api("androidx.appcompat:appcompat:1.3.1") - api("androidx.core:core-ktx:1.3.1") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.8.0") } } named("desktopMain") { @@ -40,11 +40,11 @@ apollo { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { minSdk = 26 - targetSdk = 31 + targetSdk = 32 } compileOptions { diff --git a/examples/issues/common/src/jvmAndAndroidMain/kotlin/androidx/ui/examples/jetissues/view/JetIssuesView.kt b/examples/issues/common/src/jvmAndAndroidMain/kotlin/androidx/ui/examples/jetissues/view/JetIssuesView.kt index f6572433fe..2f09d79e38 100644 --- a/examples/issues/common/src/jvmAndAndroidMain/kotlin/androidx/ui/examples/jetissues/view/JetIssuesView.kt +++ b/examples/issues/common/src/jvmAndAndroidMain/kotlin/androidx/ui/examples/jetissues/view/JetIssuesView.kt @@ -19,6 +19,8 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -31,6 +33,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.ui.examples.jetissues.data.* import androidx.ui.examples.jetissues.query.IssueQuery import androidx.ui.examples.jetissues.query.IssuesQuery @@ -83,10 +86,12 @@ fun SingleColumnLayout(currentIssue: MutableState) { ) }, navigationIcon = { - Button(onClick = { - currentIssue.value = null - }) { - Text(text = "Back") + IconButton( + onClick = { + currentIssue.value = null + } + ) { + Icon(Icons.Default.ArrowBack, contentDescription = "Back") } } ) diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 1a47da5db3..98b0b5847b 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -20,5 +20,5 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true kotlin.version=1.7.10 -agp.version=7.0.4 +agp.version=7.1.3 compose.version=1.2.0-beta02 diff --git a/examples/todoapp-lite/android/build.gradle.kts b/examples/todoapp-lite/android/build.gradle.kts index 9e99b62de6..e479462fba 100755 --- a/examples/todoapp-lite/android/build.gradle.kts +++ b/examples/todoapp-lite/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -23,7 +23,7 @@ android { dependencies { implementation(project(":common")) implementation(compose.material) - implementation("androidx.appcompat:appcompat:1.3.0") - implementation("androidx.activity:activity-compose:1.3.0") + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("androidx.activity:activity-compose:1.5.0") } diff --git a/examples/todoapp-lite/android/src/main/AndroidManifest.xml b/examples/todoapp-lite/android/src/main/AndroidManifest.xml index e55a10c995..daf0c85ca6 100755 --- a/examples/todoapp-lite/android/src/main/AndroidManifest.xml +++ b/examples/todoapp-lite/android/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ + > diff --git a/examples/todoapp-lite/common/build.gradle.kts b/examples/todoapp-lite/common/build.gradle.kts index 9d690d5244..692211784e 100755 --- a/examples/todoapp-lite/common/build.gradle.kts +++ b/examples/todoapp-lite/common/build.gradle.kts @@ -22,11 +22,11 @@ kotlin { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 4e152adc88..ef72cbf492 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.7.10 -agp.version=7.0.4 +agp.version=7.1.3 compose.version=1.2.0-beta02 diff --git a/examples/visual-effects/.gitignore b/examples/visual-effects/.gitignore new file mode 100644 index 0000000000..ba8435b9c5 --- /dev/null +++ b/examples/visual-effects/.gitignore @@ -0,0 +1,15 @@ +*.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 \ No newline at end of file diff --git a/examples/widgets-gallery/android/build.gradle.kts b/examples/widgets-gallery/android/build.gradle.kts index ea3aaf410d..13073d45fb 100644 --- a/examples/widgets-gallery/android/build.gradle.kts +++ b/examples/widgets-gallery/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { minSdk = 26 - targetSdk = 30 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -22,5 +22,5 @@ android { dependencies { implementation(project(":common")) - implementation("androidx.activity:activity-compose:1.3.0") + implementation("androidx.activity:activity-compose:1.5.0") } \ No newline at end of file diff --git a/examples/widgets-gallery/android/src/main/AndroidManifest.xml b/examples/widgets-gallery/android/src/main/AndroidManifest.xml index bbfbcf26cc..fc44b2f2bc 100644 --- a/examples/widgets-gallery/android/src/main/AndroidManifest.xml +++ b/examples/widgets-gallery/android/src/main/AndroidManifest.xml @@ -10,8 +10,9 @@ android:supportsRtl="true" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> + > diff --git a/examples/widgets-gallery/common/build.gradle.kts b/examples/widgets-gallery/common/build.gradle.kts index 0b8317b3da..d502f9525d 100644 --- a/examples/widgets-gallery/common/build.gradle.kts +++ b/examples/widgets-gallery/common/build.gradle.kts @@ -21,8 +21,8 @@ kotlin { } named("androidMain") { dependencies { - api("androidx.appcompat:appcompat:1.3.1") - api("androidx.core:core-ktx:1.3.1") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.8.0") } } named("desktopMain") { @@ -34,11 +34,11 @@ kotlin { } android { - compileSdk = 30 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 30 + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt b/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt index 30eed99b90..a49921fe64 100644 --- a/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt +++ b/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt @@ -3,10 +3,4 @@ package org.jetbrains.compose.demo.widgets.platform import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -actual fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this - actual fun Modifier.cursorForHorizontalResize() = this \ No newline at end of file diff --git a/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Resources.kt b/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Resources.kt index 18176214db..552d284f9a 100644 --- a/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Resources.kt +++ b/examples/widgets-gallery/common/src/androidMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Resources.kt @@ -1,10 +1,7 @@ package org.jetbrains.compose.demo.widgets.platform import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.graphics.vector.ImageVector -import org.jetbrains.compose.demo.widgets.platform.R @Composable actual fun painterResource(res: String): Painter { @@ -17,6 +14,5 @@ private fun drawableId(res: String): Int { val imageName = res.substringAfterLast("/").substringBeforeLast(".") val drawableClass = R.drawable::class.java val field = drawableClass.getDeclaredField(imageName) - val idValue = field.get(drawableClass) as Integer - return idValue.toInt() + return field.get(drawableClass) as Int } \ No newline at end of file diff --git a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt index 1d20d024a2..c6b3b3af40 100644 --- a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt +++ b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt @@ -3,10 +3,4 @@ package org.jetbrains.compose.demo.widgets.platform import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -expect fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean = { true }, - onExit: () -> Boolean = { true }, - onMove: (Offset) -> Boolean = { true } -): Modifier - expect fun Modifier.cursorForHorizontalResize(): Modifier \ No newline at end of file diff --git a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/MainView.kt b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/MainView.kt index dc52e21dc0..5049b3dbb4 100644 --- a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/MainView.kt +++ b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/MainView.kt @@ -4,6 +4,9 @@ import androidx.compose.animation.core.Spring import androidx.compose.animation.core.SpringSpec import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.clickable +import androidx.compose.foundation.hoverable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -26,7 +29,6 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.jetbrains.compose.demo.widgets.platform.VerticalScrollbar -import org.jetbrains.compose.demo.widgets.platform.pointerMoveFilter import org.jetbrains.compose.demo.widgets.theme.WidgetGalleryTheme import org.jetbrains.compose.demo.widgets.ui.utils.PanelState import org.jetbrains.compose.demo.widgets.ui.utils.ResizablePanel @@ -132,7 +134,8 @@ private fun WidgetsListItemViewImpl( .height(height) .padding(start = 16.dp) ) { - var inFocus by remember { mutableStateOf(false) } + val inFocusInteractionSource = remember { MutableInteractionSource() } + val inFocus by inFocusInteractionSource.collectIsHoveredAsState() val textColor = LocalContentColor.current.let { when { isCurrent -> it @@ -147,16 +150,7 @@ private fun WidgetsListItemViewImpl( modifier = Modifier .align(Alignment.CenterVertically) .clipToBounds() - .pointerMoveFilter( - onEnter = { - inFocus = true - true - }, - onExit = { - inFocus = false - true - } - ), + .hoverable(inFocusInteractionSource), softWrap = true, fontSize = fontSize, overflow = TextOverflow.Ellipsis, diff --git a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/WidgetsType.kt b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/WidgetsType.kt index d2c32e396d..cdbc0b08e1 100644 --- a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/WidgetsType.kt +++ b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/WidgetsType.kt @@ -1,5 +1,7 @@ package org.jetbrains.compose.demo.widgets.ui +import java.util.Locale + enum class WidgetsType(private val customTitle: String? = null) { APP_BARS, BUTTONS, @@ -13,9 +15,11 @@ enum class WidgetsType(private val customTitle: String? = null) { val readableName: String by lazy { name.split("_") - .map { it.toLowerCase() } + .map { it.lowercase(Locale.getDefault()) } .mapIndexed { i, it -> - if (i == 0) it.capitalize() else it + if (i == 0) it.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() + } else it }.joinToString(" ") } diff --git a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/utils/Text.kt b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/utils/Text.kt index 81254ab169..083e8165cb 100644 --- a/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/utils/Text.kt +++ b/examples/widgets-gallery/common/src/commonMain/kotlin/org/jetbrains/compose/demo/widgets/ui/utils/Text.kt @@ -14,7 +14,7 @@ fun SubtitleText(subtitle: String, modifier: Modifier = Modifier) { } @Composable -fun TitleText(title: String, modifier: Modifier = Modifier) { +fun TitleText(title: String) { Text( text = title, style = typography.h6.copy(fontSize = 14.sp), diff --git a/examples/widgets-gallery/common/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt b/examples/widgets-gallery/common/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt index e2010717a9..4fa07e3eb5 100644 --- a/examples/widgets-gallery/common/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt +++ b/examples/widgets-gallery/common/src/desktopMain/kotlin/org/jetbrains/compose/demo/widgets/platform/Mouse.kt @@ -8,13 +8,5 @@ import androidx.compose.ui.input.pointer.pointerHoverIcon import androidx.compose.ui.input.pointer.pointerMoveFilter import java.awt.Cursor -@OptIn(ExperimentalComposeUiApi::class) -actual fun Modifier.pointerMoveFilter( - onEnter: () -> Boolean, - onExit: () -> Boolean, - onMove: (Offset) -> Boolean -): Modifier = this.pointerMoveFilter(onEnter = onEnter, onExit = onExit, onMove = onMove) - -@OptIn(ExperimentalComposeUiApi::class) actual fun Modifier.cursorForHorizontalResize(): Modifier = this.pointerHoverIcon(PointerIcon(Cursor(Cursor.E_RESIZE_CURSOR))) diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 96e0eb201f..f128da9f9b 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.10 compose.version=1.2.0-beta02 -agp.version=7.0.4 +agp.version=7.1.3 From bd494bd311ec18b9fae914d5f870bb0304dcb808 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 4 Oct 2022 02:51:59 +0200 Subject: [PATCH 06/26] Fix Web examples --- examples/web-compose-bird/build.gradle.kts | 2 +- examples/web-with-react/build.gradle.kts | 2 +- templates/web-template/build.gradle.kts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/web-compose-bird/build.gradle.kts b/examples/web-compose-bird/build.gradle.kts index 444e94c391..8632c4639d 100644 --- a/examples/web-compose-bird/build.gradle.kts +++ b/examples/web-compose-bird/build.gradle.kts @@ -33,6 +33,6 @@ kotlin { afterEvaluate { rootProject.extensions.configure { versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.9.0" + versions.webpackCli.version = "4.10.0" } } diff --git a/examples/web-with-react/build.gradle.kts b/examples/web-with-react/build.gradle.kts index 658afacc94..e60cbf1fd6 100644 --- a/examples/web-with-react/build.gradle.kts +++ b/examples/web-with-react/build.gradle.kts @@ -36,6 +36,6 @@ kotlin { afterEvaluate { rootProject.extensions.configure { versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.9.0" + versions.webpackCli.version = "4.10.0" } } diff --git a/templates/web-template/build.gradle.kts b/templates/web-template/build.gradle.kts index 94a67bfbd0..8959f52ec4 100644 --- a/templates/web-template/build.gradle.kts +++ b/templates/web-template/build.gradle.kts @@ -36,7 +36,7 @@ afterEvaluate { rootProject.extensions.configure { nodeVersion = "16.0.0" versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.9.0" + versions.webpackCli.version = "4.10.0" } } From d2b9faa72ebad122fc52972b35579d9961f2c2c3 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" <99798741+dima-avdeev-jb@users.noreply.github.com> Date: Tue, 4 Oct 2022 16:32:53 +0400 Subject: [PATCH 07/26] examples README and .run configurations (#2355) --- examples/codeviewer/README.md | 7 +++--- .../codeviewer/desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/falling-balls/.run/desktop.run.xml | 23 ++++++++++++++++++ examples/falling-balls/README.md | 7 ++++++ .../desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/imageviewer/README.md | 6 ++--- .../imageviewer/desktop-run-configuration.png | Bin 0 -> 2582 bytes .../.run/runIde.run.xml | 23 ++++++++++++++++++ .../README.md | 5 ++-- .../ide-run-configuration.png | Bin 0 -> 2342 bytes examples/intellij-plugin/.run/runIde.run.xml | 23 ++++++++++++++++++ examples/intellij-plugin/README.md | 5 +++- .../intellij-plugin/ide-run-configuration.png | Bin 0 -> 2342 bytes examples/issues/.run/desktop.run.xml | 23 ++++++++++++++++++ examples/issues/README.md | 6 ++--- examples/issues/desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/notepad/README.md | 6 ++--- .../notepad/desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/todoapp-lite/.run/desktop.run.xml | 23 ++++++++++++++++++ examples/todoapp-lite/README.md | 6 ++--- .../desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/todoapp/.run/browser.run.xml | 23 ++++++++++++++++++ examples/todoapp/.run/desktop.run.xml | 23 ++++++++++++++++++ examples/todoapp/README.md | 12 ++++----- .../todoapp/browser-run-configuration.png | Bin 0 -> 2428 bytes .../todoapp/desktop-run-configuration.png | Bin 0 -> 2582 bytes examples/visual-effects/.run/desktop.run.xml | 23 ++++++++++++++++++ examples/visual-effects/README.md | 6 +++++ .../desktop-run-configuration.png | Bin 0 -> 2582 bytes .../web-compose-bird/.run/browser.run.xml | 23 ++++++++++++++++++ examples/web-compose-bird/README.md | 7 +++--- .../browser-run-configuration.png | Bin 0 -> 2428 bytes examples/web-compose-bird/gradle.properties | 1 - .../web-compose-in-js/.run/browser.run.xml | 23 ++++++++++++++++++ examples/web-compose-in-js/README.MD | 5 ++++ .../browser-run-configuration.png | Bin 0 -> 2428 bytes examples/web-landing/.run/browser.run.xml | 23 ++++++++++++++++++ examples/web-landing/README.md | 6 +++++ .../web-landing/browser-run-configuration.png | Bin 0 -> 2428 bytes examples/web-with-react/.run/browser.run.xml | 23 ++++++++++++++++++ examples/web-with-react/README.md | 6 ++--- .../browser-run-configuration.png | Bin 0 -> 2428 bytes examples/widgets-gallery/README.md | 6 ++--- .../desktop-run-configuration.png | Bin 0 -> 2582 bytes 44 files changed, 339 insertions(+), 34 deletions(-) create mode 100644 examples/codeviewer/desktop-run-configuration.png create mode 100644 examples/falling-balls/.run/desktop.run.xml create mode 100644 examples/falling-balls/README.md create mode 100644 examples/falling-balls/desktop-run-configuration.png create mode 100644 examples/imageviewer/desktop-run-configuration.png create mode 100644 examples/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml create mode 100644 examples/intellij-plugin-with-experimental-shared-base/ide-run-configuration.png create mode 100644 examples/intellij-plugin/.run/runIde.run.xml create mode 100644 examples/intellij-plugin/ide-run-configuration.png create mode 100644 examples/issues/.run/desktop.run.xml create mode 100644 examples/issues/desktop-run-configuration.png create mode 100644 examples/notepad/desktop-run-configuration.png create mode 100644 examples/todoapp-lite/.run/desktop.run.xml create mode 100644 examples/todoapp-lite/desktop-run-configuration.png create mode 100644 examples/todoapp/.run/browser.run.xml create mode 100644 examples/todoapp/.run/desktop.run.xml create mode 100644 examples/todoapp/browser-run-configuration.png create mode 100644 examples/todoapp/desktop-run-configuration.png create mode 100644 examples/visual-effects/.run/desktop.run.xml create mode 100644 examples/visual-effects/desktop-run-configuration.png create mode 100644 examples/web-compose-bird/.run/browser.run.xml create mode 100644 examples/web-compose-bird/browser-run-configuration.png create mode 100644 examples/web-compose-in-js/.run/browser.run.xml create mode 100644 examples/web-compose-in-js/browser-run-configuration.png create mode 100644 examples/web-landing/.run/browser.run.xml create mode 100755 examples/web-landing/README.md create mode 100644 examples/web-landing/browser-run-configuration.png create mode 100644 examples/web-with-react/.run/browser.run.xml create mode 100644 examples/web-with-react/browser-run-configuration.png create mode 100644 examples/widgets-gallery/desktop-run-configuration.png diff --git a/examples/codeviewer/README.md b/examples/codeviewer/README.md index 0fdefed7ad..8df821f1ba 100644 --- a/examples/codeviewer/README.md +++ b/examples/codeviewer/README.md @@ -1,9 +1,10 @@ MPP Code Viewer example for desktop/android written in Multiplatform Compose library. ### Running desktop application -``` -./gradlew :desktop:run -``` + +* To run, launch command: `./gradlew :desktop:run` +* Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/codeviewer/desktop-run-configuration.png b/examples/codeviewer/desktop-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..3688407c6f7e8c812047c17995d1042f8d378eb8 GIT binary patch literal 2582 zcmV+x3hDKUP)%0{0a4H@cf z*;G|kL9goSYLR}uA?v9>U-Nbl@MFuR8*9qUQ$deVY*r?*Z+JuhB&lgT94onxf_=7{YejE|2;Mn;CdiZ-GbA}=pbT(PpUvfYjPe^xsP zqoboyUS6)hK1TFHG&D3IA|e766&3An)aRs{>KfEm*UDdQUG4jI)m2@0@eU#6MKGfG zqp`6Ok&%%WLs(n$AsE&W`~M~H6|MwdM`mF*>T2pxUt5PK$pLVTx{vb8@-7c2tPWw* zn>WbKFGQ9p9}SI7`prhP2}>a)7+Hlm_$l%(OeJ{=ih7G2$sE-y==@WIu*T62M;@O+ zc4033QUYOnX9o^?e22V}{4W0xtPWvbQ3=9glMomg2fxrL)TxxyS@1Dlc6K)2D1f^f z+=o@BCHwYuSPCIiVMakF);QT=&%@utTe(t2WretuzHN6^t<+fC0EZ}7eBrPeJ0Bdy zM(5r5oy#61f7zpnR*1mn!0*%x}>xWB&4PzJ==szH9pXXPjCcYrf2F`w~L~p zBFvjNPb&4UMt*)iX3d&~f`S75CIkfqAvZTyzxuO@?m+meAPej7?!;Q3vpBZK?Z*4Cn_sR>J#EWyp2H)UB1?U-#tb5TOkw(m~` z_o=I^lj5Qyaa(8Z+!GKI2I?!vt=OO(>c=n#ILjxibbGY}vA9m^^th_U_#) zQy7ek7cXMw%$d^m%$YNClL;T&m6er=ldfL98a_TgxN_wR1`HU0VZ(;u(xpqXKi3mX zw%@jGn>aAz{Q2|PwQCoaE?p|;!@fIv(}&J`_Uu_4K71I*jvf0zhYlUWg$ozt$Mvb` zNeC&z@#XC;k}^G#d{95_^tCUaX;I;_Skf9FE-!XC)%jeF^{=c zZDX77{VvLW`o21n#Sp$xHzg=CUdDQ1aWCMmoG&UdS=^5R62zxrF$%(9f$y$|uZ#_w zo167rp}4phW5(;Hq@#Dv3+&6sqa3m)u z3v2|pw6s)UV0%7+AYdAB{BDGb$KY~KP7cP583R{WSJ`L7h7H)XX_K_Iv$Mm{p+k|F zm?-^^A3q*9Zro^l${hyV9z1vu_V)JJy?eKa%SVqMmC66kqNgF$L@?-F$G!fH*sKJz z9ZD|(d`CIl7q>UVUV+W(xU#BJQmY8g9eYHpV{p1gzyHT%F@$N#0bNx3C2WK+ zMy1(+(CAhGe|5*F0%1r@k~n8a;o;#SV?Zr9SH5wg$z{rg+{WUN}XN}yxhx^+w3Rg09A6mdkRO}gTV6DL}?(c#vw zU*G!qQ$cX~gP@aAbivfrRDH7!!+H?f34|xS&mlHDvC9y$y{Y&$oMYYaozGvS0QyF` z;6Fot!i|W#xEbk;KdCV&9g@fUA?QEwNq%PbaV&z6F6bK^DR619@$bDh0BT~JsKgYN z&e}Vm79WF3OUEoC zJYV>sTqk`{rM!U{=KxQ?Pbi!g%V*d9#mY5rnLK-Ti`E$ANnH zBaE)^q4Ww2>vVpQX_pW=I5^0dZr{Fr7&vgCxEjZ4gyYepM{6n!;C&(LA#r#N(IVBydv0~sap(rdZYS+idWD$g=6_xn;$+LIGhblO{6=)ia5B;9Q zFC+?XK7mp#M<RYF!i5VF8yhQCD;C@8B!-o$sYSbv4J9kb#(}6ji!(-Cvv}ql> z7*qG6MT;ywSVLC ztyIeYR@L{lu-o{f&jmRy!FP#sSL4EXv!S;L!b@A*FVi+@ndZ;S@kaAJ7zBv@Xu;}~=hb!{LpyIRxScn%Z97iUXrWD+Xu;!X z$JB!9{qp6@az6U$8*4^)Ak-$SzjZ$WpOj}ZgJ4M|+>w}8lT69tbWHJtjVYIo$RdRz zm@I&_^(=y{nvUP93YV~Pl3I&u^@WQ{e|_T>#vUyy%5GrtyS+J + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/falling-balls/README.md b/examples/falling-balls/README.md new file mode 100644 index 0000000000..6e405524b5 --- /dev/null +++ b/examples/falling-balls/README.md @@ -0,0 +1,7 @@ +Falling Balls game + +### Running desktop application + * To run, launch command: `./gradlew run` + * Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) + diff --git a/examples/falling-balls/desktop-run-configuration.png b/examples/falling-balls/desktop-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..3688407c6f7e8c812047c17995d1042f8d378eb8 GIT binary patch literal 2582 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/intellij-plugin-with-experimental-shared-base/README.md b/examples/intellij-plugin-with-experimental-shared-base/README.md index e8d43a50bc..550ed1fffa 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/README.md +++ b/examples/intellij-plugin-with-experimental-shared-base/README.md @@ -10,8 +10,9 @@ and allows sharing Compose runtime between multiple plugins ### Usage 1. Start test IDE: - * Choose the `runIde` task in the Gradle panel in Intellij; - * Or run the following command in terminal: `./gradlew runIde`; + * Run the following command in terminal: `./gradlew runIde` + * Or choose **runIde** configuration in IDE and run it. + ![ide-run-configuration.png](ide-run-configuration.png) 2. Create a new project or open any existing; 3. Select `Show Compose Demo...` from the `Tools` menu. diff --git a/examples/intellij-plugin-with-experimental-shared-base/ide-run-configuration.png b/examples/intellij-plugin-with-experimental-shared-base/ide-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc9453a387120584367a0ab111e29add30f3963 GIT binary patch literal 2342 zcmV+>3EB3EP)Nkl~pIZyHrXU_Ycg_qy_pZ9ss zK}T9>G0LIK%gZB8nnqK)+S*#uq-ivzb2uENNz-UbXS3NzjqG+iOTJ%|I*sM=R0Sah zORv|{g9i_&prAlg09065NOg5}gT{I+$ZrS%U{g~Q<>uycKF2<}y=wAL(wF+~-Mc)d zW6cp&K?nz|si~1y+FA@Vnwy*16|Gk5pmG0ymMRGE-@i{5i$y+$S`0JXZa3Y#caO(b zKJG7*9CinF+B^BDw6C*opWWuai>rnZ-&QRG8y=5`^7HdmL)hsU2u3i3^H(+3(CM6W zRBNawr^89EPAA>0xJ^j~m&t53`#qg_DIk3M^eH)o3pibF>J{5#HPk`~FzO5q^ke=7 z(i@uv6fRYcq(m+O-EWWYP)O2tiu?I9sy8&!tw-6kIVFzrgjxuZ3aeXdDI|G2#a{h@GK4ExtQK}D zdEep6F68NS)A@p*=#}%^C^{{k-b&p;TQ9~^Nkh44a}7G?MH(>(dwP1PQ#hSXqzuU6 zbW^w3Cy%xcVdui$gAus*(9lpa7!2|zs;;i46)RTw{d)y6h67aXP(z!Z;dl6v zl1BtWq}i4>BQ+V?2dJgJgB{Q#TnI_HN4Su|XdY% z_bnwC{#S8Y4myN@1L{(SH6m64G_t5&VzYaKXnfLtz@_g;ny+|Q9CM`+)^eYAi7 z{sG#%cP}L*B#_Z)lpi)A0tq1mI9^Q*@3Y<#=@{1x6>aGA`K_<`IQhATQcxj;D;dpJ>abYZ@c^5}<`9En^+Jew zARMttZ0iMpW~-fss!bXj8)^Lb@eEX3TN^_a5fMQrPoCsh) z>%J%|Dk}KeQBhH}W5*5_w&UaD6|JiV8bV0`1I~5em%~(4SEAUV;>C*x6cv$?k#yq33Ge5bGiOp+Ss8@xxl zp_GnMM5I5wC5!+SvvP-$gkv7+AMr8_oDS#4Po!W}#Sl`kbX~ys(aqzEucgDfk9_Cz zq!hv~;Y>)ga^U2G0~!RZy*?aJ3P8AE!GZx09y)Z0mM>q<^TqV^bQ(8q9F>=sv-=!A ze3<(H!ez^rF+_lH(xge8j&VNB7q4Hx&gppT)~yUE(lIJ!0G*wk&A;=RGiMk^f8zG- z+kSzI2qc8BC53TeayBoKU2Hgo31k-YNvr|F`Cjcy$Ebv{K<*Y5^K~)jxixJzd>g5d$9n*o zTC`{pr}(vN*YbQX*bxW_r6rorZhc85jSu^lOO&NWU&5HQb{H70f9Cwasr~JX?{TI4 zov6Og{+URJG86c^0RQ5HYhqqltQdM7$bELR%B)i8Ag2(lU+|{g-jjuYce?Bl(PcI1oyU z)$d*VkTM@-@tCNogohH?DAQN4(;>wJHl$oQB8n6UV4?t$_M-?=%9JjvGM8`IrtmS3 zQV8*f#!^d9&tFdigwkWX{}f#0lo{y9b~u;8)JAun;M1& literal 0 HcmV?d00001 diff --git a/examples/intellij-plugin/.run/runIde.run.xml b/examples/intellij-plugin/.run/runIde.run.xml new file mode 100644 index 0000000000..52aca017c2 --- /dev/null +++ b/examples/intellij-plugin/.run/runIde.run.xml @@ -0,0 +1,23 @@ + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/intellij-plugin/README.md b/examples/intellij-plugin/README.md index 1b510009c5..4912ad9ade 100644 --- a/examples/intellij-plugin/README.md +++ b/examples/intellij-plugin/README.md @@ -2,7 +2,10 @@ To run the example: -1. from directory `compose-jb/examples/intellij-plugin` run command in terminal: `./gradlew runIde` +1. from directory `compose-jb/examples/intellij-plugin`: + * Run command in terminal `./gradlew runIde`. + * Or choose **runIde** configuration in IDE and run it. + ![ide-run-configuration.png](ide-run-configuration.png) 2. create project or open any existing 3. from menu `Tools` select `Show Compose Demo...` diff --git a/examples/intellij-plugin/ide-run-configuration.png b/examples/intellij-plugin/ide-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc9453a387120584367a0ab111e29add30f3963 GIT binary patch literal 2342 zcmV+>3EB3EP)Nkl~pIZyHrXU_Ycg_qy_pZ9ss zK}T9>G0LIK%gZB8nnqK)+S*#uq-ivzb2uENNz-UbXS3NzjqG+iOTJ%|I*sM=R0Sah zORv|{g9i_&prAlg09065NOg5}gT{I+$ZrS%U{g~Q<>uycKF2<}y=wAL(wF+~-Mc)d zW6cp&K?nz|si~1y+FA@Vnwy*16|Gk5pmG0ymMRGE-@i{5i$y+$S`0JXZa3Y#caO(b zKJG7*9CinF+B^BDw6C*opWWuai>rnZ-&QRG8y=5`^7HdmL)hsU2u3i3^H(+3(CM6W zRBNawr^89EPAA>0xJ^j~m&t53`#qg_DIk3M^eH)o3pibF>J{5#HPk`~FzO5q^ke=7 z(i@uv6fRYcq(m+O-EWWYP)O2tiu?I9sy8&!tw-6kIVFzrgjxuZ3aeXdDI|G2#a{h@GK4ExtQK}D zdEep6F68NS)A@p*=#}%^C^{{k-b&p;TQ9~^Nkh44a}7G?MH(>(dwP1PQ#hSXqzuU6 zbW^w3Cy%xcVdui$gAus*(9lpa7!2|zs;;i46)RTw{d)y6h67aXP(z!Z;dl6v zl1BtWq}i4>BQ+V?2dJgJgB{Q#TnI_HN4Su|XdY% z_bnwC{#S8Y4myN@1L{(SH6m64G_t5&VzYaKXnfLtz@_g;ny+|Q9CM`+)^eYAi7 z{sG#%cP}L*B#_Z)lpi)A0tq1mI9^Q*@3Y<#=@{1x6>aGA`K_<`IQhATQcxj;D;dpJ>abYZ@c^5}<`9En^+Jew zARMttZ0iMpW~-fss!bXj8)^Lb@eEX3TN^_a5fMQrPoCsh) z>%J%|Dk}KeQBhH}W5*5_w&UaD6|JiV8bV0`1I~5em%~(4SEAUV;>C*x6cv$?k#yq33Ge5bGiOp+Ss8@xxl zp_GnMM5I5wC5!+SvvP-$gkv7+AMr8_oDS#4Po!W}#Sl`kbX~ys(aqzEucgDfk9_Cz zq!hv~;Y>)ga^U2G0~!RZy*?aJ3P8AE!GZx09y)Z0mM>q<^TqV^bQ(8q9F>=sv-=!A ze3<(H!ez^rF+_lH(xge8j&VNB7q4Hx&gppT)~yUE(lIJ!0G*wk&A;=RGiMk^f8zG- z+kSzI2qc8BC53TeayBoKU2Hgo31k-YNvr|F`Cjcy$Ebv{K<*Y5^K~)jxixJzd>g5d$9n*o zTC`{pr}(vN*YbQX*bxW_r6rorZhc85jSu^lOO&NWU&5HQb{H70f9Cwasr~JX?{TI4 zov6Og{+URJG86c^0RQ5HYhqqltQdM7$bELR%B)i8Ag2(lU+|{g-jjuYce?Bl(PcI1oyU z)$d*VkTM@-@tCNogohH?DAQN4(;>wJHl$oQB8n6UV4?t$_M-?=%9JjvGM8`IrtmS3 zQV8*f#!^d9&tFdigwkWX{}f#0lo{y9b~u;8)JAun;M1& literal 0 HcmV?d00001 diff --git a/examples/issues/.run/desktop.run.xml b/examples/issues/.run/desktop.run.xml new file mode 100644 index 0000000000..c10d50877a --- /dev/null +++ b/examples/issues/.run/desktop.run.xml @@ -0,0 +1,23 @@ + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/issues/README.md b/examples/issues/README.md index 18db020e27..5617219de8 100644 --- a/examples/issues/README.md +++ b/examples/issues/README.md @@ -2,9 +2,9 @@ Github Issues viewer example written in Jetpack Compose UI library. ### Running desktop application -``` -./gradlew :desktop:run -``` +* To run, launch command: `./gradlew :desktop:run` +* Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/issues/desktop-run-configuration.png b/examples/issues/desktop-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..3688407c6f7e8c812047c17995d1042f8d378eb8 GIT binary patch literal 2582 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/todoapp-lite/README.md b/examples/todoapp-lite/README.md index 67023dabed..d53ea8d327 100755 --- a/examples/todoapp-lite/README.md +++ b/examples/todoapp-lite/README.md @@ -3,9 +3,9 @@ A simplified version of the [TodoApp example](https://github.com/JetBrains/compo Supported targets: Android and Desktop. ### Running desktop application -``` -./gradlew :desktop:run -``` + * To run, launch command: `./gradlew :desktop:run` + * Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/todoapp-lite/desktop-run-configuration.png b/examples/todoapp-lite/desktop-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..3688407c6f7e8c812047c17995d1042f8d378eb8 GIT binary patch literal 2582 zcmV+x3hDKUP)%0{0a4H@cf z*;G|kL9goSYLR}uA?v9>U-Nbl@MFuR8*9qUQ$deVY*r?*Z+JuhB&lgT94onxf_=7{YejE|2;Mn;CdiZ-GbA}=pbT(PpUvfYjPe^xsP zqoboyUS6)hK1TFHG&D3IA|e766&3An)aRs{>KfEm*UDdQUG4jI)m2@0@eU#6MKGfG zqp`6Ok&%%WLs(n$AsE&W`~M~H6|MwdM`mF*>T2pxUt5PK$pLVTx{vb8@-7c2tPWw* zn>WbKFGQ9p9}SI7`prhP2}>a)7+Hlm_$l%(OeJ{=ih7G2$sE-y==@WIu*T62M;@O+ zc4033QUYOnX9o^?e22V}{4W0xtPWvbQ3=9glMomg2fxrL)TxxyS@1Dlc6K)2D1f^f z+=o@BCHwYuSPCIiVMakF);QT=&%@utTe(t2WretuzHN6^t<+fC0EZ}7eBrPeJ0Bdy zM(5r5oy#61f7zpnR*1mn!0*%x}>xWB&4PzJ==szH9pXXPjCcYrf2F`w~L~p zBFvjNPb&4UMt*)iX3d&~f`S75CIkfqAvZTyzxuO@?m+meAPej7?!;Q3vpBZK?Z*4Cn_sR>J#EWyp2H)UB1?U-#tb5TOkw(m~` z_o=I^lj5Qyaa(8Z+!GKI2I?!vt=OO(>c=n#ILjxibbGY}vA9m^^th_U_#) zQy7ek7cXMw%$d^m%$YNClL;T&m6er=ldfL98a_TgxN_wR1`HU0VZ(;u(xpqXKi3mX zw%@jGn>aAz{Q2|PwQCoaE?p|;!@fIv(}&J`_Uu_4K71I*jvf0zhYlUWg$ozt$Mvb` zNeC&z@#XC;k}^G#d{95_^tCUaX;I;_Skf9FE-!XC)%jeF^{=c zZDX77{VvLW`o21n#Sp$xHzg=CUdDQ1aWCMmoG&UdS=^5R62zxrF$%(9f$y$|uZ#_w zo167rp}4phW5(;Hq@#Dv3+&6sqa3m)u z3v2|pw6s)UV0%7+AYdAB{BDGb$KY~KP7cP583R{WSJ`L7h7H)XX_K_Iv$Mm{p+k|F zm?-^^A3q*9Zro^l${hyV9z1vu_V)JJy?eKa%SVqMmC66kqNgF$L@?-F$G!fH*sKJz z9ZD|(d`CIl7q>UVUV+W(xU#BJQmY8g9eYHpV{p1gzyHT%F@$N#0bNx3C2WK+ zMy1(+(CAhGe|5*F0%1r@k~n8a;o;#SV?Zr9SH5wg$z{rg+{WUN}XN}yxhx^+w3Rg09A6mdkRO}gTV6DL}?(c#vw zU*G!qQ$cX~gP@aAbivfrRDH7!!+H?f34|xS&mlHDvC9y$y{Y&$oMYYaozGvS0QyF` z;6Fot!i|W#xEbk;KdCV&9g@fUA?QEwNq%PbaV&z6F6bK^DR619@$bDh0BT~JsKgYN z&e}Vm79WF3OUEoC zJYV>sTqk`{rM!U{=KxQ?Pbi!g%V*d9#mY5rnLK-Ti`E$ANnH zBaE)^q4Ww2>vVpQX_pW=I5^0dZr{Fr7&vgCxEjZ4gyYepM{6n!;C&(LA#r#N(IVBydv0~sap(rdZYS+idWD$g=6_xn;$+LIGhblO{6=)ia5B;9Q zFC+?XK7mp#M<RYF!i5VF8yhQCD;C@8B!-o$sYSbv4J9kb#(}6ji!(-Cvv}ql> z7*qG6MT;ywSVLC ztyIeYR@L{lu-o{f&jmRy!FP#sSL4EXv!S;L!b@A*FVi+@ndZ;S@kaAJ7zBv@Xu;}~=hb!{LpyIRxScn%Z97iUXrWD+Xu;!X z$JB!9{qp6@az6U$8*4^)Ak-$SzjZ$WpOj}ZgJ4M|+>w}8lT69tbWHJtjVYIo$RdRz zm@I&_^(=y{nvUP93YV~Pl3I&u^@WQ{e|_T>#vUyy%5GrtyS+J + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/todoapp/.run/desktop.run.xml b/examples/todoapp/.run/desktop.run.xml new file mode 100644 index 0000000000..c10d50877a --- /dev/null +++ b/examples/todoapp/.run/desktop.run.xml @@ -0,0 +1,23 @@ + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/todoapp/README.md b/examples/todoapp/README.md index ee267b1d9c..1efcddc185 100755 --- a/examples/todoapp/README.md +++ b/examples/todoapp/README.md @@ -34,9 +34,9 @@ Features: - Pluggable UI - Compose UI for Android, Desktop and Web, SwiftUI (not Compose) for iOS ### Running desktop application -``` -./gradlew :desktop:run -``` + * To run, launch command: `./gradlew :desktop:run` + * Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) #### Building native desktop distribution ``` @@ -49,9 +49,9 @@ Features: Open project in Intellij IDEA or Android Studio and run "android" configuration. ### Running Web browser application -``` -./gradlew :web:jsBrowserDevelopmentRun -``` + * To run, launch command: `./gradlew :web:jsBrowserDevelopmentRun` + * Or choose **browser** configuration in IDE and run it. + ![browser-run-configuration.png](browser-run-configuration.png) ### Running iOS application diff --git a/examples/todoapp/browser-run-configuration.png b/examples/todoapp/browser-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8a08eeac5336455be979686a2a22d2958e0a114e GIT binary patch literal 2428 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/visual-effects/README.md b/examples/visual-effects/README.md index 3eee5cb963..1ee06e9ee1 100644 --- a/examples/visual-effects/README.md +++ b/examples/visual-effects/README.md @@ -1 +1,7 @@ Several visual effects implmented with Compose Multiplatform, used in 1.0 release announce video. + +### Running desktop application +* To run, launch command: `./gradlew run` +* Or choose **desktop** configuration in IDE and run it. + ![desktop-run-configuration.png](desktop-run-configuration.png) + diff --git a/examples/visual-effects/desktop-run-configuration.png b/examples/visual-effects/desktop-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..3688407c6f7e8c812047c17995d1042f8d378eb8 GIT binary patch literal 2582 zcmV+x3hDKUP)%0{0a4H@cf z*;G|kL9goSYLR}uA?v9>U-Nbl@MFuR8*9qUQ$deVY*r?*Z+JuhB&lgT94onxf_=7{YejE|2;Mn;CdiZ-GbA}=pbT(PpUvfYjPe^xsP zqoboyUS6)hK1TFHG&D3IA|e766&3An)aRs{>KfEm*UDdQUG4jI)m2@0@eU#6MKGfG zqp`6Ok&%%WLs(n$AsE&W`~M~H6|MwdM`mF*>T2pxUt5PK$pLVTx{vb8@-7c2tPWw* zn>WbKFGQ9p9}SI7`prhP2}>a)7+Hlm_$l%(OeJ{=ih7G2$sE-y==@WIu*T62M;@O+ zc4033QUYOnX9o^?e22V}{4W0xtPWvbQ3=9glMomg2fxrL)TxxyS@1Dlc6K)2D1f^f z+=o@BCHwYuSPCIiVMakF);QT=&%@utTe(t2WretuzHN6^t<+fC0EZ}7eBrPeJ0Bdy zM(5r5oy#61f7zpnR*1mn!0*%x}>xWB&4PzJ==szH9pXXPjCcYrf2F`w~L~p zBFvjNPb&4UMt*)iX3d&~f`S75CIkfqAvZTyzxuO@?m+meAPej7?!;Q3vpBZK?Z*4Cn_sR>J#EWyp2H)UB1?U-#tb5TOkw(m~` z_o=I^lj5Qyaa(8Z+!GKI2I?!vt=OO(>c=n#ILjxibbGY}vA9m^^th_U_#) zQy7ek7cXMw%$d^m%$YNClL;T&m6er=ldfL98a_TgxN_wR1`HU0VZ(;u(xpqXKi3mX zw%@jGn>aAz{Q2|PwQCoaE?p|;!@fIv(}&J`_Uu_4K71I*jvf0zhYlUWg$ozt$Mvb` zNeC&z@#XC;k}^G#d{95_^tCUaX;I;_Skf9FE-!XC)%jeF^{=c zZDX77{VvLW`o21n#Sp$xHzg=CUdDQ1aWCMmoG&UdS=^5R62zxrF$%(9f$y$|uZ#_w zo167rp}4phW5(;Hq@#Dv3+&6sqa3m)u z3v2|pw6s)UV0%7+AYdAB{BDGb$KY~KP7cP583R{WSJ`L7h7H)XX_K_Iv$Mm{p+k|F zm?-^^A3q*9Zro^l${hyV9z1vu_V)JJy?eKa%SVqMmC66kqNgF$L@?-F$G!fH*sKJz z9ZD|(d`CIl7q>UVUV+W(xU#BJQmY8g9eYHpV{p1gzyHT%F@$N#0bNx3C2WK+ zMy1(+(CAhGe|5*F0%1r@k~n8a;o;#SV?Zr9SH5wg$z{rg+{WUN}XN}yxhx^+w3Rg09A6mdkRO}gTV6DL}?(c#vw zU*G!qQ$cX~gP@aAbivfrRDH7!!+H?f34|xS&mlHDvC9y$y{Y&$oMYYaozGvS0QyF` z;6Fot!i|W#xEbk;KdCV&9g@fUA?QEwNq%PbaV&z6F6bK^DR619@$bDh0BT~JsKgYN z&e}Vm79WF3OUEoC zJYV>sTqk`{rM!U{=KxQ?Pbi!g%V*d9#mY5rnLK-Ti`E$ANnH zBaE)^q4Ww2>vVpQX_pW=I5^0dZr{Fr7&vgCxEjZ4gyYepM{6n!;C&(LA#r#N(IVBydv0~sap(rdZYS+idWD$g=6_xn;$+LIGhblO{6=)ia5B;9Q zFC+?XK7mp#M<RYF!i5VF8yhQCD;C@8B!-o$sYSbv4J9kb#(}6ji!(-Cvv}ql> z7*qG6MT;ywSVLC ztyIeYR@L{lu-o{f&jmRy!FP#sSL4EXv!S;L!b@A*FVi+@ndZ;S@kaAJ7zBv@Xu;}~=hb!{LpyIRxScn%Z97iUXrWD+Xu;!X z$JB!9{qp6@az6U$8*4^)Ak-$SzjZ$WpOj}ZgJ4M|+>w}8lT69tbWHJtjVYIo$RdRz zm@I&_^(=y{nvUP93YV~Pl3I&u^@WQ{e|_T>#vUyy%5GrtyS+J + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/web-compose-bird/README.md b/examples/web-compose-bird/README.md index f0aede880b..2fb07d6439 100644 --- a/examples/web-compose-bird/README.md +++ b/examples/web-compose-bird/README.md @@ -12,12 +12,13 @@ ## ▶️ Play - https://theapache64.github.io/compose-bird/ +- Use arrow **Up** key to fly ## 🏃 Run -``` -./gradlew jsBrowserRun -``` +* To run, launch command: `./gradlew jsBrowserRun` +* Or choose **browser** configuration in IDE and run it. + ![browser-run-configuration.png](browser-run-configuration.png) ## 📦 Distribute diff --git a/examples/web-compose-bird/browser-run-configuration.png b/examples/web-compose-bird/browser-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8a08eeac5336455be979686a2a22d2958e0a114e GIT binary patch literal 2428 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/web-compose-in-js/README.MD b/examples/web-compose-in-js/README.MD index 308b8a383c..0320575a52 100644 --- a/examples/web-compose-in-js/README.MD +++ b/examples/web-compose-in-js/README.MD @@ -67,6 +67,11 @@ config.output = config.output || {}; config.output.library = "MyComposables"; ``` +### Running Web browser application +* To run, launch command: `./gradlew :jsBrowserDevelopmentRun` +* Or choose **browser** configuration in IDE and run it. + ![browser-run-configuration.png](browser-run-configuration.png) + ### Building and using the output ``` diff --git a/examples/web-compose-in-js/browser-run-configuration.png b/examples/web-compose-in-js/browser-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8a08eeac5336455be979686a2a22d2958e0a114e GIT binary patch literal 2428 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/web-landing/README.md b/examples/web-landing/README.md new file mode 100755 index 0000000000..5727745049 --- /dev/null +++ b/examples/web-landing/README.md @@ -0,0 +1,6 @@ +Landing page of Compose for Web + +### Running Web browser application + * To run, launch command: `./gradlew :jsBrowserRun` + * Or choose **browser** configuration in IDE and run it. + ![browser-run-configuration.png](browser-run-configuration.png) diff --git a/examples/web-landing/browser-run-configuration.png b/examples/web-landing/browser-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8a08eeac5336455be979686a2a22d2958e0a114e GIT binary patch literal 2428 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/examples/web-with-react/README.md b/examples/web-with-react/README.md index c5fc03c24e..62e62b7405 100644 --- a/examples/web-with-react/README.md +++ b/examples/web-with-react/README.md @@ -19,6 +19,6 @@ It requires adding `external` declarations. For example: [ReactYoutubePlayer.kt] Here is a good tutorial - [Using packages from NPM](https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/07_Using_Packages_From_NPM) ### Running web application -``` -./gradlew jsBrowserRun -``` \ No newline at end of file +* To run, launch command: `./gradlew :jsBrowserRun` +* Or choose **browser** configuration in IDE and run it. + ![browser-run-configuration.png](browser-run-configuration.png) diff --git a/examples/web-with-react/browser-run-configuration.png b/examples/web-with-react/browser-run-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..8a08eeac5336455be979686a2a22d2958e0a114e GIT binary patch literal 2428 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 Date: Wed, 5 Oct 2022 13:44:37 +0200 Subject: [PATCH 08/26] Fix examples, templates (#2359) - move screenshot into screenshots folder - add Readme, run configuration, .gitignore to web-template - fix web-compose-in-js (read versions from properties) - add global idea/ into gitignore --- .gitignore | 8 +----- examples/codeviewer/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/falling-balls/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/imageviewer/README.md | 2 +- .../desktop-run-configuration.png | Bin .../README.md | 2 +- .../ide-run-configuration.png | Bin examples/intellij-plugin/README.md | 2 +- .../ide-run-configuration.png | Bin examples/issues/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/notepad/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/todoapp-lite/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/todoapp/README.md | 4 +-- .../browser-run-configuration.png | Bin .../desktop-run-configuration.png | Bin examples/visual-effects/README.md | 2 +- .../desktop-run-configuration.png | Bin examples/web-compose-bird/README.md | 4 +-- examples/web-compose-bird/cover.jpeg | Bin 138451 -> 0 bytes .../browser-run-configuration.png | Bin .../{ => screenshots}/demo.gif | Bin examples/web-compose-in-js/README.MD | 2 +- examples/web-compose-in-js/build.gradle.kts | 4 +-- examples/web-compose-in-js/gradle.properties | 2 ++ .../browser-run-configuration.png | Bin .../web-compose-in-js/settings.gradle.kts | 6 ++++- examples/web-landing/README.md | 2 +- .../browser-run-configuration.png | Bin examples/web-with-react/README.md | 2 +- .../browser-run-configuration.png | Bin examples/widgets-gallery/README.md | 2 +- .../desktop-run-configuration.png | Bin templates/web-template/.gitignore | 15 ++++++++++++ templates/web-template/.run/browser.run.xml | 23 ++++++++++++++++++ templates/web-template/README.md | 4 +++ 40 files changed, 69 insertions(+), 27 deletions(-) rename examples/codeviewer/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/falling-balls/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/imageviewer/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/intellij-plugin-with-experimental-shared-base/{ => screenshots}/ide-run-configuration.png (100%) rename examples/intellij-plugin/{ => screenshots}/ide-run-configuration.png (100%) rename examples/issues/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/notepad/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/todoapp-lite/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/todoapp/{ => screenshots}/browser-run-configuration.png (100%) rename examples/todoapp/{ => screenshots}/desktop-run-configuration.png (100%) rename examples/visual-effects/{ => screenshots}/desktop-run-configuration.png (100%) delete mode 100644 examples/web-compose-bird/cover.jpeg rename examples/web-compose-bird/{ => screenshots}/browser-run-configuration.png (100%) rename examples/web-compose-bird/{ => screenshots}/demo.gif (100%) rename examples/web-compose-in-js/{ => screenshots}/browser-run-configuration.png (100%) rename examples/web-landing/{ => screenshots}/browser-run-configuration.png (100%) rename examples/web-with-react/{ => screenshots}/browser-run-configuration.png (100%) rename examples/widgets-gallery/{ => screenshots}/desktop-run-configuration.png (100%) create mode 100644 templates/web-template/.gitignore create mode 100644 templates/web-template/.run/browser.run.xml create mode 100644 templates/web-template/README.md diff --git a/.gitignore b/.gitignore index 088e0f189e..a99e625403 100644 --- a/.gitignore +++ b/.gitignore @@ -4,13 +4,7 @@ out *.iml .gradle /local.properties -/.idea -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +.idea/ .DS_Store build/ /captures diff --git a/examples/codeviewer/README.md b/examples/codeviewer/README.md index 8df821f1ba..d9dc237229 100644 --- a/examples/codeviewer/README.md +++ b/examples/codeviewer/README.md @@ -4,7 +4,7 @@ MPP Code Viewer example for desktop/android written in Multiplatform Compose lib * To run, launch command: `./gradlew :desktop:run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/codeviewer/desktop-run-configuration.png b/examples/codeviewer/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/codeviewer/desktop-run-configuration.png rename to examples/codeviewer/screenshots/desktop-run-configuration.png diff --git a/examples/falling-balls/README.md b/examples/falling-balls/README.md index 6e405524b5..f4eba98b85 100644 --- a/examples/falling-balls/README.md +++ b/examples/falling-balls/README.md @@ -3,5 +3,5 @@ Falling Balls game ### Running desktop application * To run, launch command: `./gradlew run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) diff --git a/examples/falling-balls/desktop-run-configuration.png b/examples/falling-balls/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/falling-balls/desktop-run-configuration.png rename to examples/falling-balls/screenshots/desktop-run-configuration.png diff --git a/examples/imageviewer/README.md b/examples/imageviewer/README.md index c7ede93bc7..64a1794e50 100755 --- a/examples/imageviewer/README.md +++ b/examples/imageviewer/README.md @@ -3,7 +3,7 @@ An example of image gallery for remote server image viewing, based on Jetpack Co ### Running desktop application * To run, launch command: `./gradlew :desktop:run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/imageviewer/desktop-run-configuration.png b/examples/imageviewer/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/imageviewer/desktop-run-configuration.png rename to examples/imageviewer/screenshots/desktop-run-configuration.png diff --git a/examples/intellij-plugin-with-experimental-shared-base/README.md b/examples/intellij-plugin-with-experimental-shared-base/README.md index 550ed1fffa..8af73b48ec 100644 --- a/examples/intellij-plugin-with-experimental-shared-base/README.md +++ b/examples/intellij-plugin-with-experimental-shared-base/README.md @@ -12,7 +12,7 @@ and allows sharing Compose runtime between multiple plugins 1. Start test IDE: * Run the following command in terminal: `./gradlew runIde` * Or choose **runIde** configuration in IDE and run it. - ![ide-run-configuration.png](ide-run-configuration.png) + ![ide-run-configuration.png](screenshots/ide-run-configuration.png) 2. Create a new project or open any existing; 3. Select `Show Compose Demo...` from the `Tools` menu. diff --git a/examples/intellij-plugin-with-experimental-shared-base/ide-run-configuration.png b/examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/ide-run-configuration.png rename to examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png diff --git a/examples/intellij-plugin/README.md b/examples/intellij-plugin/README.md index 4912ad9ade..c78000edee 100644 --- a/examples/intellij-plugin/README.md +++ b/examples/intellij-plugin/README.md @@ -5,7 +5,7 @@ To run the example: 1. from directory `compose-jb/examples/intellij-plugin`: * Run command in terminal `./gradlew runIde`. * Or choose **runIde** configuration in IDE and run it. - ![ide-run-configuration.png](ide-run-configuration.png) + ![ide-run-configuration.png](screenshots/ide-run-configuration.png) 2. create project or open any existing 3. from menu `Tools` select `Show Compose Demo...` diff --git a/examples/intellij-plugin/ide-run-configuration.png b/examples/intellij-plugin/screenshots/ide-run-configuration.png similarity index 100% rename from examples/intellij-plugin/ide-run-configuration.png rename to examples/intellij-plugin/screenshots/ide-run-configuration.png diff --git a/examples/issues/README.md b/examples/issues/README.md index 5617219de8..4e3a73f80c 100644 --- a/examples/issues/README.md +++ b/examples/issues/README.md @@ -4,7 +4,7 @@ Github Issues viewer example written in Jetpack Compose UI library. ### Running desktop application * To run, launch command: `./gradlew :desktop:run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/issues/desktop-run-configuration.png b/examples/issues/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/issues/desktop-run-configuration.png rename to examples/issues/screenshots/desktop-run-configuration.png diff --git a/examples/notepad/README.md b/examples/notepad/README.md index d3974850c4..26da73ce5f 100644 --- a/examples/notepad/README.md +++ b/examples/notepad/README.md @@ -3,7 +3,7 @@ Notepad example for desktop written in Compose for Desktop library, using Compos ### Running desktop application * To run, launch command: `./gradlew run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/notepad/desktop-run-configuration.png b/examples/notepad/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/notepad/desktop-run-configuration.png rename to examples/notepad/screenshots/desktop-run-configuration.png diff --git a/examples/todoapp-lite/README.md b/examples/todoapp-lite/README.md index d53ea8d327..c35555d64a 100755 --- a/examples/todoapp-lite/README.md +++ b/examples/todoapp-lite/README.md @@ -5,7 +5,7 @@ Supported targets: Android and Desktop. ### Running desktop application * To run, launch command: `./gradlew :desktop:run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) ### Building native desktop distribution ``` diff --git a/examples/todoapp-lite/desktop-run-configuration.png b/examples/todoapp-lite/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/todoapp-lite/desktop-run-configuration.png rename to examples/todoapp-lite/screenshots/desktop-run-configuration.png diff --git a/examples/todoapp/README.md b/examples/todoapp/README.md index 1efcddc185..783993574a 100755 --- a/examples/todoapp/README.md +++ b/examples/todoapp/README.md @@ -36,7 +36,7 @@ Features: ### Running desktop application * To run, launch command: `./gradlew :desktop:run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) #### Building native desktop distribution ``` @@ -51,7 +51,7 @@ Open project in Intellij IDEA or Android Studio and run "android" configuration. ### Running Web browser application * To run, launch command: `./gradlew :web:jsBrowserDevelopmentRun` * Or choose **browser** configuration in IDE and run it. - ![browser-run-configuration.png](browser-run-configuration.png) + ![browser-run-configuration.png](screenshots/browser-run-configuration.png) ### Running iOS application diff --git a/examples/todoapp/browser-run-configuration.png b/examples/todoapp/screenshots/browser-run-configuration.png similarity index 100% rename from examples/todoapp/browser-run-configuration.png rename to examples/todoapp/screenshots/browser-run-configuration.png diff --git a/examples/todoapp/desktop-run-configuration.png b/examples/todoapp/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/todoapp/desktop-run-configuration.png rename to examples/todoapp/screenshots/desktop-run-configuration.png diff --git a/examples/visual-effects/README.md b/examples/visual-effects/README.md index 1ee06e9ee1..0943c31b12 100644 --- a/examples/visual-effects/README.md +++ b/examples/visual-effects/README.md @@ -3,5 +3,5 @@ Several visual effects implmented with Compose Multiplatform, used in 1.0 releas ### Running desktop application * To run, launch command: `./gradlew run` * Or choose **desktop** configuration in IDE and run it. - ![desktop-run-configuration.png](desktop-run-configuration.png) + ![desktop-run-configuration.png](screenshots/desktop-run-configuration.png) diff --git a/examples/visual-effects/desktop-run-configuration.png b/examples/visual-effects/screenshots/desktop-run-configuration.png similarity index 100% rename from examples/visual-effects/desktop-run-configuration.png rename to examples/visual-effects/screenshots/desktop-run-configuration.png diff --git a/examples/web-compose-bird/README.md b/examples/web-compose-bird/README.md index 2fb07d6439..2f2db4e10f 100644 --- a/examples/web-compose-bird/README.md +++ b/examples/web-compose-bird/README.md @@ -1,6 +1,6 @@ # 🐦 Compose Bird -![](demo.gif) +![](screenshots/demo.gif) ![latestVersion](https://img.shields.io/github/v/release/theapache64/compose-bird) @@ -18,7 +18,7 @@ * To run, launch command: `./gradlew jsBrowserRun` * Or choose **browser** configuration in IDE and run it. - ![browser-run-configuration.png](browser-run-configuration.png) + ![browser-run-configuration.png](screenshots/browser-run-configuration.png) ## 📦 Distribute diff --git a/examples/web-compose-bird/cover.jpeg b/examples/web-compose-bird/cover.jpeg deleted file mode 100644 index 7ad7efca867c91e9523a74821e85ebeea403df20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138451 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

-00XT9r+Qpb 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 + + + + + + true + true + false + + + \ No newline at end of file diff --git a/templates/web-template/README.md b/templates/web-template/README.md new file mode 100644 index 0000000000..fcd77188f5 --- /dev/null +++ b/templates/web-template/README.md @@ -0,0 +1,4 @@ +Compose Web Application + +- `./gradlew jsBrowserRun` - run application in a browser +- `./gradlew jsBrowserProductionWebpack` - produce the output in `build/distributions` \ No newline at end of file From caa210e607cf0e263a51104ba216f06e8f054d7f Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 5 Oct 2022 14:15:35 +0200 Subject: [PATCH 09/26] Add executable permission for replaceVersion.sh --- tools/replaceVersion.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/replaceVersion.sh diff --git a/tools/replaceVersion.sh b/tools/replaceVersion.sh old mode 100644 new mode 100755 From 76a77d288e11ce9c21414984c17701c1985e19c7 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 5 Oct 2022 15:07:36 +0200 Subject: [PATCH 10/26] Fix IDE examples (#2361) - move intellij-plugin-with-experimental-shared-base into experimental examples (it still on Compose 1.0.0) - remove usage of deprecated DesktopTheme - add `[examples](experimental/examples)` to the main page --- README.md | 1 + examples/intellij-plugin/build.gradle.kts | 2 +- .../compose/widgets/LazyScrollable.kt | 35 ++++++++---------- .../.gitignore | 0 .../.run/runIde.run.xml | 0 .../README.md | 0 .../build.gradle.kts | 0 .../gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../screenshots/ide-run-configuration.png | Bin .../settings.gradle.kts | 0 .../jetbrains/compose/ComposeDemoAction.kt | 0 .../com/jetbrains/compose/IntellijTheme.kt | 0 .../compose/color/ColorLineMarkerProvider.kt | 0 .../jetbrains/compose/color/ColorPicker.kt | 0 .../kotlin/com/jetbrains/compose/color/HSV.kt | 0 .../compose/panel/ComposeToolWindow.kt | 0 .../jetbrains/compose/panel/CounterPanel.kt | 0 .../jetbrains/compose/panel/CounterState.kt | 0 .../com/jetbrains/compose/theme/Color.kt | 0 .../com/jetbrains/compose/theme/Shape.kt | 0 .../com/jetbrains/compose/theme/Theme.kt | 0 .../com/jetbrains/compose/theme/Type.kt | 0 .../compose/theme/intellij/SwingColor.kt | 0 .../theme/intellij/ThemeChangeListener.kt | 0 .../com/jetbrains/compose/widgets/Buttons.kt | 0 .../compose/widgets/LazyScrollable.kt | 0 .../com/jetbrains/compose/widgets/Loaders.kt | 0 .../jetbrains/compose/widgets/TextInputs.kt | 0 .../com/jetbrains/compose/widgets/Toggles.kt | 0 .../src/main/resources/META-INF/plugin.xml | 0 .../src/main/resources/icons/compose.svg | 0 .../compose/color/ColorPickerUITest.kt | 0 .../com/jetbrains/compose/color/HSVTest.kt | 0 37 files changed, 18 insertions(+), 20 deletions(-) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/.gitignore (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/README.md (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/build.gradle.kts (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/gradle.properties (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.jar (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/gradlew (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/gradlew.bat (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/settings.gradle.kts (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/IntellijTheme.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorLineMarkerProvider.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorPicker.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/HSV.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/ComposeToolWindow.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterPanel.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterState.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Color.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Shape.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Theme.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Type.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/SwingColor.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/ThemeChangeListener.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Buttons.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Loaders.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/TextInputs.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Toggles.kt (100%) mode change 100755 => 100644 rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/resources/META-INF/plugin.xml (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/main/resources/icons/compose.svg (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/ColorPickerUITest.kt (100%) rename {examples => experimental/examples}/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/HSVTest.kt (100%) diff --git a/README.md b/README.md index 028d82af36..964a725599 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Note that when you use Compose Multiplatform, you setup your project differently * [components](components) - custom components of Compose Multiplatform * [Split Pane](components/SplitPane) * [experimental](experimental) - experimental components and examples + * [examples](experimental/examples) - examples that use new experimental functionality * [cef](experimental/cef) - CEF integration in Jetpack Compose (somewhat outdated) * [Video Player](experimental/components/VideoPlayer) * [LWJGL integration](experimental/lwjgl-integration) - An example showing how to integrate Compose with [LWJGL](https://www.lwjgl.org) diff --git a/examples/intellij-plugin/build.gradle.kts b/examples/intellij-plugin/build.gradle.kts index 6966fa1443..a0c46c9e59 100644 --- a/examples/intellij-plugin/build.gradle.kts +++ b/examples/intellij-plugin/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.compose.compose plugins { - id("org.jetbrains.intellij") version "1.6.0" + id("org.jetbrains.intellij") version "1.9.0" java kotlin("jvm") id("org.jetbrains.compose") diff --git a/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt b/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt index e5bba421a0..c898fa0804 100755 --- a/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt +++ b/examples/intellij-plugin/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt @@ -1,6 +1,5 @@ package com.jetbrains.compose.widgets -import androidx.compose.desktop.DesktopTheme import androidx.compose.foundation.background import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.lazy.LazyColumn @@ -27,28 +26,26 @@ import androidx.compose.ui.unit.dp @Composable fun LazyScrollable() { MaterialTheme { - DesktopTheme { - Box( - modifier = Modifier.fillMaxSize() - .padding(10.dp) - ) { + Box( + modifier = Modifier.fillMaxSize() + .padding(10.dp) + ) { - val state = rememberLazyListState() - val itemCount = 100 + val state = rememberLazyListState() + val itemCount = 100 - LazyColumn(Modifier.fillMaxSize().padding(end = 12.dp), state) { - items(itemCount) { x -> - TextBox("Item in ScrollableColumn #$x") - Spacer(modifier = Modifier.height(5.dp)) - } + LazyColumn(Modifier.fillMaxSize().padding(end = 12.dp), state) { + items(itemCount) { x -> + TextBox("Item in ScrollableColumn #$x") + Spacer(modifier = Modifier.height(5.dp)) } - VerticalScrollbar( - modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), - adapter = rememberScrollbarAdapter( - scrollState = state - ) - ) } + VerticalScrollbar( + modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), + adapter = rememberScrollbarAdapter( + scrollState = state + ) + ) } } } diff --git a/examples/intellij-plugin-with-experimental-shared-base/.gitignore b/experimental/examples/intellij-plugin-with-experimental-shared-base/.gitignore similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/.gitignore rename to experimental/examples/intellij-plugin-with-experimental-shared-base/.gitignore diff --git a/examples/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml b/experimental/examples/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml rename to experimental/examples/intellij-plugin-with-experimental-shared-base/.run/runIde.run.xml diff --git a/examples/intellij-plugin-with-experimental-shared-base/README.md b/experimental/examples/intellij-plugin-with-experimental-shared-base/README.md similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/README.md rename to experimental/examples/intellij-plugin-with-experimental-shared-base/README.md diff --git a/examples/intellij-plugin-with-experimental-shared-base/build.gradle.kts b/experimental/examples/intellij-plugin-with-experimental-shared-base/build.gradle.kts similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/build.gradle.kts rename to experimental/examples/intellij-plugin-with-experimental-shared-base/build.gradle.kts diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/gradle.properties rename to experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.jar b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.jar rename to experimental/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.jar diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties rename to experimental/examples/intellij-plugin-with-experimental-shared-base/gradle/wrapper/gradle-wrapper.properties diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradlew b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/gradlew rename to experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew diff --git a/examples/intellij-plugin-with-experimental-shared-base/gradlew.bat b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew.bat similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/gradlew.bat rename to experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew.bat diff --git a/examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png b/experimental/examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png rename to experimental/examples/intellij-plugin-with-experimental-shared-base/screenshots/ide-run-configuration.png diff --git a/examples/intellij-plugin-with-experimental-shared-base/settings.gradle.kts b/experimental/examples/intellij-plugin-with-experimental-shared-base/settings.gradle.kts similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/settings.gradle.kts rename to experimental/examples/intellij-plugin-with-experimental-shared-base/settings.gradle.kts diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/ComposeDemoAction.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/IntellijTheme.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/IntellijTheme.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/IntellijTheme.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/IntellijTheme.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorLineMarkerProvider.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorLineMarkerProvider.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorLineMarkerProvider.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorLineMarkerProvider.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorPicker.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorPicker.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorPicker.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/ColorPicker.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/HSV.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/HSV.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/HSV.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/color/HSV.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/ComposeToolWindow.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/ComposeToolWindow.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/ComposeToolWindow.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/ComposeToolWindow.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterPanel.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterPanel.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterPanel.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterPanel.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterState.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterState.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterState.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/panel/CounterState.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Color.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Color.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Color.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Color.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Shape.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Shape.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Shape.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Shape.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Theme.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Theme.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Theme.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Theme.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Type.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Type.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Type.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/Type.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/SwingColor.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/SwingColor.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/SwingColor.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/SwingColor.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/ThemeChangeListener.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/ThemeChangeListener.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/ThemeChangeListener.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/theme/intellij/ThemeChangeListener.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Buttons.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Buttons.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Buttons.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Buttons.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/LazyScrollable.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Loaders.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Loaders.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Loaders.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Loaders.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/TextInputs.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/TextInputs.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/TextInputs.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/TextInputs.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Toggles.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Toggles.kt old mode 100755 new mode 100644 similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Toggles.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/kotlin/com/jetbrains/compose/widgets/Toggles.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/META-INF/plugin.xml b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/META-INF/plugin.xml similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/resources/META-INF/plugin.xml rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/META-INF/plugin.xml diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/icons/compose.svg b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/icons/compose.svg similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/main/resources/icons/compose.svg rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/main/resources/icons/compose.svg diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/ColorPickerUITest.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/ColorPickerUITest.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/ColorPickerUITest.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/ColorPickerUITest.kt diff --git a/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/HSVTest.kt b/experimental/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/HSVTest.kt similarity index 100% rename from examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/HSVTest.kt rename to experimental/examples/intellij-plugin-with-experimental-shared-base/src/test/kotlin/com/jetbrains/compose/color/HSVTest.kt From 548639023b2b61d3c309c624f455d076ed74b3d0 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 5 Oct 2022 17:50:57 +0200 Subject: [PATCH 11/26] Update template versions (#2362) --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../multiplatform-template/android/build.gradle.kts | 8 ++++---- .../android/src/main/AndroidManifest.xml | 2 +- .../multiplatform-template/common/build.gradle.kts | 10 +++++----- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/templates/desktop-template/gradle/wrapper/gradle-wrapper.properties b/templates/desktop-template/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/templates/desktop-template/gradle/wrapper/gradle-wrapper.properties +++ b/templates/desktop-template/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/templates/multiplatform-template/android/build.gradle.kts b/templates/multiplatform-template/android/build.gradle.kts index 3d06374e92..13073d45fb 100644 --- a/templates/multiplatform-template/android/build.gradle.kts +++ b/templates/multiplatform-template/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdkVersion(31) + compileSdk = 32 defaultConfig { - minSdkVersion(21) - targetSdkVersion(31) + minSdk = 26 + targetSdk = 32 versionCode = 1 versionName = "1.0" } @@ -22,5 +22,5 @@ android { dependencies { implementation(project(":common")) - implementation("androidx.activity:activity-compose:1.3.0") + implementation("androidx.activity:activity-compose:1.5.0") } \ No newline at end of file diff --git a/templates/multiplatform-template/android/src/main/AndroidManifest.xml b/templates/multiplatform-template/android/src/main/AndroidManifest.xml index f4fea5dec1..8a21a18925 100644 --- a/templates/multiplatform-template/android/src/main/AndroidManifest.xml +++ b/templates/multiplatform-template/android/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ + > diff --git a/templates/multiplatform-template/common/build.gradle.kts b/templates/multiplatform-template/common/build.gradle.kts index e9dea64bcf..4c46b87189 100644 --- a/templates/multiplatform-template/common/build.gradle.kts +++ b/templates/multiplatform-template/common/build.gradle.kts @@ -22,19 +22,19 @@ kotlin { } named("androidMain") { dependencies { - api("androidx.appcompat:appcompat:1.3.1") - api("androidx.core:core-ktx:1.6.0") + api("androidx.appcompat:appcompat:1.5.1") + api("androidx.core:core-ktx:1.8.0") } } } } android { - compileSdkVersion(31) + compileSdk = 32 defaultConfig { - minSdkVersion(21) - targetSdkVersion(31) + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/templates/multiplatform-template/gradle/wrapper/gradle-wrapper.properties b/templates/multiplatform-template/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/templates/multiplatform-template/gradle/wrapper/gradle-wrapper.properties +++ b/templates/multiplatform-template/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/templates/web-template/gradle/wrapper/gradle-wrapper.properties b/templates/web-template/gradle/wrapper/gradle-wrapper.properties index 2e6e5897b5..ae04661ee7 100644 --- a/templates/web-template/gradle/wrapper/gradle-wrapper.properties +++ b/templates/web-template/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 69cf0f4c14902aeac96a634750bef9477f5f62a1 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 5 Oct 2022 19:08:24 +0200 Subject: [PATCH 12/26] Remove import org.jetbrains.compose.compose (#2363) It is no longer needed, it adds implicitly --- examples/codeviewer/desktop/build.gradle.kts | 1 - examples/falling-balls/build.gradle.kts | 1 - examples/imageviewer/common/build.gradle.kts | 2 -- examples/imageviewer/desktop/build.gradle.kts | 1 - examples/intellij-plugin/build.gradle.kts | 2 -- examples/issues/common/build.gradle.kts | 2 -- examples/issues/desktop/build.gradle.kts | 1 - examples/notepad/build.gradle.kts | 1 - examples/todoapp-lite/common/build.gradle.kts | 2 -- examples/todoapp-lite/desktop/build.gradle.kts | 1 - examples/todoapp/android/build.gradle.kts | 2 -- .../src/main/kotlin/multiplatform-compose-setup.gradle.kts | 2 -- examples/todoapp/desktop/build.gradle.kts | 1 - examples/todoapp/web/build.gradle.kts | 1 - examples/visual-effects/build.gradle.kts | 1 - examples/web-compose-in-js/build.gradle.kts | 2 -- examples/widgets-gallery/common/build.gradle.kts | 2 -- examples/widgets-gallery/desktop/build.gradle.kts | 1 - templates/desktop-template/build.gradle.kts | 1 - templates/multiplatform-template/common/build.gradle.kts | 2 -- templates/multiplatform-template/desktop/build.gradle.kts | 1 - templates/web-template/build.gradle.kts | 1 - 22 files changed, 31 deletions(-) diff --git a/examples/codeviewer/desktop/build.gradle.kts b/examples/codeviewer/desktop/build.gradle.kts index b1c2566a7b..e7263fd745 100644 --- a/examples/codeviewer/desktop/build.gradle.kts +++ b/examples/codeviewer/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/falling-balls/build.gradle.kts b/examples/falling-balls/build.gradle.kts index 18cfc5e907..afa3c552ef 100644 --- a/examples/falling-balls/build.gradle.kts +++ b/examples/falling-balls/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.tasks.KotlinCompile diff --git a/examples/imageviewer/common/build.gradle.kts b/examples/imageviewer/common/build.gradle.kts index f956ba0d9d..3a67917bbe 100755 --- a/examples/imageviewer/common/build.gradle.kts +++ b/examples/imageviewer/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") diff --git a/examples/imageviewer/desktop/build.gradle.kts b/examples/imageviewer/desktop/build.gradle.kts index 7365a9e788..2116a0481a 100755 --- a/examples/imageviewer/desktop/build.gradle.kts +++ b/examples/imageviewer/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/intellij-plugin/build.gradle.kts b/examples/intellij-plugin/build.gradle.kts index a0c46c9e59..d060be0232 100644 --- a/examples/intellij-plugin/build.gradle.kts +++ b/examples/intellij-plugin/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("org.jetbrains.intellij") version "1.9.0" java diff --git a/examples/issues/common/build.gradle.kts b/examples/issues/common/build.gradle.kts index e71878fa48..798637826f 100644 --- a/examples/issues/common/build.gradle.kts +++ b/examples/issues/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") diff --git a/examples/issues/desktop/build.gradle.kts b/examples/issues/desktop/build.gradle.kts index 39d1ebc1f0..b2c4eae1bb 100644 --- a/examples/issues/desktop/build.gradle.kts +++ b/examples/issues/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/notepad/build.gradle.kts b/examples/notepad/build.gradle.kts index 86d04093e6..20b11e9744 100644 --- a/examples/notepad/build.gradle.kts +++ b/examples/notepad/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/todoapp-lite/common/build.gradle.kts b/examples/todoapp-lite/common/build.gradle.kts index 692211784e..af3568551d 100755 --- a/examples/todoapp-lite/common/build.gradle.kts +++ b/examples/todoapp-lite/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") diff --git a/examples/todoapp-lite/desktop/build.gradle.kts b/examples/todoapp-lite/desktop/build.gradle.kts index e634f8ca9c..81678409de 100755 --- a/examples/todoapp-lite/desktop/build.gradle.kts +++ b/examples/todoapp-lite/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/todoapp/android/build.gradle.kts b/examples/todoapp/android/build.gradle.kts index 15cdab46f0..ab9775030b 100755 --- a/examples/todoapp/android/build.gradle.kts +++ b/examples/todoapp/android/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.application") kotlin("android") diff --git a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts b/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts index dd7083a01d..15749498b9 100644 --- a/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts +++ b/examples/todoapp/buildSrc/src/main/kotlin/multiplatform-compose-setup.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") id("kotlin-multiplatform") diff --git a/examples/todoapp/desktop/build.gradle.kts b/examples/todoapp/desktop/build.gradle.kts index b1f790b076..4f7dc9d7dc 100755 --- a/examples/todoapp/desktop/build.gradle.kts +++ b/examples/todoapp/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/examples/todoapp/web/build.gradle.kts b/examples/todoapp/web/build.gradle.kts index 07ddd968d5..47024f8202 100755 --- a/examples/todoapp/web/build.gradle.kts +++ b/examples/todoapp/web/build.gradle.kts @@ -1,5 +1,4 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension -import org.jetbrains.compose.compose plugins { kotlin("multiplatform") diff --git a/examples/visual-effects/build.gradle.kts b/examples/visual-effects/build.gradle.kts index 231c515a30..8fabdf370a 100644 --- a/examples/visual-effects/build.gradle.kts +++ b/examples/visual-effects/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.tasks.KotlinCompile diff --git a/examples/web-compose-in-js/build.gradle.kts b/examples/web-compose-in-js/build.gradle.kts index 7914f863a5..6a2ea7c9a6 100644 --- a/examples/web-compose-in-js/build.gradle.kts +++ b/examples/web-compose-in-js/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { kotlin("multiplatform") id("org.jetbrains.compose") diff --git a/examples/widgets-gallery/common/build.gradle.kts b/examples/widgets-gallery/common/build.gradle.kts index d502f9525d..7e1d3865b2 100644 --- a/examples/widgets-gallery/common/build.gradle.kts +++ b/examples/widgets-gallery/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") diff --git a/examples/widgets-gallery/desktop/build.gradle.kts b/examples/widgets-gallery/desktop/build.gradle.kts index 43706a4d6b..aeaf89a327 100644 --- a/examples/widgets-gallery/desktop/build.gradle.kts +++ b/examples/widgets-gallery/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/templates/desktop-template/build.gradle.kts b/templates/desktop-template/build.gradle.kts index 23b948a759..fcabd18e01 100644 --- a/templates/desktop-template/build.gradle.kts +++ b/templates/desktop-template/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/templates/multiplatform-template/common/build.gradle.kts b/templates/multiplatform-template/common/build.gradle.kts index 4c46b87189..eb05262148 100644 --- a/templates/multiplatform-template/common/build.gradle.kts +++ b/templates/multiplatform-template/common/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.compose.compose - plugins { id("com.android.library") kotlin("multiplatform") diff --git a/templates/multiplatform-template/desktop/build.gradle.kts b/templates/multiplatform-template/desktop/build.gradle.kts index 18042da48d..e2f2d8466f 100644 --- a/templates/multiplatform-template/desktop/build.gradle.kts +++ b/templates/multiplatform-template/desktop/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { diff --git a/templates/web-template/build.gradle.kts b/templates/web-template/build.gradle.kts index 8959f52ec4..2414d946d4 100644 --- a/templates/web-template/build.gradle.kts +++ b/templates/web-template/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension From 30a3156438280fc04fcde554fef03338b8f091a9 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Wed, 5 Oct 2022 19:09:45 +0200 Subject: [PATCH 13/26] multiplatform-template. update AGP version --- templates/multiplatform-template/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index c3fa47e4a5..a1c8cafe90 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -3,5 +3,5 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.10 -agp.version=7.0.4 +agp.version=7.1.3 compose.version=1.2.0-beta02 From a6c5640013781e183d96f81dbb5dfd055c4fc6e2 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Sat, 8 Oct 2022 16:42:50 +0200 Subject: [PATCH 14/26] Update Compose --- compose/frameworks/support | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/frameworks/support b/compose/frameworks/support index 1bb6945afd..24287113c7 160000 --- a/compose/frameworks/support +++ b/compose/frameworks/support @@ -1 +1 @@ -Subproject commit 1bb6945afd06f4d1b2274ea8d0a959fdc33b4687 +Subproject commit 24287113c7c7d9e0138fb5c645a732ee6109cdc6 From 7ad4492f43f39b71d5a8ab83c01f707f802285e1 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Mon, 10 Oct 2022 16:40:04 +0200 Subject: [PATCH 15/26] Migrate to 1.2.0-rc01 (#2382) --- ci/compose-uber-jar/gradle.properties | 2 +- components/gradle.properties | 4 ++-- examples/codeviewer/gradle.properties | 4 ++-- examples/falling-balls/gradle.properties | 4 ++-- .../example/imageviewer/view/Draggable.kt | 3 +-- .../imageviewer/model/DesktopContentState.kt | 10 +++------- .../example/imageviewer/view/MainScreen.kt | 6 ++---- .../kotlin/example/imageviewer/view/Toast.kt | 18 +++++------------- examples/imageviewer/gradle.properties | 4 ++-- examples/intellij-plugin/gradle.properties | 4 ++-- examples/issues/gradle.properties | 4 ++-- examples/notepad/gradle.properties | 4 ++-- examples/todoapp-lite/gradle.properties | 4 ++-- .../example/todo/common/ui/TodoEditUi.kt | 2 +- .../kotlin/example/todo/desktop/Main.kt | 6 +----- examples/todoapp/gradle.properties | 4 +--- examples/visual-effects/gradle.properties | 4 ++-- examples/web-compose-bird/gradle.properties | 2 +- examples/web-compose-in-js/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 4 ++-- gradle-plugins/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 4 ++-- .../multiplatform-template/gradle.properties | 4 ++-- templates/web-template/gradle.properties | 2 +- tutorials/Getting_Started/README.md | 4 ++-- tutorials/Web/Getting_Started/README.md | 2 +- web/gradle.properties | 2 +- 29 files changed, 49 insertions(+), 70 deletions(-) diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 293f8c3ab2..928c9b5bce 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 kotlin.code.style=official diff --git a/components/gradle.properties b/components/gradle.properties index 2d1cbfc56e..83e0be4449 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -3,6 +3,6 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ -kotlin.version=1.7.10 +kotlin.version=1.7.20 # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index ef72cbf492..0d0509e3b2 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.7.10 +kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index d880388dbc..8d7f796b90 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 diff --git a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/Draggable.kt b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/Draggable.kt index f9f3b30bcf..eabbadc4ef 100755 --- a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/Draggable.kt +++ b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/Draggable.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.gestures.detectDragGestures import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.input.pointer.consumePositionChange import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset @@ -28,7 +27,7 @@ fun Draggable( ) { change, dragAmount -> dragHandler.drag(dragAmount) onUpdate?.invoke() - change.consumePositionChange() + change.consume() } } ) { diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/DesktopContentState.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/DesktopContentState.kt index 73daf71680..36e0983da8 100644 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/DesktopContentState.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/DesktopContentState.kt @@ -3,8 +3,8 @@ package example.imageviewer.model import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.window.WindowState -import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.toComposeImageBitmap import example.imageviewer.ResString import example.imageviewer.core.FilterType import example.imageviewer.model.filtration.FiltersManager @@ -18,13 +18,9 @@ import example.imageviewer.utils.cropBitmapByScale import example.imageviewer.utils.toByteArray import java.awt.image.BufferedImage import java.io.File -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.delay import org.jetbrains.skia.Image object ContentState { @@ -250,7 +246,7 @@ object ContentState { drag ) ) - ).asImageBitmap() + ).toComposeImageBitmap() } fun swipeNext() { @@ -358,7 +354,7 @@ private object MainImageWrapper { } private fun copy(bitmap: BufferedImage) : BufferedImage { - var result = BufferedImage(bitmap.width, bitmap.height, bitmap.type) + val result = BufferedImage(bitmap.width, bitmap.height, bitmap.type) val graphics = result.createGraphics() graphics.drawImage(bitmap, 0, 0, result.width, result.height, null) return result diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt index df9d1d3e2e..edf1f4b27b 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt @@ -16,7 +16,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Card -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Divider import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -24,13 +23,12 @@ import androidx.compose.material.Text import androidx.compose.material.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.toComposeImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import example.imageviewer.ResString @@ -169,7 +167,7 @@ fun Miniature( Image( org.jetbrains.skia.Image.makeFromEncoded( toByteArray(picture.image) - ).asImageBitmap(), + ).toComposeImageBitmap(), contentDescription = null, modifier = Modifier.height(70.dp) .width(90.dp) diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/Toast.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/Toast.kt index 5e5b290fba..d214552818 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/Toast.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/Toast.kt @@ -7,18 +7,13 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Surface import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import example.imageviewer.style.Foreground import example.imageviewer.style.ToastBackground -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay -import kotlinx.coroutines.launch enum class ToastDuration(val value: Int) { Short(1000), Long(3000) @@ -53,13 +48,10 @@ fun Toast( color = Foreground ) } - DisposableEffect(Unit) { - GlobalScope.launch { - delay(duration.value.toLong()) - isShown = false - visibility.value = false - } - onDispose { } + LaunchedEffect(Unit) { + delay(duration.value.toLong()) + isShown = false + visibility.value = false } } } diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index ef72cbf492..0d0509e3b2 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.7.10 +kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index d880388dbc..8d7f796b90 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 98b0b5847b..4361eecc3e 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -19,6 +19,6 @@ kotlin.code.style=official android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true -kotlin.version=1.7.10 +kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index be18f523d0..eb043fcdae 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.7.10 -compose.version=1.2.0-beta02 \ No newline at end of file +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index ef72cbf492..0d0509e3b2 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.7.10 +kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt index 93e1bb1e03..0a805b44da 100644 --- a/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt +++ b/examples/todoapp/common/compose-ui/src/commonMain/kotlin/example/todo/common/ui/TodoEditUi.kt @@ -46,7 +46,7 @@ fun TodoEditContent(component: TodoEdit) { onValueChange = component::onTextChanged ) - Row(modifier = Modifier.padding(8.dp)) { + Row(modifier = Modifier.padding(8.dp), verticalAlignment = Alignment.CenterVertically) { Text(text = "Completed") Spacer(modifier = Modifier.width(8.dp)) diff --git a/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt b/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt index 08a7de3b87..005a1f5f36 100644 --- a/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt +++ b/examples/todoapp/desktop/src/jvmMain/kotlin/example/todo/desktop/Main.kt @@ -1,6 +1,5 @@ package example.todo.desktop -import androidx.compose.desktop.DesktopTheme import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface @@ -11,7 +10,6 @@ import androidx.compose.ui.window.rememberWindowState import com.arkivanov.decompose.ComponentContext import com.arkivanov.decompose.DefaultComponentContext import com.arkivanov.decompose.extensions.compose.jetbrains.lifecycle.LifecycleController -import com.arkivanov.decompose.extensions.compose.jetbrains.rememberRootComponent import com.arkivanov.essenty.lifecycle.LifecycleRegistry import com.arkivanov.mvikotlin.main.store.DefaultStoreFactory import com.badoo.reaktive.coroutinesinterop.asScheduler @@ -40,9 +38,7 @@ fun main() { ) { Surface(modifier = Modifier.fillMaxSize()) { MaterialTheme { - DesktopTheme { - TodoRootContent(root) - } + TodoRootContent(root) } } } diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index 6f6c73b830..ed8a5683e0 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -22,7 +22,5 @@ kotlin.code.style=official org.gradle.parallel=true org.gradle.caching=true kotlin.native.disableCompilerDaemon=true - -#todo remove -Pkotlin.version=1.6.20 from Xcode project, when stable version on Compose with Koltin 1.6.20 or later released kotlin.version=1.7.10 -compose.version=1.2.0-beta02 \ No newline at end of file +compose.version=1.2.0-rc01 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index d880388dbc..8d7f796b90 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index d880388dbc..9d34324fa3 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/web-compose-in-js/gradle.properties b/examples/web-compose-in-js/gradle.properties index 01a11c4581..38934502a1 100644 --- a/examples/web-compose-in-js/gradle.properties +++ b/examples/web-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.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index d880388dbc..9d34324fa3 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index d880388dbc..9d34324fa3 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index f128da9f9b..0ee0925dfb 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -19,6 +19,6 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 agp.version=7.1.3 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index d16b53a8b6..19e6acd629 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.2.0-beta02 +compose.version=1.2.0-rc01 # The latest version of Compose Compiler used by Gradle plugin. Used only in tests. compose.tests.compiler.version=1.3.2 # The latest version of Kotlin compatible with compose.tests.compiler.version. Used only in tests. diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index ff18ff3858..26e187ab18 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official -kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +kotlin.version=1.7.20 +compose.version=1.2.0-rc01 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index a1c8cafe90..088246bcef 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -2,6 +2,6 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official -kotlin.version=1.7.10 +kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index ff18ff3858..0cce43b6f3 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/tutorials/Getting_Started/README.md b/tutorials/Getting_Started/README.md index 8f4f07f526..89a44ed78b 100644 --- a/tutorials/Getting_Started/README.md +++ b/tutorials/Getting_Started/README.md @@ -45,7 +45,7 @@ For the latest versions, see the [latest versions](https://github.com/JetBrains/ ``` plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta02" + id("org.jetbrains.compose") version "1.2.0-rc01" } ``` @@ -81,7 +81,7 @@ import org.jetbrains.compose.compose plugins { kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta02" + id("org.jetbrains.compose") version "1.2.0-rc01" } repositories { diff --git a/tutorials/Web/Getting_Started/README.md b/tutorials/Web/Getting_Started/README.md index d93405c203..6e93128c83 100644 --- a/tutorials/Web/Getting_Started/README.md +++ b/tutorials/Web/Getting_Started/README.md @@ -39,7 +39,7 @@ pluginManagement { // Add compose gradle plugin plugins { kotlin("multiplatform") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-beta02" + id("org.jetbrains.compose") version "1.2.0-rc01" } // Add maven repositories diff --git a/web/gradle.properties b/web/gradle.properties index 54a084def3..4562441bc4 100644 --- a/web/gradle.properties +++ b/web/gradle.properties @@ -1,4 +1,4 @@ -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 compose.web.buildSamples=false compose.web.tests.integration.withFirefox compose.web.tests.skip.benchmarks=false From 06193c44ad114edf9a42bc4684f9e53374f64eea Mon Sep 17 00:00:00 2001 From: "dima.avdeev" <99798741+dima-avdeev-jb@users.noreply.github.com> Date: Mon, 10 Oct 2022 20:26:37 +0400 Subject: [PATCH 16/26] update version in experimental uikit samples (#2377) --- experimental/examples/chat-mpp/build.gradle.kts | 6 +++--- experimental/examples/chat-mpp/gradle.properties | 4 ++-- .../examples/falling-balls-mpp/build.gradle.kts | 10 +++++----- .../examples/falling-balls-mpp/gradle.properties | 4 ++-- .../commonMain/kotlin/bouncingBalls/BouncingBalls.kt | 2 +- .../gradle.properties | 2 +- experimental/examples/minesweeper/build.gradle.kts | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/experimental/examples/chat-mpp/build.gradle.kts b/experimental/examples/chat-mpp/build.gradle.kts index 04d04a3f1c..e8e2e4ce02 100644 --- a/experimental/examples/chat-mpp/build.gradle.kts +++ b/experimental/examples/chat-mpp/build.gradle.kts @@ -193,11 +193,11 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile::class.ja } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/experimental/examples/chat-mpp/gradle.properties b/experimental/examples/chat-mpp/gradle.properties index ac08e49268..88a8835e45 100644 --- a/experimental/examples/chat-mpp/gradle.properties +++ b/experimental/examples/chat-mpp/gradle.properties @@ -7,8 +7,8 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.binary.memoryModel=experimental compose.desktop.verbose=true android.useAndroidX=true -compose.version=1.2.0-alpha01-dev725 -kotlin.version=1.6.21 +compose.version=1.2.0-rc01 +kotlin.version=1.7.10 agp.version=7.0.4 kotlin.js.webpack.major.version=4 org.jetbrains.compose.experimental.jscanvas.enabled=true diff --git a/experimental/examples/falling-balls-mpp/build.gradle.kts b/experimental/examples/falling-balls-mpp/build.gradle.kts index 01b05ff5e4..dde5bb35e1 100644 --- a/experimental/examples/falling-balls-mpp/build.gradle.kts +++ b/experimental/examples/falling-balls-mpp/build.gradle.kts @@ -104,8 +104,8 @@ kotlin { dependsOn(commonMain) kotlin.srcDirs("src/jvmMain/kotlin") dependencies { - api("androidx.appcompat:appcompat:1.4.1") - implementation("androidx.activity:activity-compose:1.4.0") + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("androidx.activity:activity-compose:1.5.0") } } @@ -223,11 +223,11 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile::class.ja } android { - compileSdk = 31 + compileSdk = 32 defaultConfig { - minSdk = 21 - targetSdk = 31 + minSdk = 26 + targetSdk = 32 } compileOptions { diff --git a/experimental/examples/falling-balls-mpp/gradle.properties b/experimental/examples/falling-balls-mpp/gradle.properties index db26638086..30d9b6db3a 100644 --- a/experimental/examples/falling-balls-mpp/gradle.properties +++ b/experimental/examples/falling-balls-mpp/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx3g -compose.version=1.2.0-alpha01-dev725 -kotlin.version=1.6.21 +compose.version=1.2.0-rc01 +kotlin.version=1.7.10 kotlin.code.style=official kotlin.native.cacheKind=none kotlin.native.useEmbeddableCompilerJar=true diff --git a/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt b/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt index 9ca392be3b..58f5b65adb 100644 --- a/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt +++ b/experimental/examples/falling-balls-mpp/src/commonMain/kotlin/bouncingBalls/BouncingBalls.kt @@ -26,7 +26,7 @@ import kotlin.math.max import kotlin.math.sin import kotlin.random.Random -private inline fun Modifier.noRippleClickable(crossinline onClick: (Offset) -> Unit): Modifier = +private fun Modifier.noRippleClickable(onClick: (Offset) -> Unit): Modifier = composed { clickable( indication = null, diff --git a/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties index 68c9c73f4e..4eac158e21 100644 --- a/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties +++ b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-beta02 +compose.version=1.2.0-rc01 diff --git a/experimental/examples/minesweeper/build.gradle.kts b/experimental/examples/minesweeper/build.gradle.kts index 2c216cb93b..3226e24669 100644 --- a/experimental/examples/minesweeper/build.gradle.kts +++ b/experimental/examples/minesweeper/build.gradle.kts @@ -15,8 +15,8 @@ buildscript { } plugins { - kotlin("multiplatform") version "1.6.21" - id("org.jetbrains.compose") version "1.2.0-alpha01-dev725" + kotlin("multiplatform") version "1.7.10" + id("org.jetbrains.compose") version "1.2.0-rc01" } version = "1.0-SNAPSHOT" From 500cad098232c8583f8eeb934c472eee4a2ee653 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Tue, 11 Oct 2022 10:19:04 +0400 Subject: [PATCH 17/26] chmod +x gradlew --- .../intellij-plugin-with-experimental-shared-base/gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew diff --git a/experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradlew old mode 100644 new mode 100755 From a1a3cdc15d4d4cb1056c917f69e98621deeeaa19 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" <99798741+dima-avdeev-jb@users.noreply.github.com> Date: Tue, 11 Oct 2022 17:39:01 +0400 Subject: [PATCH 18/26] totoapp compose 1.2.0-rc01 (#2387) * compose 1.2.0-rc01 * apply eymar patch to fix js --- examples/todoapp/buildSrc/gradle.properties | 4 ++-- examples/todoapp/gradle.properties | 2 ++ examples/todoapp/web/build.gradle.kts | 5 +++-- .../todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt | 4 ---- .../web/src/jsMain/kotlin/example/todo/web/Components.kt | 5 +---- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/examples/todoapp/buildSrc/gradle.properties b/examples/todoapp/buildSrc/gradle.properties index 5aab64a51b..6c6da6c883 100755 --- a/examples/todoapp/buildSrc/gradle.properties +++ b/examples/todoapp/buildSrc/gradle.properties @@ -1,3 +1,3 @@ # TODO can we get rid of duplication with root gradle.properties? -kotlin.version=1.6.10 -compose.version=1.1.0 +kotlin.version=1.7.10 +compose.version=1.2.0-rc01 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index ed8a5683e0..a284a0decd 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -22,5 +22,7 @@ kotlin.code.style=official org.gradle.parallel=true org.gradle.caching=true kotlin.native.disableCompilerDaemon=true + +#TODO also change version in buildSrc/gradle.properties kotlin.version=1.7.10 compose.version=1.2.0-rc01 \ No newline at end of file diff --git a/examples/todoapp/web/build.gradle.kts b/examples/todoapp/web/build.gradle.kts index 47024f8202..89e634612b 100755 --- a/examples/todoapp/web/build.gradle.kts +++ b/examples/todoapp/web/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension +import org.jetbrains.compose.compose plugins { kotlin("multiplatform") @@ -17,7 +18,7 @@ kotlin { named("jsMain") { dependencies { implementation(compose.runtime) - implementation(compose.web.widgets) + implementation(compose.web.core) implementation(project(":common:utils")) implementation(project(":common:database")) implementation(project(":common:root")) @@ -37,6 +38,6 @@ kotlin { afterEvaluate { rootProject.extensions.configure { versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.9.0" + versions.webpackCli.version = "4.10.0" } } diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt index 61af087e5e..b59b5b8467 100644 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt +++ b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/App.kt @@ -8,9 +8,7 @@ import example.todo.common.database.DefaultTodoSharedDatabase import example.todo.common.database.todoDatabaseDriver import example.todo.common.root.integration.TodoRootComponent import kotlinx.browser.document -import org.jetbrains.compose.web.css.Style import org.jetbrains.compose.web.renderComposable -import org.jetbrains.compose.web.ui.Styles import org.w3c.dom.HTMLElement fun main() { @@ -28,8 +26,6 @@ fun main() { lifecycle.resume() renderComposable(root = rootElement) { - Style(Styles) - TodoRootUi(root) } } diff --git a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt index 0262901d3a..829dab3323 100644 --- a/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt +++ b/examples/todoapp/web/src/jsMain/kotlin/example/todo/web/Components.kt @@ -1,8 +1,6 @@ package example.todo.web import androidx.compose.runtime.Composable -import org.jetbrains.compose.common.material.Text -import org.jetbrains.compose.common.ui.ExperimentalComposeWebWidgetsApi import org.jetbrains.compose.web.attributes.InputType import org.jetbrains.compose.web.css.AlignItems import org.jetbrains.compose.web.css.DisplayStyle @@ -66,7 +64,6 @@ fun Card(attrs: AttrBuilderContext<*> = {}, content: @Composable () -> Unit) { } } -@OptIn(ExperimentalComposeWebWidgetsApi::class) @Composable fun MaterialTextArea( id: String, @@ -95,7 +92,7 @@ fun MaterialTextArea( ) Label(forId = id) { - Text(text = label) + Text(value = label) } } } From 00207fc59acce2503614182dbf1b7fcc78a536f3 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 17:01:58 +0200 Subject: [PATCH 19/26] Update CHANGELOG.md (#2374) Co-authored-by: Oleksandr Karpovich --- CHANGELOG.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05e0571420..cfe50545de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,84 @@ +# 1.2.0 (October 2022) +## Common + +### Features +* [Allow to use Compose on multiple Kotlin versions](https://github.com/JetBrains/compose-jb/pull/2366) +* [`import org.jetbrains.compose.compose` is no longer needed in build.gradle.kts](https://github.com/JetBrains/compose-jb/pull/2215) +* [Allow to use a custom Compose Compiler](https://github.com/JetBrains/compose-jb/pull/2347) + +## Desktop + +### Features +* [Support Kotlin 1.7.20](https://github.com/JetBrains/compose-jb/pull/2357) +* [ProGuard integration for packaging](https://github.com/JetBrains/compose-jb/pull/2313) +* [New experimental event API (onClick, onDrag, WindowInfo.keyboardModifiers)](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Mouse_Events#new-experimental-onclick-handlers-only-for-desktop-jvm-platform) +* Focus + * [Make clickable, mouseClickable, toggleable request focus onClick](https://github.com/JetBrains/androidx/pull/257) + * [Toggle a toggleable component on Space key](https://github.com/JetBrains/androidx/pull/262) + * [Make Slider change the value with onKeyEvent for: all arrows, PgDn, PdUp, Home, End buttons](https://github.com/JetBrains/androidx/pull/254) + * [Navigate drop down menu items using up and down arrows](https://github.com/JetBrains/androidx/pull/259) +* [Ability to override text context menu globally](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Context_Menu#custom-text-context-menu) +* [Context menu implementation for integrating into Swing applications](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Context_Menu#swing-interoperability) +* [Animated image component](https://github.com/JetBrains/compose-jb/pull/2015) +* [Show a new window/dialog on the same display](https://github.com/JetBrains/androidx/pull/312) +* [Change default Font on MacOs to San Francisco](https://github.com/JetBrains/androidx/pull/296) +* Support [performKeyInput](https://github.com/JetBrains/androidx/pull/278), [performMouseInput, performTextInput](https://github.com/JetBrains/androidx/pull/260) in tests. +* Focus switches seamlessly between Swing and Compose components using [SwingPanel](https://github.com/JetBrains/androidx/pull/229) or [ComposePanel](https://github.com/JetBrains/androidx/pull/228) +* [Documentation for how to package apps using Conveyor](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Native_distributions_and_local_execution#available-tools) + +### Fixes +* [Fix IDEA plugin compatability](https://github.com/JetBrains/compose-jb/pull/2318) +* Fixes for Right-to-Left languages support + * [LayoutDirection is detected from the system settings](https://github.com/JetBrains/androidx/pull/264) + * [Fix RTL selection in a multiline text](https://github.com/JetBrains/androidx/pull/285) + * [Fix cursor visual position at BiDi transition](https://github.com/JetBrains/androidx/pull/286) + * [Fix the cursor position after the '\n' character in RTL](https://github.com/JetBrains/androidx/pull/268) + * [In placeAutoMirrored for RTL, calculate the placement position using the placeable width respecting the constraints](https://github.com/JetBrains/androidx/pull/267) + * [Placing the root content properly for RTL layout](https://github.com/JetBrains/androidx/pull/265) +* TextField + * [Fix the cursor position when clicking at a position after a line-break](https://github.com/JetBrains/androidx/pull/284) + * [Fix selection with End, Home](https://github.com/JetBrains/androidx/pull/279) + * [Fix the cursor height on a new empty line](https://github.com/JetBrains/androidx/pull/277) +* [Fix DesktopMenu and DesktopAlertDialog to invoke dismiss callback once](https://github.com/JetBrains/androidx/pull/256) +* [Fix a large icon in macOs menu](https://github.com/JetBrains/androidx/pull/248) +* [Fix hover in LazyColumn](https://github.com/JetBrains/androidx/pull/249) +* [Fix pointerHoverIcon: update icon when it's changed conditionally](https://github.com/JetBrains/androidx/pull/231) +* [Fix focusable parameter for Window and Dialog](https://github.com/JetBrains/androidx/pull/225) +* [Fix 2 SplitPanel minor bugs](https://github.com/JetBrains/compose-jb/pull/2175) +* [Fix `java.lang.IllegalStateException: cannot open system clipboard` crash](https://github.com/JetBrains/skiko/pull/586) +* [Fix `System.setProperty("skiko.renderApi", "SOFTWARE"` on macOS](https://github.com/JetBrains/skiko/pull/599) + +### API changes +* [Deprecate experimental pointerMoveFilter in favor of onPointerEvent](https://github.com/JetBrains/androidx/pull/247) +* [Deprecate experimental Modifier.mouseClickable in favor of Modifier.onClick](https://github.com/JetBrains/androidx/pull/243) + +## Web + +### Features +* Support Kotlin 1.7.10 +* [Add support for transition in CSS api](https://github.com/JetBrains/compose-jb/pull/2228) +* [Add missing `background-blend-mode` property](https://github.com/JetBrains/compose-jb/pull/2128) +* [SVG: Publish custom attr functions](https://github.com/JetBrains/compose-jb/pull/2127) +* [Add list overload for `classes`](https://github.com/JetBrains/compose-jb/pull/2094) +* [Add support of dl, dt and dd](https://github.com/JetBrains/compose-jb/pull/1922) + +### Fixes +* [Add pom information and license to Web artifacts](https://github.com/JetBrains/compose-jb/pull/2195) + +### API changes +* [Deprecate 3 overloads of StyleScope.borderWidth with wrong parameter names](https://github.com/JetBrains/compose-jb/pull/2297) +* [Remove deprecated compose.web.web-widgets from the source code](https://github.com/JetBrains/compose-jb/pull/2294) +* [Remove unnecessary parameter for `required` attribute](https://github.com/JetBrains/compose-jb/pull/1988) + +## Updated dependencies +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: +* [Compiler 1.3.2](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.3.2) +* [Runtime 1.2.1](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.2.1) +* [UI 1.2.1](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.2.1) +* [Foundation 1.2.1](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.2.1) +* [Material 1.2.1](https://developer.android.com/jetpack/androidx/releases/compose-material#1.2.1) +* [Material3 1.0.0-alpha14](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.0.0-alpha14) + # 1.1.1 (Mar 2022) ## Desktop @@ -42,7 +123,6 @@ fun main() = application { - [Implement experimental accessibility support for Windows](https://github.com/JetBrains/compose-jb/tree/master/tutorials/Accessibility) - [Implement accessibility focus tracking by Tab](https://github.com/JetBrains/compose-jb/issues/1772) - All bugfixes/features between Jetpack Compose 1.1.0-beta02 and 1.1.0 (see the release notes for each module [here](https://developer.android.com/jetpack/androidx/releases/compose)) -- Android target depends on Jetpack Compose 1.1.0. ### Fixes - Fixes for TextField ([1](https://github.com/JetBrains/compose-jb/issues/1834), [2](https://github.com/JetBrains/compose-jb/issues/1615), [3](https://github.com/JetBrains/compose-jb/issues/1781), [4](https://github.com/JetBrains/compose-jb/issues/1670)) @@ -77,6 +157,15 @@ fun main() = singleWindowApplication { ``` - [`PointerEvent.awtEvent`, `KeyEvent.awtEvent` are deprecated](https://github.com/JetBrains/androidx/pull/198), use `PointerEvent.awtEventOrNull`, `KeyEvent.awtEventOrNull` instead. The event can be null, if it isn't sent by AWT (for example, Compose can send synthetic Move events on relayout) +## Updated dependencies +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: +* [Compiler 1.1.0](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.1.0) +* [Runtime 1.1.0](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.1.0) +* [UI 1.1.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.1.0) +* [Foundation 1.1.0](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.1.0) +* [Material 1.1.0](https://developer.android.com/jetpack/androidx/releases/compose-material#1.1.0) +* [Material3 1.0.0-alpha05](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.0.0-alpha05) + # 1.0.1 (Dec 2021) This is basically 1.0.0 that works with Kotlin 1.6.10 @@ -103,6 +192,15 @@ This is basically 1.0.0 that works with Kotlin 1.6.10 - [Some functions were made internal (either not related to compose-web or not intended for usage in apps): buildCSS , StylePropertyList.nativeEquals , variableValue , buildCSSStyleRule , buildKeyframes , jsObject , CSSKeyframesRule.appendRule](https://github.com/JetBrains/compose-jb/pull/1509/files) - CSSMediaRule: functions feature and combine were made extensions functions on GenericStyleSheetBuilder. This makes them consistent with the rest of functions which create CSSMediaQuery.MediaFeature instances +## Updated dependencies +This version of Compose Multiplatform is based on the next Jetpack Compose libraries: +* [Compiler 1.1.0-beta02](https://developer.android.com/jetpack/androidx/releases/compose-compiler#1.1.0-beta02) +* [Runtime 1.1.0-beta02](https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.1.0-beta02) +* [UI 1.1.0-beta02](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.1.0-beta02) +* [Foundation 1.1.0-beta02](https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.1.0-beta02) +* [Material 1.1.0-beta02](https://developer.android.com/jetpack/androidx/releases/compose-material#1.1.0-beta02) +* [Material3 1.0.0-alpha03](https://developer.android.com/jetpack/androidx/releases/compose-material3#1.0.0-alpha03) + # 1.0.0-beta (Oct 2021) ## Common - no Android artifacts are published anymore. Google-published artifacts are referenced instead. This approach eliminates compatibility issues. From 37e33fba29333cf1e6d2cab4a7ac2864e2f54ade Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 17:49:32 +0200 Subject: [PATCH 20/26] Compose 1.2.0-rc02 --- ci/compose-uber-jar/gradle.properties | 2 +- components/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/todoapp/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/web-compose-bird/gradle.properties | 2 +- examples/web-compose-in-js/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- gradle-plugins/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 2 +- templates/multiplatform-template/gradle.properties | 2 +- templates/web-template/gradle.properties | 2 +- tools/replaceVersion.sh | 2 ++ tutorials/Getting_Started/README.md | 8 ++++---- tutorials/Web/Getting_Started/README.md | 4 ++-- web/gradle.properties | 2 +- 24 files changed, 29 insertions(+), 27 deletions(-) diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 928c9b5bce..93bde230f0 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 kotlin.code.style=official diff --git a/components/gradle.properties b/components/gradle.properties index 83e0be4449..cd7a566a45 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -5,4 +5,4 @@ kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ kotlin.version=1.7.20 # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 0d0509e3b2..057ba731c3 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index 8d7f796b90..f4ebd03dbc 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 0d0509e3b2..057ba731c3 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index 8d7f796b90..f4ebd03dbc 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 4361eecc3e..493e76ce9a 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -21,4 +21,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index eb043fcdae..7ad2c4ba67 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.7.20 -compose.version=1.2.0-rc01 \ No newline at end of file +compose.version=1.2.0-rc02 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 0d0509e3b2..057ba731c3 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index a284a0decd..382de8358c 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -25,4 +25,4 @@ kotlin.native.disableCompilerDaemon=true #TODO also change version in buildSrc/gradle.properties kotlin.version=1.7.10 -compose.version=1.2.0-rc01 \ No newline at end of file +compose.version=1.2.0-rc02 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index 8d7f796b90..f4ebd03dbc 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index 9d34324fa3..58633d497f 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/web-compose-in-js/gradle.properties b/examples/web-compose-in-js/gradle.properties index 38934502a1..9b4af6cb5b 100644 --- a/examples/web-compose-in-js/gradle.properties +++ b/examples/web-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.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index 9d34324fa3..58633d497f 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index 9d34324fa3..58633d497f 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 0ee0925dfb..994f4e3481 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 agp.version=7.1.3 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index 19e6acd629..00e78bc4dd 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.2.0-rc01 +compose.version=1.2.0-rc02 # The latest version of Compose Compiler used by Gradle plugin. Used only in tests. compose.tests.compiler.version=1.3.2 # The latest version of Kotlin compatible with compose.tests.compiler.version. Used only in tests. diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index 26e187ab18..237a26f3b5 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index 088246bcef..642b834dac 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -4,4 +4,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index 0cce43b6f3..6d87d2da72 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/tools/replaceVersion.sh b/tools/replaceVersion.sh index 5b620083ea..5fff3033ac 100755 --- a/tools/replaceVersion.sh +++ b/tools/replaceVersion.sh @@ -46,6 +46,8 @@ replaceVersionInFile() { replaceVersion 'id("org.jetbrains.compose") version ".*"' 'id("org.jetbrains.compose") version "'"$COMPOSE_VERSION"'"' $1 replaceVersion '"org.jetbrains.compose:compose-gradle-plugin:.*"' '"org.jetbrains.compose:compose-gradle-plugin:'"$COMPOSE_VERSION"'"' $1 replaceVersion '^kotlin.version=.*' 'kotlin.version='"$KOTLIN_VERSION"'' $1 + replaceVersion 'kotlin("multiplatform") version ".*"' 'kotlin("multiplatform") version "'"$KOTLIN_VERSION"'"' $1 + replaceVersion 'kotlin("jvm") version ".*"' 'kotlin("jvm") version "'"$KOTLIN_VERSION"'"' $1 } replaceVersionInFolder() { diff --git a/tutorials/Getting_Started/README.md b/tutorials/Getting_Started/README.md index 89a44ed78b..b85d8998e1 100644 --- a/tutorials/Getting_Started/README.md +++ b/tutorials/Getting_Started/README.md @@ -44,8 +44,8 @@ The Compose plugin version used in the wizard above might not be the latest. Upd For the latest versions, see the [latest versions](https://github.com/JetBrains/compose-jb/releases) site and the [Kotlin](https://kotlinlang.org/) site. ``` plugins { - kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-rc01" + kotlin("jvm") version "1.7.20" + id("org.jetbrains.compose") version "1.2.0-rc02" } ``` @@ -80,8 +80,8 @@ Then create `build.gradle.kts` with the following content: import org.jetbrains.compose.compose plugins { - kotlin("jvm") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-rc01" + kotlin("jvm") version "1.7.20" + id("org.jetbrains.compose") version "1.2.0-rc02" } repositories { diff --git a/tutorials/Web/Getting_Started/README.md b/tutorials/Web/Getting_Started/README.md index 6e93128c83..c9f93f53cd 100644 --- a/tutorials/Web/Getting_Started/README.md +++ b/tutorials/Web/Getting_Started/README.md @@ -38,8 +38,8 @@ pluginManagement { ``` kotlin // Add compose gradle plugin plugins { - kotlin("multiplatform") version "1.6.10" - id("org.jetbrains.compose") version "1.2.0-rc01" + kotlin("multiplatform") version "1.7.10" + id("org.jetbrains.compose") version "1.2.0-rc02" } // Add maven repositories diff --git a/web/gradle.properties b/web/gradle.properties index 4562441bc4..fcfaf12fc5 100644 --- a/web/gradle.properties +++ b/web/gradle.properties @@ -1,4 +1,4 @@ -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 compose.web.buildSamples=false compose.web.tests.integration.withFirefox compose.web.tests.skip.benchmarks=false From eae694ad3d044eb0cacc110101d3edfc928b072f Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 18:59:20 +0200 Subject: [PATCH 21/26] Replace package by packageDistributionForCurrentOS (#2390) `package` is deprecated --- examples/codeviewer/README.md | 2 +- examples/imageviewer/README.md | 2 +- examples/issues/README.md | 2 +- examples/notepad/README.md | 2 +- examples/todoapp-lite/README.md | 2 +- examples/todoapp/README.md | 2 +- examples/widgets-gallery/README.md | 2 +- tutorials/Native_distributions_and_local_execution/README.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/codeviewer/README.md b/examples/codeviewer/README.md index d9dc237229..172adda0ce 100644 --- a/examples/codeviewer/README.md +++ b/examples/codeviewer/README.md @@ -8,7 +8,7 @@ MPP Code Viewer example for desktop/android written in Multiplatform Compose lib ### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/examples/imageviewer/README.md b/examples/imageviewer/README.md index 64a1794e50..3d79c52613 100755 --- a/examples/imageviewer/README.md +++ b/examples/imageviewer/README.md @@ -7,7 +7,7 @@ An example of image gallery for remote server image viewing, based on Jetpack Co ### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/examples/issues/README.md b/examples/issues/README.md index 4e3a73f80c..e6361890ce 100644 --- a/examples/issues/README.md +++ b/examples/issues/README.md @@ -8,7 +8,7 @@ Github Issues viewer example written in Jetpack Compose UI library. ### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/examples/notepad/README.md b/examples/notepad/README.md index 26da73ce5f..15b106a9f5 100644 --- a/examples/notepad/README.md +++ b/examples/notepad/README.md @@ -7,7 +7,7 @@ Notepad example for desktop written in Compose for Desktop library, using Compos ### Building native desktop distribution ``` -./gradlew package +./gradlew packageDistributionForCurrentOS # outputs are written to build/compose/binaries ``` ![Desktop](screenshots/notepad.gif) \ No newline at end of file diff --git a/examples/todoapp-lite/README.md b/examples/todoapp-lite/README.md index c35555d64a..e0526a0209 100755 --- a/examples/todoapp-lite/README.md +++ b/examples/todoapp-lite/README.md @@ -9,7 +9,7 @@ Supported targets: Android and Desktop. ### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/examples/todoapp/README.md b/examples/todoapp/README.md index 783993574a..5a348940b7 100755 --- a/examples/todoapp/README.md +++ b/examples/todoapp/README.md @@ -40,7 +40,7 @@ Features: #### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/examples/widgets-gallery/README.md b/examples/widgets-gallery/README.md index 396033e39e..262f9759d0 100644 --- a/examples/widgets-gallery/README.md +++ b/examples/widgets-gallery/README.md @@ -15,7 +15,7 @@ demonstrating how to use various Material widgets. ### Building native desktop distribution ``` -./gradlew :desktop:package +./gradlew :desktop:packageDistributionForCurrentOS # outputs are written to desktop/build/compose/binaries ``` diff --git a/tutorials/Native_distributions_and_local_execution/README.md b/tutorials/Native_distributions_and_local_execution/README.md index b62a6d4fbc..fd23282714 100755 --- a/tutorials/Native_distributions_and_local_execution/README.md +++ b/tutorials/Native_distributions_and_local_execution/README.md @@ -62,7 +62,7 @@ The plugin creates the following tasks: Note, that there is no cross-compilation support available at the moment, so the formats can only be built using the specific OS (e.g. to build `.dmg` you have to use macOS). Tasks that are not compatible with the current OS are skipped by default. -* `package` is a [lifecycle](https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:lifecycle_tasks) task, +* `packageDistributionForCurrentOS` is a [lifecycle](https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:lifecycle_tasks) task, aggregating all package tasks for an application. * `packageUberJarForCurrentOS` is used to create a single jar file, containing all dependencies for current OS. The task is available starting from the M2 release. From 308a1f170dde2ed9ac16281afd4e652a7ee02969 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 19:31:19 +0200 Subject: [PATCH 22/26] Fix Todo example (#2391) * Fix Todo example In 1.1.1 we remove Dispatcher.Main from dependencies, because Compose can be embedded into different platform with their own Dispatcher.Main (IDEA, for example). Because of that, end applications should include it explicitly if they want to use it. * Refactor --- examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt | 5 +++++ examples/todoapp/desktop/build.gradle.kts | 1 + 2 files changed, 6 insertions(+) diff --git a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt b/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt index bc5b542f1d..57e28c9d2e 100644 --- a/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt +++ b/examples/todoapp/buildSrc/buildSrc/src/main/kotlin/Deps.kt @@ -20,6 +20,11 @@ object Deps { val testAnnotationsCommon get() = "org.jetbrains.kotlin:kotlin-test-annotations-common:$VERSION" } + object Coroutines { + private val VERSION get() = "1.6.4" + val swing get() = "org.jetbrains.kotlinx:kotlinx-coroutines-swing:$VERSION" + } + object Compose { private val VERSION get() = properties["compose.version"] val gradlePlugin get() = "org.jetbrains.compose:compose-gradle-plugin:$VERSION" diff --git a/examples/todoapp/desktop/build.gradle.kts b/examples/todoapp/desktop/build.gradle.kts index 4f7dc9d7dc..db755cbebd 100755 --- a/examples/todoapp/desktop/build.gradle.kts +++ b/examples/todoapp/desktop/build.gradle.kts @@ -18,6 +18,7 @@ kotlin { implementation(project(":common:database")) implementation(project(":common:root")) implementation(project(":common:compose-ui")) + implementation(Deps.JetBrains.Coroutines.swing) implementation(Deps.ArkIvanov.Decompose.decompose) implementation(Deps.ArkIvanov.Decompose.extensionsCompose) implementation(Deps.ArkIvanov.MVIKotlin.mvikotlin) From 09ee6b8bc7fd9119775c3ce9de6afb77d74e19bb Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Tue, 11 Oct 2022 21:36:06 +0400 Subject: [PATCH 23/26] todoapp and experimental to 1.2.0-rc02 --- examples/todoapp/buildSrc/gradle.properties | 2 +- experimental/examples/chat-mpp/gradle.properties | 2 +- experimental/examples/falling-balls-mpp/gradle.properties | 2 +- .../gradle.properties | 2 +- experimental/examples/minesweeper/build.gradle.kts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/todoapp/buildSrc/gradle.properties b/examples/todoapp/buildSrc/gradle.properties index 6c6da6c883..fa9ca12895 100755 --- a/examples/todoapp/buildSrc/gradle.properties +++ b/examples/todoapp/buildSrc/gradle.properties @@ -1,3 +1,3 @@ # TODO can we get rid of duplication with root gradle.properties? kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/experimental/examples/chat-mpp/gradle.properties b/experimental/examples/chat-mpp/gradle.properties index 88a8835e45..70880bc2ed 100644 --- a/experimental/examples/chat-mpp/gradle.properties +++ b/experimental/examples/chat-mpp/gradle.properties @@ -7,7 +7,7 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.binary.memoryModel=experimental compose.desktop.verbose=true android.useAndroidX=true -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 kotlin.version=1.7.10 agp.version=7.0.4 kotlin.js.webpack.major.version=4 diff --git a/experimental/examples/falling-balls-mpp/gradle.properties b/experimental/examples/falling-balls-mpp/gradle.properties index 30d9b6db3a..ea3c3d3b2d 100644 --- a/experimental/examples/falling-balls-mpp/gradle.properties +++ b/experimental/examples/falling-balls-mpp/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx3g -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 kotlin.version=1.7.10 kotlin.code.style=official kotlin.native.cacheKind=none diff --git a/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties index 4eac158e21..8cf2d8fd5a 100644 --- a/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties +++ b/experimental/examples/intellij-plugin-with-experimental-shared-base/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc01 +compose.version=1.2.0-rc02 diff --git a/experimental/examples/minesweeper/build.gradle.kts b/experimental/examples/minesweeper/build.gradle.kts index 3226e24669..3d7b2e393a 100644 --- a/experimental/examples/minesweeper/build.gradle.kts +++ b/experimental/examples/minesweeper/build.gradle.kts @@ -16,7 +16,7 @@ buildscript { plugins { kotlin("multiplatform") version "1.7.10" - id("org.jetbrains.compose") version "1.2.0-rc01" + id("org.jetbrains.compose") version "1.2.0-rc02" } version = "1.0-SNAPSHOT" From dcff5b2c836ef83983f0be4e03f4322c87096bb2 Mon Sep 17 00:00:00 2001 From: "dima.avdeev" Date: Tue, 11 Oct 2022 21:49:27 +0400 Subject: [PATCH 24/26] todoapp android compileSdk = 32 --- examples/todoapp/android/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/todoapp/android/build.gradle.kts b/examples/todoapp/android/build.gradle.kts index ab9775030b..83ae73020d 100755 --- a/examples/todoapp/android/build.gradle.kts +++ b/examples/todoapp/android/build.gradle.kts @@ -5,11 +5,11 @@ plugins { } android { - compileSdkVersion(31) + compileSdk = 32 defaultConfig { - minSdkVersion(23) - targetSdkVersion(31) + minSdk = 26 + targetSdk = 32 versionCode = 1 versionName = "1.0" } From 188abdfabddc9cf28c081516196bb48345b8033e Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 19:54:25 +0200 Subject: [PATCH 25/26] Refactor visual-effects and notepad --- .../src/main/kotlin/common/AppResources.kt | 1 + .../visual-effects/src/main/kotlin/HappyNY.kt | 40 +++++++++---------- .../src/main/kotlin/WaveEffect.kt | 40 ++++++++++++------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/examples/notepad/src/main/kotlin/common/AppResources.kt b/examples/notepad/src/main/kotlin/common/AppResources.kt index a1fd633023..865e53e040 100644 --- a/examples/notepad/src/main/kotlin/common/AppResources.kt +++ b/examples/notepad/src/main/kotlin/common/AppResources.kt @@ -34,5 +34,6 @@ fun rememberVectorPainter(image: ImageVector, tintColor: Color) = name = image.name, tintColor = tintColor, tintBlendMode = image.tintBlendMode, + autoMirror = false, content = { _, _ -> RenderVectorGroup(group = image.root) } ) diff --git a/examples/visual-effects/src/main/kotlin/HappyNY.kt b/examples/visual-effects/src/main/kotlin/HappyNY.kt index 74bd53ddc8..ca1d797055 100644 --- a/examples/visual-effects/src/main/kotlin/HappyNY.kt +++ b/examples/visual-effects/src/main/kotlin/HappyNY.kt @@ -23,11 +23,11 @@ import java.lang.Math.random import kotlin.math.* import kotlin.random.Random -val width = 1200 -val height = 800 -val snowCount = 80 -val starCount = 60 -val rocketPartsCount = 30 +const val width = 1200 +const val height = 800 +const val snowCount = 80 +const val starCount = 60 +const val rocketPartsCount = 30 data class SnowFlake( var x: Dp, @@ -42,14 +42,14 @@ data class SnowFlake( data class Star(val x: Dp, val y: Dp, val color: Color, val size: Dp) -val HNYString = "Happy New Year!" +const val HNYString = "Happy New Year!" class DoubleRocket(val particle: Particle) { - val STATE_ROCKET = 0 - val STATE_SMALL_ROCKETS = 1 + private val STATE_ROCKET = 0 + private val STATE_SMALL_ROCKETS = 1 var state = STATE_ROCKET var rockets: Array = emptyArray() - fun checkState(time: Long) { + private fun checkState(time: Long) { if (particle.vy > -3.0 && state == STATE_ROCKET) { explode(time) } @@ -69,7 +69,7 @@ class DoubleRocket(val particle: Particle) { } } - fun reset() { + private fun reset() { if (particle.vx < 0) return //to stop drawing after the second rocket. This could be commented out state = STATE_ROCKET particle.x = if (particle.vx > 0) width - 0.0 else 0.0 @@ -78,9 +78,9 @@ class DoubleRocket(val particle: Particle) { particle.vy = -12.5 } - fun explode(time: Long) { + private fun explode(time: Long) { val colors = arrayOf(Color(0xff, 0, 0), Color(192, 255, 192), Color(192, 212, 255)) - rockets = Array(7) { + rockets = Array(7) { val v = 1.2f + 1.0 * random() val angle = 2 * PI * random() Rocket( @@ -131,8 +131,8 @@ class Rocket(val particle: Particle, val color: Color, val startTime: Long = 0) } } - fun explode() { - parts = Array(rocketPartsCount) { + private fun explode() { + 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) @@ -202,7 +202,7 @@ val rocket = DoubleRocket(Particle(0.0, 1000.0, 2.1, -12.5, Color.White)) @Composable fun NYWindow(onCloseRequest: () -> Unit) { val windowState = remember { WindowState(width = width.dp, height = height.dp) } - Window(onCloseRequest = {}, undecorated = true, transparent = true, state = windowState) { + Window(onCloseRequest = onCloseRequest, undecorated = true, transparent = true, state = windowState) { NYContent() } } @@ -249,9 +249,7 @@ fun NYContent() { remember { prepareStarsAndSnowFlakes(stars, snowFlakes) } Surface( - modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp)) - .pointerMoveFilter(onMove = { false; }, - onEnter = { false; }, onExit = { false; }), + modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp)), color = Color.Black, shape = RoundedCornerShape(20.dp) ) { @@ -266,7 +264,7 @@ fun NYContent() { } if (!started) { //animation starts with delay, so there is some time to start recording - if (time - startTime > 7000000000 && time - startTime < 7100000000) println("ready!") + if (time - startTime in 7000000001..7099999999) println("ready!") if (time - startTime > 10000000000) { startTime = time //restarting timer started = true @@ -303,7 +301,7 @@ fun NYContent() { color = Color.White ) - if (started) { //delay to be able start recording + if (started) { //delay to be able to start recording //HNY var i = 0 val angle = (HNYString.length / 2 * 5) * -1.0f @@ -370,7 +368,7 @@ fun flickeringAlpha(time: Long): Float { val time = (time / 10000000) % 100 var result = 0.2f if (time > 75) { - result = result + 0.6f * ((time - 75) % 3) / 3 + result += 0.6f * ((time - 75) % 3) / 3 } return result } diff --git a/examples/visual-effects/src/main/kotlin/WaveEffect.kt b/examples/visual-effects/src/main/kotlin/WaveEffect.kt index c311f12519..1f09d139e9 100644 --- a/examples/visual-effects/src/main/kotlin/WaveEffect.kt +++ b/examples/visual-effects/src/main/kotlin/WaveEffect.kt @@ -10,6 +10,8 @@ import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.* import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.PointerEventType +import androidx.compose.ui.input.pointer.onPointerEvent import androidx.compose.ui.input.pointer.pointerMoveFilter import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -20,7 +22,7 @@ import kotlin.math.* @Composable fun WaveEffect(onCloseRequest: () -> Unit, showControls: Boolean) { - var windowState = remember { WindowState(width = 1200.dp, height = 800.dp) } + val windowState = remember { WindowState(width = 1200.dp, height = 800.dp) } Window(onCloseRequest = {}, undecorated = true, transparent = true, state = windowState) { Grid() } @@ -70,8 +72,16 @@ fun Grid() { Surface( modifier = Modifier.fillMaxSize().padding(5.dp).shadow(3.dp, RoundedCornerShape(20.dp)) - .pointerMoveFilter(onMove = { mouseX = it.x.toInt(); mouseY = it.y.toInt(); false; }, - onEnter = { State.mouseUsed = true; false; }, onExit = { State.mouseUsed = false; false; }), + .onPointerEvent(PointerEventType.Move) { + mouseX = it.changes.first().position.x.toInt() + mouseY = it.changes.first().position.y.toInt() + } + .onPointerEvent(PointerEventType.Enter) { + State.mouseUsed = true + } + .onPointerEvent(PointerEventType.Exit) { + State.mouseUsed = false + }, color = Color(0, 0, 0), shape = RoundedCornerShape(20.dp) ) { @@ -80,13 +90,13 @@ fun Grid() { var y = 10 // initial position val shift = 25 var evenRow = false - var pointerOffsetX = (centerX / 2) - var pointerOffsety = (centerY / 2) + val pointerOffsetX = (centerX / 2) + val pointerOffsety = (centerY / 2) while (y < 790) { x = if (evenRow) 10 + shift else 10 while (x < 1190) { - var size: Int = size(x, y, pointerOffsetX, pointerOffsety) - var color = boxColor(x, y, time, pointerOffsetX, pointerOffsety) + 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) x += shift * 2 } @@ -111,19 +121,19 @@ fun Grid() { fun HighPanel(mouseX: Int, mouseY: Int) { Text( "Compose", - androidx.compose.ui.Modifier.offset(270.dp, 600.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 270, 700)), + Modifier.offset(270.dp, 600.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 270, 700)), color = colorMouse(mouseX, mouseY, 270, 700), fontWeight = FontWeight.Bold ) Text( "Multiplatform", - androidx.compose.ui.Modifier.offset(350.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 550, 800)), + Modifier.offset(350.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 550, 800)), color = colorMouse(mouseX, mouseY, 550, 800), fontWeight = FontWeight.Bold ) Text( "1.0", - androidx.compose.ui.Modifier.offset(800.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 800, 800)), + Modifier.offset(800.dp, 700.dp).scale(7.0f).alpha(alpha(mouseX, mouseY, 800, 800)), color = colorMouse(mouseX, mouseY, 800, 800), fontWeight = FontWeight.Bold ) @@ -137,7 +147,7 @@ private fun alpha(mouseX: Int, mouseY: Int, x: Int, y: Int): Float { } private fun colorMouse(mouseX: Int, mouseY: Int, x: Int, y: Int): Color { - var d = distance(mouseX, mouseY, x, y) / 450 + val d = distance(mouseX, mouseY, x, y) / 450 val color1 = Color(0x6B, 0x57, 0xFF) val color2 = Color(0xFE, 0x28, 0x57) val color3 = Color(0xFD, 0xB6, 0x0D) @@ -178,7 +188,7 @@ private fun size(x: Int, y: Int, mouseX: Int, mouseY: Int): Int { var result = 5 if (y > 550 && x < 550) return result if (y > 650 && x < 900) return result - var distance2 = sqrt((x - mouseX) * (x - mouseX) + (y - mouseY) * (y - mouseY).toDouble()) / 200 + val distance2 = sqrt((x - mouseX) * (x - mouseX) + (y - mouseY) * (y - mouseY).toDouble()) / 200 val scale: Double = (if (distance2 < 1) { addSize * (1 - distance2) } else 0.toDouble()) @@ -205,13 +215,13 @@ private fun boxColor(x: Int, y: Int, time: Long, mouseX: Int, mouseY: Int): Colo var color = Color.White if (c1 <= 0) { - var d = c2 / (c2 + c3) + val d = c2 / (c2 + c3) color = balancedColor(d, color2, color3) } else if (c2 <= 0) { - var d = c3 / (c1 + c3) + val d = c3 / (c1 + c3) color = balancedColor(d, color3, color1) } else if (c3 <= 0) { - var d = c1 / (c1 + c2) + val d = c1 / (c1 + c2) color = balancedColor(d, color1, color2) } From 4ee708c5984aa39a0056975aa38025bae04b75ab Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Tue, 11 Oct 2022 21:20:53 +0200 Subject: [PATCH 26/26] Upgrade examples to Compose 1.2.0 --- ci/compose-uber-jar/gradle.properties | 2 +- components/gradle.properties | 2 +- examples/codeviewer/gradle.properties | 2 +- examples/falling-balls/gradle.properties | 2 +- examples/imageviewer/gradle.properties | 2 +- examples/intellij-plugin/gradle.properties | 2 +- examples/issues/gradle.properties | 2 +- examples/notepad/gradle.properties | 2 +- examples/todoapp-lite/gradle.properties | 2 +- examples/todoapp/gradle.properties | 2 +- examples/visual-effects/gradle.properties | 2 +- examples/web-compose-bird/gradle.properties | 2 +- examples/web-compose-in-js/gradle.properties | 2 +- examples/web-landing/gradle.properties | 2 +- examples/web-with-react/gradle.properties | 2 +- examples/widgets-gallery/gradle.properties | 2 +- gradle-plugins/gradle.properties | 2 +- templates/desktop-template/gradle.properties | 2 +- templates/multiplatform-template/gradle.properties | 2 +- templates/web-template/gradle.properties | 2 +- tutorials/Getting_Started/README.md | 4 ++-- tutorials/Web/Getting_Started/README.md | 2 +- web/gradle.properties | 2 +- 23 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 93bde230f0..c40ccc968d 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=1.2.0-rc02 +compose.version=1.2.0 kotlin.code.style=official diff --git a/components/gradle.properties b/components/gradle.properties index cd7a566a45..e3465edb66 100644 --- a/components/gradle.properties +++ b/components/gradle.properties @@ -5,4 +5,4 @@ kotlin.code.style=official # __KOTLIN_COMPOSE_VERSION__ kotlin.version=1.7.20 # __LATEST_COMPOSE_RELEASE_VERSION__ -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/codeviewer/gradle.properties b/examples/codeviewer/gradle.properties index 057ba731c3..07a190fac2 100644 --- a/examples/codeviewer/gradle.properties +++ b/examples/codeviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/falling-balls/gradle.properties b/examples/falling-balls/gradle.properties index f4ebd03dbc..dbfb6452d2 100644 --- a/examples/falling-balls/gradle.properties +++ b/examples/falling-balls/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index 057ba731c3..07a190fac2 100755 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/intellij-plugin/gradle.properties b/examples/intellij-plugin/gradle.properties index f4ebd03dbc..dbfb6452d2 100644 --- a/examples/intellij-plugin/gradle.properties +++ b/examples/intellij-plugin/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/issues/gradle.properties b/examples/issues/gradle.properties index 493e76ce9a..6e0cf3e57f 100644 --- a/examples/issues/gradle.properties +++ b/examples/issues/gradle.properties @@ -21,4 +21,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/notepad/gradle.properties b/examples/notepad/gradle.properties index 7ad2c4ba67..d97adcef50 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.7.20 -compose.version=1.2.0-rc02 \ No newline at end of file +compose.version=1.2.0 \ No newline at end of file diff --git a/examples/todoapp-lite/gradle.properties b/examples/todoapp-lite/gradle.properties index 057ba731c3..07a190fac2 100755 --- a/examples/todoapp-lite/gradle.properties +++ b/examples/todoapp-lite/gradle.properties @@ -21,4 +21,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/todoapp/gradle.properties b/examples/todoapp/gradle.properties index 382de8358c..19d08d0797 100755 --- a/examples/todoapp/gradle.properties +++ b/examples/todoapp/gradle.properties @@ -25,4 +25,4 @@ kotlin.native.disableCompilerDaemon=true #TODO also change version in buildSrc/gradle.properties kotlin.version=1.7.10 -compose.version=1.2.0-rc02 \ No newline at end of file +compose.version=1.2.0 \ No newline at end of file diff --git a/examples/visual-effects/gradle.properties b/examples/visual-effects/gradle.properties index f4ebd03dbc..dbfb6452d2 100644 --- a/examples/visual-effects/gradle.properties +++ b/examples/visual-effects/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/web-compose-bird/gradle.properties b/examples/web-compose-bird/gradle.properties index 58633d497f..ba79da52a7 100644 --- a/examples/web-compose-bird/gradle.properties +++ b/examples/web-compose-bird/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/web-compose-in-js/gradle.properties b/examples/web-compose-in-js/gradle.properties index 9b4af6cb5b..07f5071b57 100644 --- a/examples/web-compose-in-js/gradle.properties +++ b/examples/web-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.7.10 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/web-landing/gradle.properties b/examples/web-landing/gradle.properties index 58633d497f..ba79da52a7 100644 --- a/examples/web-landing/gradle.properties +++ b/examples/web-landing/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/web-with-react/gradle.properties b/examples/web-with-react/gradle.properties index 58633d497f..ba79da52a7 100644 --- a/examples/web-with-react/gradle.properties +++ b/examples/web-with-react/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/examples/widgets-gallery/gradle.properties b/examples/widgets-gallery/gradle.properties index 994f4e3481..64161edf1a 100644 --- a/examples/widgets-gallery/gradle.properties +++ b/examples/widgets-gallery/gradle.properties @@ -20,5 +20,5 @@ android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc02 +compose.version=1.2.0 agp.version=7.1.3 diff --git a/gradle-plugins/gradle.properties b/gradle-plugins/gradle.properties index 00e78bc4dd..c8b8f42e47 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.2.0-rc02 +compose.version=1.2.0 # The latest version of Compose Compiler used by Gradle plugin. Used only in tests. compose.tests.compiler.version=1.3.2 # The latest version of Kotlin compatible with compose.tests.compiler.version. Used only in tests. diff --git a/templates/desktop-template/gradle.properties b/templates/desktop-template/gradle.properties index 237a26f3b5..5c878d8016 100644 --- a/templates/desktop-template/gradle.properties +++ b/templates/desktop-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.7.20 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/templates/multiplatform-template/gradle.properties b/templates/multiplatform-template/gradle.properties index 642b834dac..c32d311951 100644 --- a/templates/multiplatform-template/gradle.properties +++ b/templates/multiplatform-template/gradle.properties @@ -4,4 +4,4 @@ android.enableJetifier=true kotlin.code.style=official kotlin.version=1.7.20 agp.version=7.1.3 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/templates/web-template/gradle.properties b/templates/web-template/gradle.properties index 6d87d2da72..8f61b3884d 100644 --- a/templates/web-template/gradle.properties +++ b/templates/web-template/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 kotlin.code.style=official kotlin.version=1.7.10 -compose.version=1.2.0-rc02 +compose.version=1.2.0 diff --git a/tutorials/Getting_Started/README.md b/tutorials/Getting_Started/README.md index b85d8998e1..315e954cf9 100644 --- a/tutorials/Getting_Started/README.md +++ b/tutorials/Getting_Started/README.md @@ -45,7 +45,7 @@ For the latest versions, see the [latest versions](https://github.com/JetBrains/ ``` plugins { kotlin("jvm") version "1.7.20" - id("org.jetbrains.compose") version "1.2.0-rc02" + id("org.jetbrains.compose") version "1.2.0" } ``` @@ -81,7 +81,7 @@ import org.jetbrains.compose.compose plugins { kotlin("jvm") version "1.7.20" - id("org.jetbrains.compose") version "1.2.0-rc02" + id("org.jetbrains.compose") version "1.2.0" } repositories { diff --git a/tutorials/Web/Getting_Started/README.md b/tutorials/Web/Getting_Started/README.md index c9f93f53cd..bdcdb54070 100644 --- a/tutorials/Web/Getting_Started/README.md +++ b/tutorials/Web/Getting_Started/README.md @@ -39,7 +39,7 @@ pluginManagement { // Add compose gradle plugin plugins { kotlin("multiplatform") version "1.7.10" - id("org.jetbrains.compose") version "1.2.0-rc02" + id("org.jetbrains.compose") version "1.2.0" } // Add maven repositories diff --git a/web/gradle.properties b/web/gradle.properties index fcfaf12fc5..42de5f34c3 100644 --- a/web/gradle.properties +++ b/web/gradle.properties @@ -1,4 +1,4 @@ -compose.version=1.2.0-rc02 +compose.version=1.2.0 compose.web.buildSamples=false compose.web.tests.integration.withFirefox compose.web.tests.skip.benchmarks=false