Skip to content

Commit 25eba05

Browse files
authored
Merge pull request #1026 from square/ray/1-component-set-dialog
1/4 `fun ComponentDialog.setContent()` replaces `ScreenOverlayDialogFactory`
2 parents a735e08 + 0f909ea commit 25eba05

File tree

51 files changed

+917
-336
lines changed

Some content is hidden

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

51 files changed

+917
-336
lines changed
Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,39 @@
11
package com.squareup.sample.container.panel
22

3-
import android.app.Dialog
3+
import android.content.Context
44
import android.graphics.Rect
5+
import androidx.appcompat.app.AppCompatDialog
56
import com.squareup.sample.container.R
67
import com.squareup.workflow1.ui.Screen
7-
import com.squareup.workflow1.ui.ScreenViewHolder
88
import com.squareup.workflow1.ui.ViewEnvironment
99
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
10+
import com.squareup.workflow1.ui.container.OverlayDialogFactory
1011
import com.squareup.workflow1.ui.container.OverlayDialogHolder
11-
import com.squareup.workflow1.ui.container.ScreenOverlayDialogFactory
12+
import com.squareup.workflow1.ui.container.asDialogHolderWithContent
1213
import com.squareup.workflow1.ui.container.setBounds
13-
import com.squareup.workflow1.ui.container.setContent
14-
import com.squareup.workflow1.ui.show
14+
import kotlin.reflect.KClass
1515

