Skip to content

Commit 65040ca

Browse files
authored
Merge pull request #975 from square/ray/fromTransformer
Extracts `ScreenViewFactory.map` from `ScreenViewFactory.forWrapper`
2 parents 93f4bac + 1880ad1 commit 65040ca

File tree

13 files changed

+210
-179
lines changed

13 files changed

+210
-179
lines changed

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

-8
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,3 @@ fun MayBeLoadingScreen(
2020
loaders.map { FullScreenOverlay(it) }
2121
)
2222
}
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() = overlays.map { it.content }
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.squareup.sample.container.panel
22

3-
import com.squareup.workflow1.ui.Compatible
4-
import com.squareup.workflow1.ui.Compatible.Companion.keyFor
53
import com.squareup.workflow1.ui.Screen
64
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
5+
import com.squareup.workflow1.ui.Wrapper
76

87
/**
98
* Show a scrim over some [content], which is invisible if [dimmed] is false,
109
* visible if it is true.
1110
*/
1211
@OptIn(WorkflowUiExperimentalApi::class)
13-
class ScrimScreen<T : Screen>(
14-
val content: T,
12+
class ScrimScreen<C : Screen>(
13+
override val content: C,
1514
val dimmed: Boolean
16-
) : Screen, Compatible {
17-
override val compatibilityKey = keyFor(content, "ScrimScreen")
15+
) : Wrapper<Screen, C>, Screen {
16+
override fun <D : Screen> map(transform: (C) -> D) = ScrimScreen(transform(content), dimmed)
1817
}

samples/containers/hello-back-button/src/androidTest/java/com/squareup/sample/hellobackbutton/HelloBackButtonEspressoTest.kt

-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withId
1010
import androidx.test.espresso.matcher.ViewMatchers.withText
1111
import androidx.test.ext.junit.rules.ActivityScenarioRule
1212
import androidx.test.ext.junit.runners.AndroidJUnit4
13-
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1413
import com.squareup.workflow1.ui.internal.test.IdlingDispatcherRule
1514
import leakcanary.DetectLeaksAfterTestSuccess
1615
import org.junit.Rule
@@ -19,7 +18,6 @@ import org.junit.rules.RuleChain
1918
import org.junit.runner.RunWith
2019

2120
@RunWith(AndroidJUnit4::class)
22-
@OptIn(WorkflowUiExperimentalApi::class)
2321
class HelloBackButtonEspressoTest {
2422

2523
private val scenarioRule = ActivityScenarioRule(HelloBackButtonActivity::class.java)

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

+18-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ package com.squareup.sample.hellobackbutton
22

33
import android.os.Parcelable
44
import com.squareup.sample.hellobackbutton.AreYouSureWorkflow.Finished
5+
import com.squareup.sample.hellobackbutton.AreYouSureWorkflow.Rendering
56
import com.squareup.sample.hellobackbutton.AreYouSureWorkflow.State
67
import com.squareup.sample.hellobackbutton.AreYouSureWorkflow.State.Quitting
78
import com.squareup.sample.hellobackbutton.AreYouSureWorkflow.State.Running
89
import com.squareup.workflow1.Snapshot
910
import com.squareup.workflow1.StatefulWorkflow
1011
import com.squareup.workflow1.WorkflowAction.Companion.noAction
1112
import com.squareup.workflow1.action
13+
import com.squareup.workflow1.ui.AndroidScreen
14+
import com.squareup.workflow1.ui.Screen
15+
import com.squareup.workflow1.ui.ScreenViewFactory
16+
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.map
1217
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1318
import com.squareup.workflow1.ui.container.AlertOverlay
1419
import com.squareup.workflow1.ui.container.AlertOverlay.Button.NEGATIVE
@@ -27,12 +32,21 @@ import kotlinx.parcelize.Parcelize
2732
*/
2833
@OptIn(WorkflowUiExperimentalApi::class)
2934
object AreYouSureWorkflow :
30-
StatefulWorkflow<Unit, State, Finished, BodyAndOverlaysScreen<*, AlertOverlay>>() {
35+
StatefulWorkflow<Unit, State, Finished, Rendering>() {
3136
override fun initialState(
3237
props: Unit,
3338
snapshot: Snapshot?
3439
): State = snapshot?.toParcelable() ?: Running
3540

41+
class Rendering(
42+
val base: Screen,
43+
val alert: AlertOverlay? = null
44+
) : AndroidScreen<Rendering> {
45+
override val viewFactory: ScreenViewFactory<Rendering> = map { newRendering ->
46+
BodyAndOverlaysScreen(newRendering.base, listOfNotNull(newRendering.alert))
47+
}
48+
}
49+
3650
@Parcelize
3751
enum class State : Parcelable {
3852
Running,
@@ -45,12 +59,12 @@ object AreYouSureWorkflow :
4559
renderProps: Unit,
4660
renderState: State,
4761
context: RenderContext
48-
): BodyAndOverlaysScreen<*, AlertOverlay> {
62+
): Rendering {
4963
val ableBakerCharlie = context.renderChild(HelloBackButtonWorkflow, Unit) { noAction() }
5064

5165
return when (renderState) {
5266
Running -> {
53-
BodyAndOverlaysScreen(
67+
Rendering(
5468
BackButtonScreen(ableBakerCharlie) {
5569
// While we always provide a back button handler, by default the view code
5670
// associated with BackButtonScreen ignores ours if the view created for the
@@ -80,7 +94,7 @@ object AreYouSureWorkflow :
8094
}
8195
)
8296

83-
BodyAndOverlaysScreen(ableBakerCharlie, alert)
97+
Rendering(ableBakerCharlie, alert)
8498
}
8599
}
86100
}

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

-38
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
@file:Suppress("ktlint:filename")
2+
3+
package com.squareup.sample.hellobackbutton
4+
5+
import com.squareup.sample.hellobackbutton.databinding.HelloBackButtonLayoutBinding
6+
import com.squareup.workflow1.ui.AndroidScreen
7+
import com.squareup.workflow1.ui.ScreenViewFactory
8+
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
9+
import com.squareup.workflow1.ui.backPressedHandler
10+
11+
@OptIn(WorkflowUiExperimentalApi::class)
12+
data class HelloBackButtonScreen(
13+
val message: String,
14+
val onClick: () -> Unit,
15+
val onBackPressed: (() -> Unit)?
16+
) : AndroidScreen<HelloBackButtonScreen> {
17+
override val viewFactory: ScreenViewFactory<HelloBackButtonScreen> =
18+
ScreenViewFactory.fromViewBinding(HelloBackButtonLayoutBinding::inflate) { rendering, _ ->
19+
helloMessage.text = rendering.message
20+
helloMessage.setOnClickListener { rendering.onClick() }
21+
helloMessage.backPressedHandler = rendering.onBackPressed
22+
}
23+
}

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

+1-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ import com.squareup.workflow1.ui.toParcelable
1111
import com.squareup.workflow1.ui.toSnapshot
1212
import kotlinx.parcelize.Parcelize
1313

14-
object HelloBackButtonWorkflow : StatefulWorkflow<
15-
Unit,
16-
State,
17-
Nothing,
18-
HelloBackButtonScreen
19-
>() {
14+
object HelloBackButtonWorkflow : StatefulWorkflow<Unit, State, Nothing, HelloBackButtonScreen>() {
2015

2116
@Parcelize
2217
enum class State : Parcelable {

workflow-ui/core-android/api/core-android.api

+11-3
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,17 @@ public final class com/squareup/workflow1/ui/ScreenViewFactoryKt {
129129
}
130130

131131
public abstract interface class com/squareup/workflow1/ui/ScreenViewHolder {
132+
public static final field Companion Lcom/squareup/workflow1/ui/ScreenViewHolder$Companion;
132133
public abstract fun getEnvironment ()Lcom/squareup/workflow1/ui/ViewEnvironment;
133134
public abstract fun getRunner ()Lcom/squareup/workflow1/ui/ScreenViewRunner;
134135
public abstract fun getView ()Landroid/view/View;
135136
}
136137

138+
public final class com/squareup/workflow1/ui/ScreenViewHolder$Companion {
139+
public final fun invoke (Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/view/View;Lcom/squareup/workflow1/ui/ScreenViewRunner;)Lcom/squareup/workflow1/ui/ScreenViewHolder;
140+
}
141+
137142
public final class com/squareup/workflow1/ui/ScreenViewHolderKt {
138-
public static final fun ScreenViewHolder (Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/view/View;Lcom/squareup/workflow1/ui/ScreenViewRunner;)Lcom/squareup/workflow1/ui/ScreenViewHolder;
139143
public static final fun canShow (Lcom/squareup/workflow1/ui/ScreenViewHolder;Lcom/squareup/workflow1/ui/Screen;)Z
140144
public static final fun getShowing (Lcom/squareup/workflow1/ui/ScreenViewHolder;)Lcom/squareup/workflow1/ui/Screen;
141145
public static final fun show (Lcom/squareup/workflow1/ui/ScreenViewHolder;Lcom/squareup/workflow1/ui/Screen;Lcom/squareup/workflow1/ui/ViewEnvironment;)V
@@ -429,16 +433,20 @@ public final class com/squareup/workflow1/ui/container/OverlayDialogFactoryKt {
429433
}
430434

431435
public abstract interface class com/squareup/workflow1/ui/container/OverlayDialogHolder {
436+
public static final field Companion Lcom/squareup/workflow1/ui/container/OverlayDialogHolder$Companion;
432437
public abstract fun getDialog ()Landroid/app/Dialog;
433438
public abstract fun getEnvironment ()Lcom/squareup/workflow1/ui/ViewEnvironment;
434439
public abstract fun getOnBackPressed ()Lkotlin/jvm/functions/Function0;
435440
public abstract fun getOnUpdateBounds ()Lkotlin/jvm/functions/Function1;
436441
public abstract fun getRunner ()Lkotlin/jvm/functions/Function2;
437442
}
438443

444+
public final class com/squareup/workflow1/ui/container/OverlayDialogHolder$Companion {
445+
public final fun invoke (Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/app/Dialog;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;)Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;
446+
public static synthetic fun invoke$default (Lcom/squareup/workflow1/ui/container/OverlayDialogHolder$Companion;Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/app/Dialog;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;
447+
}
448+
439449
public final class com/squareup/workflow1/ui/container/OverlayDialogHolderKt {
440-
public static final fun OverlayDialogHolder (Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/app/Dialog;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;)Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;
441-
public static synthetic fun OverlayDialogHolder$default (Lcom/squareup/workflow1/ui/ViewEnvironment;Landroid/app/Dialog;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;
442450
public static final fun canShow (Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;Lcom/squareup/workflow1/ui/container/Overlay;)Z
443451
public static final fun getShowing (Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;)Lcom/squareup/workflow1/ui/container/Overlay;
444452
public static final fun show (Lcom/squareup/workflow1/ui/container/OverlayDialogHolder;Lcom/squareup/workflow1/ui/container/Overlay;Lcom/squareup/workflow1/ui/ViewEnvironment;)V

0 commit comments

Comments
 (0)