diff --git a/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/DungeonAppWorkflow.kt b/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/DungeonAppWorkflow.kt index 0195521ce6..5610d2fd22 100644 --- a/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/DungeonAppWorkflow.kt +++ b/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/DungeonAppWorkflow.kt @@ -62,7 +62,9 @@ class DungeonAppWorkflow( is PlayingGame -> { val sessionProps = GameSessionWorkflow.Props(renderState.boardPath, renderProps.paused) - val gameScreen = context.renderChild(gameSessionWorkflow, sessionProps) + val gameScreen = context.renderChild(gameSessionWorkflow, sessionProps) { + action { state = LoadingBoardList } + } gameScreen } } diff --git a/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/GameSessionWorkflow.kt b/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/GameSessionWorkflow.kt index bd5afb8829..73755a48a9 100644 --- a/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/GameSessionWorkflow.kt +++ b/samples/dungeon/app/src/main/java/com/squareup/sample/dungeon/GameSessionWorkflow.kt @@ -3,6 +3,8 @@ package com.squareup.sample.dungeon import android.os.Vibrator +import com.squareup.sample.dungeon.GameSessionWorkflow.Output +import com.squareup.sample.dungeon.GameSessionWorkflow.Output.NewBoard import com.squareup.sample.dungeon.GameSessionWorkflow.Props import com.squareup.sample.dungeon.GameSessionWorkflow.State import com.squareup.sample.dungeon.GameSessionWorkflow.State.GameOver @@ -21,7 +23,10 @@ import com.squareup.workflow1.ui.Screen import com.squareup.workflow1.ui.WorkflowUiExperimentalApi import com.squareup.workflow1.ui.modal.AlertContainerScreen import com.squareup.workflow1.ui.modal.AlertScreen +import com.squareup.workflow1.ui.modal.AlertScreen.Button.NEGATIVE +import com.squareup.workflow1.ui.modal.AlertScreen.Button.NEUTRAL import com.squareup.workflow1.ui.modal.AlertScreen.Button.POSITIVE +import com.squareup.workflow1.ui.modal.AlertScreen.Event.ButtonClicked typealias BoardPath = String @@ -33,7 +38,7 @@ class GameSessionWorkflow( private val gameWorkflow: GameWorkflow, private val vibrator: Vibrator, private val boardLoader: BoardLoader -) : StatefulWorkflow>() { +) : StatefulWorkflow>() { data class Props( val boardPath: BoardPath, @@ -46,6 +51,10 @@ class GameSessionWorkflow( data class GameOver(val board: Board) : State() } + sealed class Output { + object NewBoard : Output() + } + override fun initialState( props: Props, snapshot: Snapshot? @@ -75,10 +84,20 @@ class GameSessionWorkflow( val gameScreen = context.renderChild(gameWorkflow, gameInput) { noAction() } val gameOverDialog = AlertScreen( - buttons = mapOf(POSITIVE to "Restart"), + buttons = mapOf(POSITIVE to "Restart", NEUTRAL to "New board"), message = "You've been eaten, try again.", cancelable = false, - onEvent = { context.actionSink.send(restartGame()) } + onEvent = { + if (it is ButtonClicked) { + context.actionSink.send( + when (it.button) { + POSITIVE -> restartGame() + NEUTRAL -> newBoard() + NEGATIVE -> noAction() + } + ) + } + } ) AlertContainerScreen(gameScreen, gameOverDialog) @@ -112,6 +131,8 @@ class GameSessionWorkflow( private fun restartGame() = action("restartGame") { state = Loading } + private fun newBoard() = action("newBoard") { setOutput(NewBoard)} + private fun vibrate(durationMs: Long) { @Suppress("DEPRECATION") vibrator.vibrate(durationMs)