Skip to content

Introduces Activity.workflowContentView, workflowContentViewOrNull #1336

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.squareup.benchmarks.performance.complex.poetry

import android.content.pm.ApplicationInfo
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
Expand All @@ -26,9 +25,9 @@ import com.squareup.workflow1.WorkflowInterceptor
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewEnvironment.Companion.EMPTY
import com.squareup.workflow1.ui.ViewRegistry
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withEnvironment
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
Expand Down Expand Up @@ -97,13 +96,9 @@ class PerformancePoetryActivity : AppCompatActivity() {
model.renderings
}

setContentView(
WorkflowLayout(this).apply {
take(
lifecycle,
instrumentedRenderings.map { it.withEnvironment(viewEnvironment) }
)
}
workflowContentView.take(
lifecycle,
instrumentedRenderings.map { it.withEnvironment(viewEnvironment) }
)

// We can report this here as the first rendering from the Workflow is rendered synchronously.
Expand All @@ -125,7 +120,7 @@ class PerformancePoetryActivity : AppCompatActivity() {
val traceMain = intent.getBooleanExtra(EXTRA_TRACE_ALL_MAIN_THREAD_MESSAGES, false)
val traceSelectOnTimeout = intent.getBooleanExtra(EXTRA_TRACE_SELECT_TIMEOUTS, false)
val areTracingViaMainLooperCurrently = traceMain || traceSelectOnTimeout
val ableToTrace = Build.VERSION.SDK_INT != 28 && (debuggable || profileable)
val ableToTrace = debuggable || profileable
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDE called out the 28 check as redundant b/c our min SDK is now 29


if (areTracingViaMainLooperCurrently && ableToTrace) {
// Add main message tracing to see everything happening in Perfetto.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ import com.squareup.workflow1.mapRendering
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewEnvironment
import com.squareup.workflow1.ui.ViewRegistry
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.compose.withComposeInteropSupport
import com.squareup.workflow1.ui.plus
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withEnvironment
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

private val viewEnvironment =
Expand All @@ -37,13 +37,9 @@ class HelloBindingActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: HelloBindingModel by viewModels()
setContentView(
WorkflowLayout(this).apply {
take(
lifecycle = lifecycle,
renderings = model.renderings,
)
}
workflowContentView.take(
lifecycle = lifecycle,
renderings = model.renderings,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,17 @@ import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.mapRendering
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewEnvironment
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.compose.withComposeInteropSupport
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withEnvironment
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

class HelloComposeWorkflowActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val model: HelloComposeModel by viewModels()
setContentView(
WorkflowLayout(this).apply { take(lifecycle, model.renderings) }
)
workflowContentView.take(lifecycle, model.renderings)
}

class HelloComposeModel(savedState: SavedStateHandle) : ViewModel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.mapRendering
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewEnvironment
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.compose.withComposeInteropSupport
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withEnvironment
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

/**
Expand All @@ -27,9 +27,7 @@ class InlineRenderingActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: HelloBindingModel by viewModels()
setContentView(
WorkflowLayout(this).apply { take(lifecycle, model.renderings) }
)
workflowContentView.take(lifecycle, model.renderings)
}

class HelloBindingModel(savedState: SavedStateHandle) : ViewModel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ import com.squareup.workflow1.mapRendering
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewEnvironment
import com.squareup.workflow1.ui.ViewRegistry
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.compose.withComposeInteropSupport
import com.squareup.workflow1.ui.plus
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withEnvironment
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

private val viewRegistry = ViewRegistry(RecursiveComposableFactory)
Expand All @@ -38,14 +38,7 @@ class NestedRenderingsActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: NestedRenderingsModel by viewModels()
setContentView(
WorkflowLayout(this).apply {
take(
lifecycle = lifecycle,
renderings = model.renderings,
)
}
)
workflowContentView.take(lifecycle = lifecycle, renderings = model.renderings)
}

class NestedRenderingsModel(savedState: SavedStateHandle) : ViewModel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import com.squareup.sample.poetry.model.Poem
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.navigation.reportNavigation
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import timber.log.Timber
Expand All @@ -30,11 +30,7 @@ class PoetryActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: PoetryModel by viewModels()
setContentView(
WorkflowLayout(this).apply {
take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })
}
)
workflowContentView.take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import com.squareup.sample.poetry.model.Raven
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.navigation.reportNavigation
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
Expand All @@ -32,11 +32,7 @@ class RavenActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: RavenModel by viewModels()
setContentView(
WorkflowLayout(this).apply {
take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })
}
)
workflowContentView.take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })

lifecycleScope.launch {
model.waitForExit()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import com.squareup.sample.container.SampleContainers
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.navigation.reportNavigation
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
Expand All @@ -30,11 +30,7 @@ class HelloBackButtonActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)

val model: HelloBackButtonModel by viewModels()
setContentView(
WorkflowLayout(this).apply {
take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })
}
)
workflowContentView.take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })

lifecycleScope.launch {
model.waitForExit()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.squareup.sample.dungeon
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.map

class DungeonActivity : AppCompatActivity() {
Expand All @@ -16,9 +16,7 @@ class DungeonActivity : AppCompatActivity() {
val component = Component(this)
val model: TimeMachineModel by viewModels { component.timeMachineModelFactory }

val contentView = WorkflowLayout(this).apply {
take(lifecycle, model.renderings.map { it.withRegistry(component.viewRegistry) })
}
setContentView(contentView)
workflowContentView
.take(lifecycle, model.renderings.map { it.withRegistry(component.viewRegistry) })
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

class HelloWorkflowActivity : AppCompatActivity() {
Expand All @@ -22,9 +22,7 @@ class HelloWorkflowActivity : AppCompatActivity() {
// by the first call to viewModels(), and that original instance is returned by
// succeeding calls.
val model: HelloViewModel by viewModels()
setContentView(
WorkflowLayout(this).apply { take(lifecycle, model.renderings) }
)
workflowContentView.take(lifecycle, model.renderings)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import androidx.lifecycle.viewModelScope
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

class NestedOverlaysActivity : AppCompatActivity() {
Expand All @@ -23,9 +23,7 @@ class NestedOverlaysActivity : AppCompatActivity() {
// by the first call to viewModels(), and that original instance is returned by
// succeeding calls.
val model: NestedOverlaysViewModel by viewModels()
setContentView(
WorkflowLayout(this).apply { take(lifecycle, model.renderings) }
)
workflowContentView.take(lifecycle, model.renderings)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,16 @@ import androidx.lifecycle.viewModelScope
import com.squareup.workflow1.WorkflowExperimentalRuntime
import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow

class StubVisibilityActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val model: StubVisibilityModel by viewModels()
setContentView(
WorkflowLayout(this).apply { take(lifecycle, model.renderings) }
)
workflowContentView.take(lifecycle, model.renderings)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import androidx.test.espresso.IdlingResource
import com.squareup.sample.authworkflow.AuthViewFactories
import com.squareup.sample.container.SampleContainers
import com.squareup.sample.gameworkflow.TicTacToeViewFactories
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.plus
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import timber.log.Timber
Expand All @@ -27,11 +27,7 @@ class TicTacToeActivity : AppCompatActivity() {

idlingResource = component.idlingResource

setContentView(
WorkflowLayout(this).apply {
take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })
}
)
workflowContentView.take(lifecycle, model.renderings.map { it.withRegistry(viewRegistry) })

lifecycleScope.launch {
model.renderings.collect { Timber.d("rendering: %s", it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import com.squareup.workflow1.config.AndroidRuntimeConfigTools
import com.squareup.workflow1.diagnostic.tracing.TracingWorkflowInterceptor
import com.squareup.workflow1.ui.Screen
import com.squareup.workflow1.ui.ViewRegistry
import com.squareup.workflow1.ui.WorkflowLayout
import com.squareup.workflow1.ui.renderWorkflowIn
import com.squareup.workflow1.ui.withRegistry
import com.squareup.workflow1.ui.workflowContentView
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import java.io.File
Expand All @@ -28,14 +28,11 @@ class ToDoActivity : AppCompatActivity() {

val model: ToDoModel by viewModels()

setContentView(
WorkflowLayout(this).apply {
take(
lifecycle,
model.ensureWorkflow(traceFilesDir = filesDir).map { it.withRegistry(viewRegistry) }
)
}
)
workflowContentView
.take(
lifecycle,
model.ensureWorkflow(traceFilesDir = filesDir).map { it.withRegistry(viewRegistry) }
)
}

private companion object {
Expand Down
5 changes: 5 additions & 0 deletions workflow-ui/core-android/api/core-android.api
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
public final class com/squareup/workflow1/ui/ActivityWorkflowContentViewKt {
public static final fun getWorkflowContentView (Landroid/app/Activity;)Lcom/squareup/workflow1/ui/WorkflowLayout;
public static final fun getWorkflowContentViewOrNull (Landroid/app/Activity;)Lcom/squareup/workflow1/ui/WorkflowLayout;
}

public final class com/squareup/workflow1/ui/AndroidRenderWorkflowKt {
public static final fun removeWorkflowState (Landroidx/lifecycle/SavedStateHandle;)V
public static final fun renderWorkflowIn (Lcom/squareup/workflow1/Workflow;Lkotlinx/coroutines/CoroutineScope;Landroidx/lifecycle/SavedStateHandle;Ljava/util/List;Ljava/util/Set;Lcom/squareup/workflow1/WorkflowTracer;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/StateFlow;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ internal class AndroidRenderWorkflowInTest {
savedStateHandle = model.savedStateHandle
)

val layout = WorkflowLayout(activity)
activity.setContentView(layout)

val layout = activity.workflowContentView
assertThat(model.savedStateHandle.contains(KEY)).isFalse()

job = layout.take(activity.lifecycle, renderings)
Expand Down
Loading
Loading