Skip to content

Commit 0c7863e

Browse files
committed
Merge branch 'ray/ui-update'
* ray/ui-update: (55 commits) Defers most deprecation and restores deleted kdoc `View.environmentOrNull`, `View.screenOrNull`. Revert "Brings back `View.environment`, adds `View.getScreen`." Brings back `View.environment`, adds `View.getScreen`. Fixes a few typos in ScreenViewFactory kdoc Introduces ViewEnvironmentKey.combine, makes ViewRegistry use it. More consistent use of Compatible.keyFor Adds EnvironmentScreenLegacyViewFactory. Fixes BackStackContainer view persistence Hello ModalScreenOverlay Deletes extra copy of AndroidOverlay Fixes unused imports on LoaderSpinner Renames ScreenViewFactory.for* to .from* One more pass at the ScreenViewFactory kdoc Some method renaming and other polish from PR review. Snip a couple of unnecessary lambdas. Adds missing kdoc to ScreenViewFactory.unwrapping Moves and renames the bind methods, adds missing kdoc. ScreenViewHolder replaces View.* extensions and DecorativeViewFactory Adds missing integration tests EnvironmentScreen, NamedScreen. ...
2 parents 0f0c0cf + 92dfbd8 commit 0c7863e

File tree

261 files changed

+8915
-2587
lines changed

Some content is hidden

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

261 files changed

+8915
-2587
lines changed

README.md

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,6 @@ your `repositories` block, and then add dependencies on the following artifacts:
5959
<td nowrap><code>com.squareup.workflow1:workflow-ui-core-android:x.y.z</code></td>
6060
<td>You're writing an Android app that uses Workflows.</td>
6161
</tr>
62-
<tr>
63-
<td nowrap><code>com.squareup.workflow1:workflow-ui-modal-android:x.y.z</code></td>
64-
<td>Your Android app uses modals (popups).</td>
65-
</tr>
66-
<tr>
67-
<td nowrap><code>com.squareup.workflow1:workflow-ui-container-android:x.y.z</code></td>
68-
<td>Your android app uses backstacks.</td>
69-
</tr>
7062
</table>
7163

7264
### Lower-level Artifacts

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
@@ -9,10 +9,12 @@ import com.squareup.workflow1.Workflow
99
import com.squareup.workflow1.action
1010
import com.squareup.workflow1.asWorker
1111
import com.squareup.workflow1.runningWorker
12+
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1213
import kotlinx.coroutines.flow.Flow
1314

1415
typealias IsLoading = Boolean
1516

17+
@OptIn(WorkflowUiExperimentalApi::class)
1618
class MaybeLoadingGatekeeperWorkflow<T : Any>(
1719
private val childWithLoading: Workflow<T, Any, OverviewDetailScreen>,
1820
private val childProps: T,

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import com.squareup.sample.poetry.PoemWorkflow
1515
import com.squareup.sample.poetry.PoemWorkflow.ClosePoem
1616
import com.squareup.sample.poetry.StanzaListWorkflow
1717
import com.squareup.sample.poetry.StanzaListWorkflow.NO_SELECTED_STANZA
18-
import com.squareup.sample.poetry.StanzaRendering
18+
import com.squareup.sample.poetry.StanzaScreen
1919
import com.squareup.sample.poetry.StanzaWorkflow
2020
import com.squareup.sample.poetry.StanzaWorkflow.Output.CloseStanzas
2121
import com.squareup.sample.poetry.StanzaWorkflow.Output.ShowNextStanza
@@ -29,9 +29,10 @@ import com.squareup.workflow1.WorkflowAction
2929
import com.squareup.workflow1.WorkflowAction.Companion.noAction
3030
import com.squareup.workflow1.action
3131
import com.squareup.workflow1.runningWorker
32+
import com.squareup.workflow1.ui.Screen
3233
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
33-
import com.squareup.workflow1.ui.backstack.BackStackScreen
34-
import com.squareup.workflow1.ui.backstack.toBackStackScreen
34+
import com.squareup.workflow1.ui.container.BackStackScreen
35+
import com.squareup.workflow1.ui.container.toBackStackScreen
3536
import kotlinx.coroutines.delay
3637
import kotlinx.coroutines.flow.MutableStateFlow
3738

@@ -124,7 +125,7 @@ class PerformancePoemWorkflow(
124125
}
125126
}
126127

