Skip to content

Commit d606270

Browse files
WIP: Exploring Compose Runtime Integration
Can we just use MutableState inside the WorkflowNode. Current problem is finding the render() functions with the `Composer` on the class path ?
1 parent 39db0a7 commit d606270

File tree

46 files changed

+2777
-2499
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2777
-2499
lines changed

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/MaybeLoadingGatekeeperWorkflow.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry
22

3+
import androidx.compose.runtime.Composable
34
import com.squareup.benchmarks.performance.complex.poetry.instrumentation.ActionHandlingTracingInterceptor
45
import com.squareup.benchmarks.performance.complex.poetry.instrumentation.asTraceableWorker
56
import com.squareup.benchmarks.performance.complex.poetry.views.LoaderSpinner
@@ -26,6 +27,7 @@ class MaybeLoadingGatekeeperWorkflow<T : Any>(
2627
snapshot: Snapshot?
2728
): IsLoading = false
2829

30+
@Composable
2931
override fun render(
3032
renderProps: Unit,
3133
renderState: IsLoading,

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/PerformancePoemWorkflow.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry
22

3+
import androidx.compose.runtime.Composable
34
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemWorkflow.Action.ClearSelection
45
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemWorkflow.Action.HandleStanzaListOutput
56
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemWorkflow.Action.SelectNext
@@ -90,6 +91,7 @@ class PerformancePoemWorkflow(
9091
}
9192

9293
@OptIn(WorkflowUiExperimentalApi::class)
94+
@Composable
9395
override fun render(
9496
renderProps: Poem,
9597
renderState: State,

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/PerformancePoemsBrowserWorkflow.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry
22

3+
import androidx.compose.runtime.Composable
34
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemsBrowserWorkflow.State
45
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemsBrowserWorkflow.State.ComplexCall
56
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemsBrowserWorkflow.State.Initializing
@@ -71,6 +72,7 @@ class PerformancePoemsBrowserWorkflow(
7172
}
7273

7374
@OptIn(WorkflowUiExperimentalApi::class)
75+
@Composable
7476
override fun render(
7577
renderProps: List<Poem>,
7678
renderState: State,

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/instrumentation/ActionHandlingTracingInterceptor.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry.instrumentation
22

3+
import androidx.compose.runtime.Composable
34
import androidx.tracing.trace
45
import com.squareup.workflow1.BaseRenderContext
56
import com.squareup.workflow1.WorkflowAction
@@ -56,11 +57,12 @@ class ActionHandlingTracingInterceptor : WorkflowInterceptor, Resettable {
5657
}
5758
}
5859

60+
@Composable
5961
override fun <P, S, O, R> onRender(
6062
renderProps: P,
6163
renderState: S,
6264
context: BaseRenderContext<P, S, O>,
63-
proceed: (P, S, RenderContextInterceptor<P, S, O>?) -> R,
65+
proceed: @Composable (P, S, RenderContextInterceptor<P, S, O>?) -> R,
6466
session: WorkflowSession
6567
): R {
6668
return proceed(

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/instrumentation/PerformanceTracingInterceptor.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry.instrumentation
22

3+
import androidx.compose.runtime.Composable
34
import androidx.tracing.Trace
45
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemWorkflow
56
import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemsBrowserWorkflow
@@ -21,11 +22,12 @@ class PerformanceTracingInterceptor(
2122
) : WorkflowInterceptor, Resettable {
2223
private var totalRenderPasses = 0
2324

25+
@Composable
2426
override fun <P, S, O, R> onRender(
2527
renderProps: P,
2628
renderState: S,
2729
context: BaseRenderContext<P, S, O>,
28-
proceed: (P, S, RenderContextInterceptor<P, S, O>?) -> R,
30+
proceed: @Composable (P, S, RenderContextInterceptor<P, S, O>?) -> R,
2931
session: WorkflowSession
3032
): R {
3133
val isRoot = session.parent == null

benchmarks/performance-poetry/complex-poetry/src/main/java/com/squareup/benchmarks/performance/complex/poetry/instrumentation/RenderPassCountingInterceptor.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.benchmarks.performance.complex.poetry.instrumentation
22

3+
import androidx.compose.runtime.Composable
34
import com.squareup.workflow1.BaseRenderContext
45
import com.squareup.workflow1.WorkflowInterceptor
56
import com.squareup.workflow1.WorkflowInterceptor.RenderContextInterceptor
@@ -18,11 +19,12 @@ class RenderPassCountingInterceptor : WorkflowInterceptor, Resettable {
1819
lateinit var renderPassStats: RenderStats
1920
private val nodeStates: MutableMap<Long, String> = mutableMapOf()
2021

22+
@Composable
2123
override fun <P, S, O, R> onRender(
2224
renderProps: P,
2325
renderState: S,
2426
context: BaseRenderContext<P, S, O>,
25-
proceed: (P, S, RenderContextInterceptor<P, S, O>?) -> R,
27+
proceed: @Composable (P, S, RenderContextInterceptor<P, S, O>?) -> R,
2628
session: WorkflowSession
2729
): R {
2830
val isRoot = session.parent == null

build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ buildscript {
1010
classpath(libs.kotlin.serialization.gradle.plugin)
1111
classpath(libs.kotlinx.binaryCompatibility.gradle.plugin)
1212
classpath(libs.kotlin.gradle.plugin)
13+
classpath(libs.molecule.gradle.plugin)
1314
classpath(libs.google.ksp)
1415
classpath(libs.ktlint.gradle)
1516
classpath(libs.vanniktech.publish)
@@ -19,6 +20,9 @@ buildscript {
1920
mavenCentral()
2021
gradlePluginPortal()
2122
google()
23+
maven {
24+
url = uri("https://oss.sonatype.org/content/repositories/snapshots/")
25+
}
2226
// For binary compatibility validator.
2327
maven { url = uri("https://kotlin.bintray.com/kotlinx") }
2428
}

buildSrc/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ plugins {
77
repositories {
88
mavenCentral()
99
google()
10+
// For molecule SNAPSHOT
11+
maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/")}
1012
}
1113

1214
dependencies {

gradle/libs.versions.toml

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ targetSdk = "30"
99
androidx-activity = "1.3.0"
1010
androidx-appcompat = "1.3.1"
1111
androidx-benchmark = "1.1.0-rc03"
12-
androidx-compose = "1.1.0-rc01"
13-
androidx-compose-compiler = "1.1.0-rc02"
12+
compose = "1.1.0"
13+
compose-compiler = "1.1.0"
1414
androidx-constraintlayout = "2.1.2"
1515
androidx-core = "1.6.0"
1616
androidx-fragment = "1.3.6"
@@ -49,8 +49,8 @@ kotest = "5.1.0"
4949
kotlin = "1.6.10"
5050

5151
kotlinx-binary-compatibility = "0.6.0"
52-
kotlinx-coroutines = "1.5.1"
53-
# The 1.5.1 test artifact is jvm-only. The commonTest module should use 1.6.1.
52+
kotlinx-coroutines = "1.5.2"
53+
# The 1.5.2 test artifact is jvm-only. The commonTest module should use 1.6.1.
5454
kotlinx-coroutines-test-common = "1.6.1"
5555
kotlinx-serialization-json = "1.3.2"
5656
kotlinx-benchmark = "0.4.2"
@@ -64,6 +64,9 @@ mockito-core = "3.3.3"
6464
mockito-kotlin = "3.2.0"
6565

6666
mockk = "1.11.0"
67+
68+
molecule = "0.3.0-SNAPSHOT"
69+
6770
robolectric = "4.6.1"
6871

6972
rxjava2-android = "2.1.1"
@@ -100,8 +103,12 @@ kotlinx-benchmark = { id = "org.jetbrains.kotlinx.benchmark", version.ref = "kot
100103
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
101104
mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "vanniktech-publish" }
102105

106+
molecule = { id = "app.cash.molecule", version.ref = "molecule"}
107+
103108
[libraries]
104109

110+
molecule-gradle-plugin = { module = "app.cash.molecule:molecule-gradle-plugin", version.ref = "molecule"}
111+
105112
android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "androidTools" }
106113

107114
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" }
@@ -112,13 +119,17 @@ androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "a
112119

113120
androidx-macro-benchmark = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "androidx-benchmark" }
114121

115-
androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "androidx-compose" }
122+
androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" }
123+
124+
androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "compose" }
116125

117-
androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "androidx-compose" }
126+
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
127+
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose" }
128+
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }
118129

119-
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "androidx-compose" }
120-
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "androidx-compose" }
121-
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "androidx-compose" }
130+
androidx-compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "compose" }
131+
compose-runtime = { module = "org.jetbrains.compose.runtime:runtime", version.ref = "compose"}
132+
compose-compiler = { module = "org.jetbrains.compose.compiler:compiler", version.ref = "compose"}
122133

123134
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidx-constraintlayout" }
124135

@@ -203,6 +214,9 @@ mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "
203214

204215
mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
205216

217+
molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule"}
218+
molecule-testing = { module = "app.cash.molecule:molecule-testing", version.ref = "molecule"}
219+
206220
robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" }
207221

208222
rxjava2-rxandroid = { module = "io.reactivex.rxjava2:rxandroid", version.ref = "rxjava2-android" }

samples/compose-samples/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ android {
1414
compose = true
1515
}
1616
composeOptions {
17-
kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
17+
kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
1818
}
1919
}
2020

0 commit comments

Comments
 (0)