Theory

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 existing MenuItem domain.
  • 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), MVI Loading/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 new UiState, a new single in the modules. That's the gift of a well-designed architecture — extension feels like "more of the same," not a rewrite.