Note that the viewer is entirely generic. It accepts a String description for the action and a Data object holding the app’s state. Clicking a row sends the Data back to the app, which decodes it and resets its state to what it received.

Read more