127-
val previousStanzas: List<StanzaRendering> =
128+
val previousStanzas: List<StanzaScreen> =
128129
if (stanzaIndex == NO_SELECTED_STANZA) emptyList()
129130
else renderProps.stanzas.subList(0, stanzaIndex)
130131
.mapIndexed { index, _ ->
@@ -149,7 +150,7 @@ class PerformancePoemWorkflow(
149150
}
150151

151152
val stackedStanzas = visibleStanza?.let {
152-
(previousStanzas + visibleStanza).toBackStackScreen<Any>()
153+
(previousStanzas + visibleStanza).toBackStackScreen<Screen>()
153154
}
154155

155156
val stanzaListOverview =

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.squareup.benchmarks.performance.complex.poetry.PerformancePoemsBrowse
88
import com.squareup.benchmarks.performance.complex.poetry.instrumentation.SimulatedPerfConfig
99
import com.squareup.benchmarks.performance.complex.poetry.views.BlankScreen
1010
import com.squareup.sample.container.overviewdetail.OverviewDetailScreen
11-
import com.squareup.sample.poetry.PoemListRendering.Companion.NO_POEM_SELECTED
11+
import com.squareup.sample.poetry.PoemListScreen.Companion.NO_POEM_SELECTED
1212
import com.squareup.sample.poetry.PoemListWorkflow
1313
import com.squareup.sample.poetry.PoemWorkflow
1414
import com.squareup.sample.poetry.PoemsBrowserWorkflow
@@ -19,7 +19,7 @@ import com.squareup.workflow1.Worker
1919
import com.squareup.workflow1.action
2020
import com.squareup.workflow1.runningWorker
2121
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
22-
import com.squareup.workflow1.ui.backstack.BackStackScreen
22+
import com.squareup.workflow1.ui.container.BackStackScreen
2323
import kotlinx.coroutines.delay
2424
import kotlinx.coroutines.flow.MutableStateFlow
2525

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,22 @@ import androidx.lifecycle.viewModelScope
1010
import androidx.savedstate.SavedStateRegistryOwner
1111
import com.squareup.benchmarks.performance.complex.poetry.instrumentation.PerformanceTracingInterceptor
1212
import com.squareup.benchmarks.performance.complex.poetry.instrumentation.SimulatedPerfConfig
13-
import com.squareup.benchmarks.performance.complex.poetry.views.LoaderContainer
1413
import com.squareup.sample.container.SampleContainers
1514
import com.squareup.sample.poetry.model.Poem
1615
import com.squareup.workflow1.WorkflowInterceptor
16+
import com.squareup.workflow1.ui.Screen
17+
import com.squareup.workflow1.ui.ViewEnvironment.Companion.EMPTY
18+
import com.squareup.workflow1.ui.ViewRegistry
1719
import com.squareup.workflow1.ui.WorkflowLayout
1820
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
19-
import com.squareup.workflow1.ui.backstack.BackStackContainer
20-
import com.squareup.workflow1.ui.plus
21+
import com.squareup.workflow1.ui.container.withEnvironment
2122
import com.squareup.workflow1.ui.renderWorkflowIn
2223
import kotlinx.coroutines.flow.StateFlow
24+
import kotlinx.coroutines.flow.map
2325
import timber.log.Timber
2426

2527
@OptIn(WorkflowUiExperimentalApi::class)
26-
private val viewRegistry = SampleContainers + BackStackContainer + LoaderContainer
28+
private val viewEnvironment = EMPTY + (ViewRegistry to SampleContainers)
2729

2830
class PerformancePoetryActivity : AppCompatActivity() {
2931
@OptIn(WorkflowUiExperimentalApi::class)
@@ -51,7 +53,12 @@ class PerformancePoetryActivity : AppCompatActivity() {
5153
val component = PerformancePoetryComponent(installedInterceptor, simulatedPerfConfig)
5254
val model: PoetryModel by viewModels { component.poetryModelFactory(this) }
5355
setContentView(
54-
WorkflowLayout(this).apply { start(lifecycle, model.renderings, viewRegistry) }
56+
WorkflowLayout(this).apply {
57+
take(
58+
lifecycle,
59+
model.renderings.map { it.withEnvironment(viewEnvironment) }
60+
)
61+
}
5562
)
5663

5764
// We can report this here as the first rendering from the Workflow is rendered synchronously.
@@ -84,7 +91,7 @@ class PoetryModel(
8491
workflow: MaybeLoadingGatekeeperWorkflow<List<Poem>>,
8592
interceptor: WorkflowInterceptor?
8693
) : ViewModel() {
87-
@OptIn(WorkflowUiExperimentalApi::class) val renderings: StateFlow<Any> by lazy {
94+
@OptIn(WorkflowUiExperimentalApi::class) val renderings: StateFlow<Screen> by lazy {
8895
renderWorkflowIn(
8996
workflow = workflow,
9097
scope = viewModelScope,
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,21 @@
11
package com.squareup.benchmarks.performance.complex.poetry.views
22

3-
import android.content.Context
43
import android.view.ViewGroup
54
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
65
import android.widget.FrameLayout
7-
import com.squareup.workflow1.ui.AndroidViewRendering
8-
import com.squareup.workflow1.ui.BuilderViewFactory
9-
import com.squareup.workflow1.ui.ViewEnvironment
10-
import com.squareup.workflow1.ui.ViewFactory
6+
import com.squareup.workflow1.ui.AndroidScreen
7+
import com.squareup.workflow1.ui.ScreenViewFactory
8+
import com.squareup.workflow1.ui.ScreenViewHolder
119
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
12-
import com.squareup.workflow1.ui.bindShowRendering
1310

1411
@OptIn(WorkflowUiExperimentalApi::class)
15-
object BlankScreen : AndroidViewRendering<BlankScreen> {
16-
override val viewFactory: ViewFactory<BlankScreen>
17-
get() = BuilderViewFactory<BlankScreen>(
18-
type = BlankScreen::class,
19-
viewConstructor = { initialRendering: BlankScreen,
20-
initialViewEnvironment: ViewEnvironment,
21-
contextForNewView: Context,
22-
container: ViewGroup? ->
23-
FrameLayout(contextForNewView).apply {
24-
layoutParams =
25-
container?.layoutParams ?: ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
26-
bindShowRendering(initialRendering, initialViewEnvironment) { _, _ -> }
27-
}
12+
object BlankScreen : AndroidScreen<BlankScreen> {
13+
override val viewFactory: ScreenViewFactory<BlankScreen>
14+
get() = ScreenViewFactory.fromCode<BlankScreen> { _, initialEnvironment, context, container ->
15+
FrameLayout(context).let { view ->
16+
view.layoutParams =
17+
container?.layoutParams ?: ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
18+
ScreenViewHolder(initialEnvironment, view) { _, _ -> }
2819
}
29-
)
20+
}
3021
}

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

Lines changed: 0 additions & 34 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,31 @@
11
package com.squareup.benchmarks.performance.complex.poetry.views
22

3-
import android.content.Context
3+
import android.view.Gravity.CENTER
44
import android.view.ViewGroup
5-
import android.view.ViewGroup.LayoutParams
5+
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
6+
import android.widget.FrameLayout
67
import android.widget.ProgressBar
7-
import com.squareup.workflow1.ui.AndroidViewRendering
8-
import com.squareup.workflow1.ui.BuilderViewFactory
9-
import com.squareup.workflow1.ui.ViewEnvironment
10-
import com.squareup.workflow1.ui.ViewFactory
8+
import com.squareup.workflow1.ui.AndroidScreen
9+
import com.squareup.workflow1.ui.ScreenViewFactory
10+
import com.squareup.workflow1.ui.ScreenViewHolder
1111
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
12-
import com.squareup.workflow1.ui.bindShowRendering
1312

1413
@OptIn(WorkflowUiExperimentalApi::class)
15-
object LoaderSpinner : AndroidViewRendering<LoaderSpinner> {
16-
override val viewFactory: ViewFactory<LoaderSpinner>
17-
get() = BuilderViewFactory<LoaderSpinner>(
18-
type = LoaderSpinner::class,
19-
viewConstructor = { initialRendering: LoaderSpinner,
20-
initialViewEnvironment: ViewEnvironment,
21-
contextForNewView: Context,
22-
container: ViewGroup? ->
23-
ProgressBar(contextForNewView).apply {
24-
layoutParams =
25-
container?.layoutParams ?: LayoutParams(
26-
LayoutParams.WRAP_CONTENT,
27-
LayoutParams.WRAP_CONTENT
28-
)
29-
this.isIndeterminate = true
30-
bindShowRendering(initialRendering, initialViewEnvironment) { _, _ -> }
14+
object LoaderSpinner : AndroidScreen<LoaderSpinner> {
15+
override val viewFactory =
16+
ScreenViewFactory.fromCode<LoaderSpinner> { _, initialEnvironment, context, _ ->
17+
val progressBar = ProgressBar(context).apply {
18+
layoutParams = FrameLayout.LayoutParams(
19+
ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
20+
).apply {
21+
gravity = CENTER
3122
}
23+
isIndeterminate = true
3224
}
33-
)
25+
26+
FrameLayout(context).let { view ->
27+
view.addView(progressBar)
28+
ScreenViewHolder(initialEnvironment, view) { _, _ -> }
29+
}
30+
}
3431
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
11
package com.squareup.benchmarks.performance.complex.poetry.views
22

33
import com.squareup.sample.container.overviewdetail.OverviewDetailScreen
4-
import com.squareup.sample.container.panel.ScrimContainerScreen
4+
import com.squareup.sample.container.panel.ScrimScreen
55
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
6-
import com.squareup.workflow1.ui.modal.HasModals
6+
import com.squareup.workflow1.ui.container.BodyAndModalsScreen
7+
import com.squareup.workflow1.ui.container.ModalScreenOverlay
78

89
@OptIn(WorkflowUiExperimentalApi::class)
9-
class MayBeLoadingScreen(
10-
private val baseScreen: OverviewDetailScreen,
11-
private val loaders: List<LoaderSpinner> = emptyList()
12-
) : HasModals<ScrimContainerScreen<OverviewDetailScreen>, LoaderSpinner> {
13-
override val beneathModals: ScrimContainerScreen<OverviewDetailScreen>
14-
get() = ScrimContainerScreen(
15-
wrapped = baseScreen,
16-
dimmed = loaders.isNotEmpty()
17-
)
18-
override val modals: List<LoaderSpinner>
19-
get() = loaders
10+
typealias MayBeLoadingScreen =
11+
BodyAndModalsScreen<ScrimScreen<OverviewDetailScreen>, ModalScreenOverlay<LoaderSpinner>>
12+
13+
@OptIn(WorkflowUiExperimentalApi::class)
14+
fun MayBeLoadingScreen(
15+
baseScreen: OverviewDetailScreen,
16+
loaders: List<LoaderSpinner> = emptyList()
17+
): MayBeLoadingScreen {
18+
return BodyAndModalsScreen(
19+
ScrimScreen(baseScreen, dimmed = loaders.isNotEmpty()),
20+
loaders.map { ModalScreenOverlay(it) }
21+
)
2022
}
23+
24+
@OptIn(WorkflowUiExperimentalApi::class)
25+
val MayBeLoadingScreen.baseScreen: OverviewDetailScreen
26+
get() = body.content
27+
28+
@OptIn(WorkflowUiExperimentalApi::class)
29+
val MayBeLoadingScreen.loaders: List<LoaderSpinner>
30+
get() = modals.map { it.content }

benchmarks/performance-poetry/complex-poetry/src/main/res/values/ids.xml

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)