Skip to content

Commit ec37f4d

Browse files
authored
Merge pull request #712 from square/ray/fix-goodbye-view-extensions-i-hope
ScreenViewHolder replaces View.* extensions and DecorativeViewFactory
2 parents e821518 + 3f9ee9c commit ec37f4d

File tree

90 files changed

+1359
-1519
lines changed

Some content is hidden

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

90 files changed

+1359
-1519
lines changed

samples/compose-samples/src/main/java/com/squareup/sample/compose/nestedrenderings/LegacyRunner.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import androidx.compose.ui.tooling.preview.Preview
99
import com.squareup.sample.compose.databinding.LegacyViewBinding
1010
import com.squareup.sample.compose.nestedrenderings.RecursiveWorkflow.LegacyRendering
1111
import com.squareup.workflow1.ui.ScreenViewFactory
12+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
1213
import com.squareup.workflow1.ui.ScreenViewRunner
13-
import com.squareup.workflow1.ui.ScreenViewRunner.Companion.bind
1414
import com.squareup.workflow1.ui.ViewEnvironment
1515
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1616
import com.squareup.workflow1.ui.compose.tooling.Preview
@@ -28,7 +28,7 @@ class LegacyRunner(private val binding: LegacyViewBinding) : ScreenViewRunner<Le
2828
binding.stub.update(rendering.rendering, viewEnvironment)
2929
}
3030

31-
companion object : ScreenViewFactory<LegacyRendering> by bind(
31+
companion object : ScreenViewFactory<LegacyRendering> by fromViewBinding(
3232
LegacyViewBinding::inflate, ::LegacyRunner
3333
)
3434
}

samples/containers/android/src/main/java/com/squareup/sample/container/ScrimContainer.kt

+13-18
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import android.content.Context
55
import android.util.AttributeSet
66
import android.view.View
77
import android.view.ViewGroup
8+
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
89
import androidx.core.content.ContextCompat
910
import com.squareup.sample.container.panel.ScrimScreen
10-
import com.squareup.workflow1.ui.ManualScreenViewFactory
1111
import com.squareup.workflow1.ui.ScreenViewFactory
12+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromCode
13+
import com.squareup.workflow1.ui.ScreenViewHolder
1214
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1315
import com.squareup.workflow1.ui.WorkflowViewStub
14-
import com.squareup.workflow1.ui.bindShowRendering
1516