1616
/**
1717
* Android support for [PanelOverlay].
1818
*/
1919
@OptIn(WorkflowUiExperimentalApi::class)
20-
internal object PanelOverlayDialogFactory :
21-
ScreenOverlayDialogFactory<Screen, PanelOverlay<Screen>>(
22-
type = PanelOverlay::class
23-
) {
24-
/**
25-
* Forks the default implementation to apply [R.style.PanelDialog] for
26-
* enter and exit animation, and to customize [bounds][OverlayDialogHolder.onUpdateBounds].
27-
*/
28-
override fun buildDialogWithContent(
20+
internal object PanelOverlayDialogFactory : OverlayDialogFactory<PanelOverlay<Screen>> {
21+
override val type: KClass<in PanelOverlay<Screen>> = PanelOverlay::class
22+
23+
override fun buildDialog(
2924
initialRendering: PanelOverlay<Screen>,
3025
initialEnvironment: ViewEnvironment,
31-
content: ScreenViewHolder<Screen>
26+
context: Context
3227
): OverlayDialogHolder<PanelOverlay<Screen>> {
33-
val dialog = Dialog(content.view.context, R.style.PanelDialog)
34-
dialog.setContent(content)
28+
val dialog = AppCompatDialog(context, R.style.PanelDialog)
29+
30+
val realHolder = dialog.asDialogHolderWithContent(initialRendering, initialEnvironment)
3531

36-
return OverlayDialogHolder(
37-
initialEnvironment = initialEnvironment,
38-
dialog = dialog,
39-
onUpdateBounds = { bounds ->
32+
// We replace the default onUpdateBounds function with one that gives the
33+
// panel a square shape on tablets. See OverlayDialogFactory for more details
34+
// on the bounds mechanism.
35+
return object : OverlayDialogHolder<PanelOverlay<Screen>> by realHolder {
36+
override val onUpdateBounds: ((Rect) -> Unit) = { bounds ->
4037
val refinedBounds: Rect = if (!dialog.context.isTablet) {
4138
// On a phone, fill the bounds entirely.
4239
bounds
@@ -62,8 +59,6 @@ internal object PanelOverlayDialogFactory :
6259

6360
dialog.setBounds(refinedBounds)
6461
}
65-
) { overlayRendering, environment ->
66-
content.show(overlayRendering.content, environment)
6762
}
6863
}
6964
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ class HelloBackButtonEspressoTest {
2727
.around(IdlingDispatcherRule)
2828

2929
@Test fun wrappedTakesPrecedence() {
30+
// The root workflow (AreYouSureWorkflow) wraps its child renderings
31+
// (instances of HelloBackButtonScreen) in its own BackButtonScreen,
32+
// which shows the "Are you sure" dialog.
33+
// That should only be in effect on the Able screen, which sets no backHandler of its
34+
// own. The Baker and Charlie screens set their own backHandlers,
35+
// which should take precedence over the root one. Thus, we should
36+
// be able to push to Charlie and pop all the way back to Able
37+
// without seeing the "Are you sure" dialog.
3038
onView(withId(R.id.hello_message)).apply {
3139
check(matches(withText("Able")))
3240
perform(click())

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ object AreYouSureWorkflow :
6868
BackButtonScreen(ableBakerCharlie) {
6969
// While we always provide a back button handler, by default the view code
7070
// associated with BackButtonScreen ignores ours if the view created for the
71-
// wrapped rendering sets a handler of its own. (Set BackButtonScreen.override
71+
// wrapped rendering sets a handler of its own. (Set BackButtonScreen.shadow
7272
// to change this precedence.)
7373
context.actionSink.send(maybeQuit)
7474
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.squareup.sample.hellobackbutton.databinding.HelloBackButtonLayoutBind
66
import com.squareup.workflow1.ui.AndroidScreen
77
import com.squareup.workflow1.ui.ScreenViewFactory
88
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
9-
import com.squareup.workflow1.ui.backPressedHandler
9+
import com.squareup.workflow1.ui.setBackHandler
1010

1111
@OptIn(WorkflowUiExperimentalApi::class)
1212
data class HelloBackButtonScreen(
@@ -18,6 +18,6 @@ data class HelloBackButtonScreen(
1818
ScreenViewFactory.fromViewBinding(HelloBackButtonLayoutBinding::inflate) { rendering, _ ->
1919
helloMessage.text = rendering.message
2020
helloMessage.setOnClickListener { rendering.onClick() }
21-
helloMessage.backPressedHandler = rendering.onBackPressed
21+
helloMessage.setBackHandler(rendering.onBackPressed)
2222
}
2323
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.squareup.sample.poetry
22

3+
import android.annotation.SuppressLint
34
import android.view.LayoutInflater
45
import android.view.View
56
import android.view.ViewGroup
@@ -15,9 +16,9 @@ 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
18-
import com.squareup.workflow1.ui.backPressedHandler
1919
import com.squareup.workflow1.ui.container.BackStackConfig
2020
import com.squareup.workflow1.ui.container.BackStackConfig.Other
21+
import com.squareup.workflow1.ui.setBackHandler
2122

2223
@OptIn(WorkflowUiExperimentalApi::class)
2324
data class StanzaListScreen(
@@ -40,6 +41,7 @@ private class StanzaListLayoutRunner(view: View) : ScreenViewRunner<StanzaListSc
4041

4142
private val adapter = Adapter()
4243

44+
@SuppressLint("NotifyDataSetChanged")
4345
override fun showRendering(
4446
rendering: StanzaListScreen,
4547
environment: ViewEnvironment
@@ -53,10 +55,10 @@ private class StanzaListLayoutRunner(view: View) : ScreenViewRunner<StanzaListSc
5355

5456
if (environment[BackStackConfig] == Other) {
5557
toolbar.setNavigationOnClickListener { rendering.onExit() }
56-
toolbar.backPressedHandler = rendering.onExit
58+
toolbar.setBackHandler(rendering.onExit)
5759
} else {
5860
toolbar.navigationIcon = null
59-
toolbar.backPressedHandler = null
61+
toolbar.setBackHandler {}
6062
}
6163

6264
if (rendering.selection >= 0) recyclerView.scrollToPosition(rendering.selection)

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import com.squareup.workflow1.ui.ScreenViewFactory
1717
import com.squareup.workflow1.ui.ScreenViewRunner
1818
import com.squareup.workflow1.ui.ViewEnvironment
1919
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
20-
import com.squareup.workflow1.ui.backPressedHandler
2120
import com.squareup.workflow1.ui.container.BackStackConfig
2221
import com.squareup.workflow1.ui.container.BackStackConfig.None
22+
import com.squareup.workflow1.ui.setBackHandler
2323

2424
@OptIn(WorkflowUiExperimentalApi::class)
2525
data class StanzaScreen(
@@ -93,8 +93,10 @@ private class StanzaLayoutRunner(private val view: View) : ScreenViewRunner<Stan
9393
toolbar.navigationIcon = null
9494
}
9595

96-
view.backPressedHandler = rendering.onGoBack
96+
val goBackOrUp = rendering.onGoBack
9797
?: rendering.onGoUp.takeIf { environment[OverviewDetailConfig] != Detail }
98+
99+
view.setBackHandler(goBackOrUp)
98100
}
99101

100102
private fun TextView.setTabulatedText(lines: List<String>) {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.squareup.workflow1.ui.ScreenViewRunner
1313
import com.squareup.workflow1.ui.ViewEnvironment
1414
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
1515
import com.squareup.workflow1.ui.WorkflowViewStub
16-
import com.squareup.workflow1.ui.backPressedHandler
16+
import com.squareup.workflow1.ui.setBackHandler
1717
import kotlin.time.Duration
1818
import kotlin.time.Duration.Companion.milliseconds
1919
import kotlin.time.ExperimentalTime
@@ -44,7 +44,7 @@ class ShakeableTimeMachineLayoutRunner(
4444
environment: ViewEnvironment
4545
) {
4646
// Only handle back presses explicitly if in playback mode.
47-
view.backPressedHandler = rendering.onResumeRecording.takeUnless { rendering.recording }
47+
view.setBackHandler(rendering.onResumeRecording.takeUnless { rendering.recording })
4848

4949
seek.max = rendering.totalDuration.toProgressInt()
5050
seek.progress = rendering.playbackPosition.toProgressInt()

samples/tictactoe/app/src/main/java/com/squareup/sample/authworkflow/LoginViewFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.squareup.sample.tictactoe.databinding.LoginLayoutBinding
44
import com.squareup.workflow1.ui.ScreenViewFactory
55
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
66
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
7-
import com.squareup.workflow1.ui.backPressedHandler
7+
import com.squareup.workflow1.ui.setBackHandler
88

99
@OptIn(WorkflowUiExperimentalApi::class)
1010
internal val LoginViewFactory: ScreenViewFactory<LoginScreen> =
@@ -15,5 +15,5 @@ internal val LoginViewFactory: ScreenViewFactory<LoginScreen> =
1515
rendering.onLogin(loginEmail.text.toString(), loginPassword.text.toString())
1616
}
1717

18-
root.backPressedHandler = { rendering.onCancel() }
18+
root.setBackHandler(rendering.onCancel)
1919
}

samples/tictactoe/app/src/main/java/com/squareup/sample/authworkflow/SecondFactorViewFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import com.squareup.sample.tictactoe.databinding.SecondFactorLayoutBinding
44
import com.squareup.workflow1.ui.ScreenViewFactory
55
import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
66
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
7-
import com.squareup.workflow1.ui.backPressedHandler
7+
import com.squareup.workflow1.ui.setBackHandler
88

99
@OptIn(WorkflowUiExperimentalApi::class)
1010
internal val SecondFactorViewFactory: ScreenViewFactory<SecondFactorScreen> =
1111
fromViewBinding(SecondFactorLayoutBinding::inflate) { rendering, _ ->
12-
root.backPressedHandler = { rendering.onCancel() }
12+
root.setBackHandler(rendering.onCancel)
1313
secondFactorToolbar.setNavigationOnClickListener { rendering.onCancel() }
1414

1515
secondFactorErrorMessage.text = rendering.errorMessage

samples/tictactoe/app/src/main/java/com/squareup/sample/gameworkflow/GameOverLayoutRunner.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import com.squareup.workflow1.ui.ScreenViewFactory.Companion.fromViewBinding
1515
import com.squareup.workflow1.ui.ScreenViewRunner
1616
import com.squareup.workflow1.ui.ViewEnvironment
1717
import com.squareup.workflow1.ui.WorkflowUiExperimentalApi
18-
import com.squareup.workflow1.ui.backPressedHandler
18+
import com.squareup.workflow1.ui.setBackHandler
1919

2020
@OptIn(WorkflowUiExperimentalApi::class)
2121
internal class GameOverLayoutRunner(
@@ -40,14 +40,15 @@ internal class GameOverLayoutRunner(
4040
rendering.onPlayAgain()
4141
true
4242
}
43-
binding.root.backPressedHandler = { rendering.onExit() }
43+
binding.root.setBackHandler(rendering.onExit)
4444

4545
when (rendering.endGameState.syncState) {
4646
SAVING -> {
4747
saveItem.isEnabled = false
4848
saveItem.title = "saving…"
4949
saveItem.setOnMenuItemClickListener(null)
5050
}
51+
5152
SAVE_FAILED -> {
5253
saveItem.isEnabled = true
5354
saveItem.title = "Unsaved"
@@ -56,6 +57,7 @@ internal class GameOverLayoutRunner(
5657
true
5758
}
5859
}
60+
5961
SAVED -> {
6062
saveItem.isVisible = false
6163
saveItem.setOnMenuItemClickListener(null)

0 commit comments

Comments
 (0)