Extend Pica — three challenges
The capstone isn't just running Pica — it's extending it on your own, using the same patterns. Pick at least one challenge (or all). Each builds on a technique you already learned — that's the test of whether you truly understand the layers.
Challenge A — Menu item detail (easy).
Add a MenuItemDetail screen: tapping a pizza opens a separate screen with a large photo, description and "Add to cart".
- You reuse: Nav3
Screen.MenuItemDetail(itemId)(lesson 4, already in the sealed class), the existingMenuItemdomain. - Pattern: navigation with an argument + the existing cart
Event.
Challenge B — Order status updates (medium).
In order history, show a "live" status (created → preparing → ready). Add a "Refresh" or a periodic GET /orders.
- You reuse:
OrderHistoryViewModel(9), MVILoading/Success/Error, an authenticated request. - Pattern: the same repository → ViewModel → state flow, just with refresh.
Challenge C — Favorite pizzas (hard).
Let the user mark a pizza as a favorite; store it in the Room cache (a new @Entity favorites), show it in a separate tab.
- You reuse: Room (7) with a new table and DAO, a new Koin
single, a new MVI screen. - Pattern: cache-then-nothing (purely local) — the opposite of the menu, where the network is the source of truth.
For each challenge, before writing code, answer: which layer changes? What Event do you add? What new UiState? What do you inject via Koin? If you can answer, you understood the architecture.
Tip. Don't invent new patterns. All three challenges are solved by repeating what you already did: a new
Event, a newUiState, a newsinglein the modules. That's the gift of a well-designed architecture — extension feels like "more of the same," not a rewrite.