1617
/**
1718
* A view that renders only its first child, behind a smoke scrim if
@@ -91,23 +92,17 @@ internal class ScrimContainer @JvmOverloads constructor(
9192
}
9293

9394
@OptIn(WorkflowUiExperimentalApi::class)
94-
companion object : ScreenViewFactory<ScrimScreen<*>> by ManualScreenViewFactory(
95-
type = ScrimScreen::class,
96-
viewConstructor = { initialRendering, initialViewEnvironment, contextForNewView, _ ->
97-
val stub = WorkflowViewStub(contextForNewView)
95+
companion object : ScreenViewFactory<ScrimScreen<*>> by fromCode(
96+
buildView = { _, initialEnvironment, context, _ ->
97+
val stub = WorkflowViewStub(context)
98+
val scrimContainer = ScrimContainer(context)
99+
scrimContainer.layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
100+
scrimContainer.addView(stub)
98101

99-
ScrimContainer(contextForNewView)
100-
.also { view ->
101-
view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
102-
view.addView(stub)
103-
104-
view.bindShowRendering(
105-
initialRendering, initialViewEnvironment
106-
) { rendering, environment ->
107-
stub.show(rendering.content, environment)
108-
view.isDimmed = rendering.dimmed
109-
}
110-
}
102+
ScreenViewHolder(initialEnvironment, scrimContainer) { rendering, viewEnvironment ->
103+
stub.show(rendering.content, viewEnvironment)
104+
scrimContainer.isDimmed = rendering.dimmed
105+
}
111106
}
112107
)
113108
}

samples/containers/android/src/main/java/com/squareup/sample/container/overviewdetail/OverviewDetailContainer.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class OverviewDetailContainer(view: View) : ScreenViewRunner<OverviewDetailScree
8989
stub.show(combined, viewEnvironment + Single)
9090
}
9191

92-
companion object : ScreenViewFactory<OverviewDetailScreen> by ScreenViewRunner.bind(
92+
companion object : ScreenViewFactory<OverviewDetailScreen> by ScreenViewFactory.fromLayout(
9393
layoutId = R.layout.overview_detail,
9494
constructor = ::OverviewDetailContainer
9595
)

samples/containers/hello-back-button/src/main/java/com/squareup/sample/hellobackbutton/HelloBackButtonLayoutRunner.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ data class HelloBackButtonScreen(
1515
val onClick: () -> Unit,
1616
val onBackPressed: (() -> Unit)?
1717
) : AndroidScreen<HelloBackButtonScreen> {
18-
override val viewFactory: ScreenViewFactory<HelloBackButtonScreen> = ScreenViewRunner.bind(
18+
override val viewFactory = ScreenViewFactory.fromLayout<HelloBackButtonScreen>(
1919
R.layout.hello_back_button_layout, ::HelloBackButtonLayoutRunner
2020
)
2121
}

samples/containers/poetry/src/main/java/com/squareup/sample/poetry/PoemListRendering.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.squareup.sample.container.overviewdetail.OverviewDetailConfig.Overvie
1212
import com.squareup.sample.container.poetry.R
1313
import com.squareup.sample.poetry.model.Poem
1414
import com.squareup.workflow1.ui.AndroidScreen
15+
import com.squareup.workflow1.ui.ScreenViewFactory
1516
import com.squareup.workflow1.ui.ScreenViewRunner
1617
import com.squareup.workflow1.ui.ViewEnvironment
1718
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
@@ -22,9 +23,8 @@ data class PoemListScreen(
2223
val onPoemSelected: (Int) -> Unit,
2324
val selection: Int = -1
2425
) : AndroidScreen<PoemListScreen> {
25-
override val viewFactory = ScreenViewRunner.bind(
26-
R.layout.list,
27-
::PoemListLayoutRunner
26+
override val viewFactory = ScreenViewFactory.fromLayout(
27+
R.layout.list, ::PoemListLayoutRunner
2828
)
2929

3030
companion object {

samples/containers/poetry/src/main/java/com/squareup/sample/poetry/StanzaListScreen.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ data class StanzaListScreen(
2828
val onExit: () -> Unit,
2929
val selection: Int = -1
3030
) : AndroidScreen<StanzaListScreen> {
31-
override val viewFactory: ScreenViewFactory<StanzaListScreen> = ScreenViewRunner.bind(
32-
R.layout.list,
33-
::StanzaListLayoutRunner
34-
)
31+
override val viewFactory =
32+
ScreenViewFactory.fromLayout(R.layout.list, ::StanzaListLayoutRunner)
3533
}
3634

3735
@OptIn(WorkflowUiExperimentalApi::class)

samples/containers/poetry/src/main/java/com/squareup/sample/poetry/StanzaScreen.kt

+2-9
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ data class StanzaScreen(
3232
) : AndroidScreen<StanzaScreen>, Compatible {
3333
override val compatibilityKey = "$title: $stanzaNumber"
3434

35-
override val viewFactory: ScreenViewFactory<StanzaScreen> = ScreenViewRunner.bind(
36-
R.layout.stanza_layout,
37-
::StanzaLayoutRunner
38-
)
35+
override val viewFactory =
36+
ScreenViewFactory.fromLayout(R.layout.stanza_layout, ::StanzaLayoutRunner)
3937
}
4038

4139
@OptIn(WorkflowUiExperimentalApi::class)
@@ -113,9 +111,4 @@ private class StanzaLayoutRunner(private val view: View) : ScreenViewRunner<Stan
113111
}
114112
setText(spans, SPANNABLE)
115113
}
116-
117-
companion object : ScreenViewFactory<StanzaScreen> by ScreenViewRunner.bind(
118-
R.layout.stanza_layout,
119-
::StanzaLayoutRunner
120-
)
121114
}

samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/BoardView.kt

+8-7
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import android.graphics.Rect
88
import android.view.View
99
import androidx.core.content.ContextCompat
1010
import com.squareup.sample.dungeon.board.Board
11-
import com.squareup.workflow1.ui.ManualScreenViewFactory
1211
import com.squareup.workflow1.ui.ScreenViewFactory
12+
import com.squareup.workflow1.ui.ScreenViewHolder
1313
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
14-
import com.squareup.workflow1.ui.bindShowRendering
1514
import kotlin.math.abs
1615
import kotlin.math.min
1716

@@ -83,11 +82,13 @@ class BoardView(context: Context) : View(context) {
8382
}
8483

8584
@OptIn(WorkflowUiExperimentalApi::class)
86-
companion object : ScreenViewFactory<Board> by ManualScreenViewFactory(
87-
type = Board::class,
88-
viewConstructor = { initialRendering, initialEnv, contextForNewView, _ ->
89-
BoardView(contextForNewView)
90-
.apply { bindShowRendering(initialRendering, initialEnv) { r, _ -> update(r) } }
85+
companion object : ScreenViewFactory<Board>
86+
by ScreenViewFactory.fromCode(
87+
buildView = { _, initialEnvironment, context, _ ->
88+
val view = BoardView(context)
89+
ScreenViewHolder(initialEnvironment, view) { screen, _ ->
90+
view.update(screen)
91+
}
9192
}
9293
)
9394
}

samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/BoardsListLayoutRunner.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import com.squareup.cycler.toDataSource
1111
import com.squareup.sample.dungeon.DungeonAppWorkflow.DisplayBoardsListScreen
1212
import com.squareup.sample.dungeon.board.Board
1313
import com.squareup.workflow1.ui.ScreenViewFactory
14+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromLayout
1415
import com.squareup.workflow1.ui.ScreenViewRunner
15-
import com.squareup.workflow1.ui.ScreenViewRunner.Companion.bind
1616
import com.squareup.workflow1.ui.ViewEnvironment
1717
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1818
import com.squareup.workflow1.ui.WorkflowViewStub
@@ -101,7 +101,7 @@ class BoardsListLayoutRunner(rootView: View) : ScreenViewRunner<DisplayBoardsLis
101101
)
102102
}
103103

104-
companion object : ScreenViewFactory<DisplayBoardsListScreen> by bind(
104+
companion object : ScreenViewFactory<DisplayBoardsListScreen> by fromLayout(
105105
R.layout.boards_list_layout, ::BoardsListLayoutRunner
106106
)
107107
}

samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/Component.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ class Component(context: AppCompatActivity) {
2525
@OptIn(WorkflowUiExperimentalApi::class)
2626
val viewRegistry = ViewRegistry(
2727
ShakeableTimeMachineLayoutRunner,
28-
LoadingBinding<LoadingBoardList>(R.string.loading_boards_list),
28+
LoadingScreenViewFactory<LoadingBoardList>(R.string.loading_boards_list),
2929
BoardsListLayoutRunner,
30-
LoadingBinding<Loading>(R.string.loading_board),
30+
LoadingScreenViewFactory<Loading>(R.string.loading_board),
3131
GameLayoutRunner,
3232
BoardView,
3333
AlertContainer

samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/GameLayoutRunner.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import com.squareup.sample.dungeon.Direction.RIGHT
1111
import com.squareup.sample.dungeon.Direction.UP
1212
import com.squareup.sample.dungeon.GameWorkflow.GameRendering
1313
import com.squareup.workflow1.ui.ScreenViewFactory
14+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromLayout
1415
import com.squareup.workflow1.ui.ScreenViewRunner
15-
import com.squareup.workflow1.ui.ScreenViewRunner.Companion.bind
1616
import com.squareup.workflow1.ui.ViewEnvironment
1717
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1818
import com.squareup.workflow1.ui.WorkflowViewStub
@@ -66,7 +66,7 @@ class GameLayoutRunner(view: View) : ScreenViewRunner<GameRendering> {
6666
}
6767
}
6868

69-
companion object : ScreenViewFactory<GameRendering> by bind(
69+
companion object : ScreenViewFactory<GameRendering> by fromLayout(
7070
R.layout.game_layout, ::GameLayoutRunner
7171
)
7272
}

samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/LoadingBinding.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import android.widget.TextView
77
import androidx.annotation.StringRes
88
import com.squareup.workflow1.ui.Screen
99
import com.squareup.workflow1.ui.ScreenViewFactory
10+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromLayout
1011
import com.squareup.workflow1.ui.ScreenViewRunner
11-
import com.squareup.workflow1.ui.ScreenViewRunner.Companion.bind
1212
import com.squareup.workflow1.ui.ViewEnvironment
1313
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1414

@@ -19,10 +19,10 @@ import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1919
* The binding is parameterized on two things: the type of the rendering that this binding is
2020
* keyed off of, and the resource ID of the string to use for the label.
2121
*/
22-
inline fun <reified RenderingT : Screen> LoadingBinding(
22+
inline fun <reified RenderingT : Screen> LoadingScreenViewFactory(
2323
@StringRes loadingLabelRes: Int
2424
): ScreenViewFactory<RenderingT> =
25-
bind(R.layout.loading_layout) { view -> LoadingLayoutRunner(loadingLabelRes, view) }
25+
fromLayout(R.layout.loading_layout) { view -> LoadingLayoutRunner(loadingLabelRes, view) }
2626

2727
@PublishedApi
2828
internal class LoadingLayoutRunner<RenderingT : Screen>(

samples/dungeon/timemachine-shakeable/src/main/java/com/squareup/sample/timemachine/shakeable/ShakeableTimeMachineLayoutRunner.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import androidx.constraintlayout.widget.Group
88
import androidx.transition.TransitionManager
99
import com.squareup.sample.timemachine.shakeable.internal.GlassFrameLayout
1010
import com.squareup.workflow1.ui.ScreenViewFactory
11+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromLayout
1112
import com.squareup.workflow1.ui.ScreenViewRunner
12-
import com.squareup.workflow1.ui.ScreenViewRunner.Companion.bind
1313
import com.squareup.workflow1.ui.ViewEnvironment
1414
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1515
import com.squareup.workflow1.ui.WorkflowViewStub
@@ -88,7 +88,7 @@ class ShakeableTimeMachineLayoutRunner(
8888

8989
private fun Duration.toUiString(): String = toString()
9090

91-
companion object : ScreenViewFactory<ShakeableTimeMachineScreen> by bind(
91+
companion object : ScreenViewFactory<ShakeableTimeMachineScreen> by fromLayout(
9292
R.layout.shakeable_time_machine_layout, ::ShakeableTimeMachineLayoutRunner
9393
)
9494
}

samples/hello-workflow-fragment/src/main/java/com/squareup/sample/helloworkflowfragment/HelloRendering.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.squareup.sample.helloworkflowfragment
33
import com.squareup.sample.helloworkflowfragment.databinding.HelloGoodbyeLayoutBinding
44
import com.squareup.workflow1.ui.AndroidScreen
55
import com.squareup.workflow1.ui.ScreenViewFactory
6-
import com.squareup.workflow1.ui.ScreenViewRunner
6+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
77
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
88

99
@OptIn(WorkflowUiExperimentalApi::class)
@@ -12,8 +12,8 @@ data class HelloRendering(
1212
val onClick: () -> Unit
1313
) : AndroidScreen<HelloRendering> {
1414
override val viewFactory: ScreenViewFactory<HelloRendering> =
15-
ScreenViewRunner.bind(HelloGoodbyeLayoutBinding::inflate) { r, _ ->
16-
helloMessage.text = "${r.message} Fragment"
17-
helloMessage.setOnClickListener { r.onClick() }
15+
fromViewBinding(HelloGoodbyeLayoutBinding::inflate) { rendering, _ ->
16+
helloMessage.text = "${rendering.message} Fragment"
17+
helloMessage.setOnClickListener { rendering.onClick() }
1818
}
1919
}

samples/hello-workflow/src/main/java/com/squareup/sample/helloworkflow/HelloRendering.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.squareup.sample.helloworkflow
33
import com.squareup.sample.helloworkflow.databinding.HelloGoodbyeLayoutBinding
44
import com.squareup.workflow1.ui.AndroidScreen
55
import com.squareup.workflow1.ui.ScreenViewFactory
6-
import com.squareup.workflow1.ui.ScreenViewRunner
6+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
77
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
88

99
@OptIn(WorkflowUiExperimentalApi::class)
@@ -12,7 +12,7 @@ data class HelloRendering(
1212
val onClick: () -> Unit
1313
) : AndroidScreen<HelloRendering> {
1414
override val viewFactory: ScreenViewFactory<HelloRendering> =
15-
ScreenViewRunner.bind(HelloGoodbyeLayoutBinding::inflate) { r, _ ->
15+
fromViewBinding(HelloGoodbyeLayoutBinding::inflate) { r, _ ->
1616
helloMessage.text = r.message
1717
helloMessage.setOnClickListener { r.onClick() }
1818
}

samples/stub-visibility/src/main/java/com/squareup/sample/stubvisibility/ClickyTextRendering.kt

+13-14
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,29 @@ import android.view.ViewGroup.LayoutParams
99
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
1010
import android.widget.TextView
1111
import com.squareup.workflow1.ui.AndroidScreen
12-
import com.squareup.workflow1.ui.ManualScreenViewFactory
12+
import com.squareup.workflow1.ui.ScreenViewFactory
13+
import com.squareup.workflow1.ui.ScreenViewHolder
1314
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
14-
import com.squareup.workflow1.ui.bindShowRendering
1515

1616
@OptIn(WorkflowUiExperimentalApi::class)
1717
data class ClickyTextRendering(
1818
val message: String,
1919
val visible: Boolean = true,
2020
val onClick: (() -> Unit)? = null
2121
) : AndroidScreen<ClickyTextRendering> {
22-
override val viewFactory = ManualScreenViewFactory(
23-
type = ClickyTextRendering::class,
24-
viewConstructor = { initialRendering, initialEnv, context, _ ->
25-
TextView(context).also { textView ->
22+
override val viewFactory = ScreenViewFactory.fromCode<ClickyTextRendering>(
23+
buildView = { _, initialEnvironment, context, _ ->
24+
val view = TextView(context).also { textView ->
2625
textView.layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
2726
textView.gravity = CENTER
28-
29-
textView.bindShowRendering(initialRendering, initialEnv) { clickyText, _ ->
30-
textView.text = clickyText.message
31-
textView.isVisible = clickyText.visible
32-
textView.setOnClickListener(
33-
clickyText.onClick?.let { oc -> OnClickListener { oc() } }
34-
)
35-
}
27+
}
28+
ScreenViewHolder(initialEnvironment, view) { rendering, _ ->
29+
val textView = view
30+
textView.text = rendering.message
31+
textView.isVisible = rendering.visible
32+
textView.setOnClickListener(
33+
rendering.onClick?.let { oc -> OnClickListener { oc() } }
34+
)
3635
}
3736
}
3837
)

samples/stub-visibility/src/main/java/com/squareup/sample/stubvisibility/OuterRendering.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.squareup.sample.stubvisibility
33
import com.squareup.sample.stubvisibility.databinding.StubVisibilityLayoutBinding
44
import com.squareup.workflow1.ui.AndroidScreen
55
import com.squareup.workflow1.ui.ScreenViewFactory
6-
import com.squareup.workflow1.ui.ScreenViewRunner
6+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
77
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
88

99
@OptIn(WorkflowUiExperimentalApi::class)
@@ -12,7 +12,7 @@ data class OuterRendering(
1212
val bottom: ClickyTextRendering
1313
) : AndroidScreen<OuterRendering> {
1414
override val viewFactory: ScreenViewFactory<OuterRendering> =
15-
ScreenViewRunner.bind(StubVisibilityLayoutBinding::inflate) { rendering, env ->
15+
fromViewBinding(StubVisibilityLayoutBinding::inflate) { rendering, env ->
1616
shouldBeFilledStub.show(rendering.top, env)
1717
shouldBeWrappedStub.show(rendering.bottom, env)
1818
}

0 commit comments

Comments
 (0)