Build Three Real Apps
Eighteen chapters, each ending at a checkpoint you can download and build. Dice Duel teaches state and animation. Pocket Notes teaches persistence. Focus Flow ties everything together.
Dice Duel 1 — project setup and theme
The first sitting of your first real app. You build the project from its foundations, choose a colour palette that will carry the whole game, draw a launcher icon out of shapes, and get a real APK with your own icon onto your phone.
5.2Dice Duel 2 — drawing a die face with Canvas
You draw a real die with no picture files at all — a rounded square and up to six pips placed on a 3×3 grid, computed from whatever size the composable is given, so it stays razor sharp from 88dp to 400dp.
5.3Dice Duel 3 — rolling, state and randomness
Four remembered values turn a picture into a game. You add the die's face, two scores and whose turn it is, wire a tap straight onto the die, and pick a genuinely random number between one and six.
5.4Dice Duel 4 — the roll animation
A counter that only ever goes up, a random tilt, a nine-frame shuffle inside a coroutine and a graphicsLayer. Together they turn a number that changes into a die that is genuinely thrown.
5.5Dice Duel 5 — scores, winning and polish
Give the game an ending. A named target, a winner that stops being zero, a banner that springs in over a dimmed board, progress bars on both panels, and one button that puts everything back to nothing.
5.6Pocket Notes 1 — model, Room and DAO
Give an app a memory that survives being closed. You describe a note as one Kotlin class and your questions as one interface, and Room writes every line of SQL for you at build time.
5.7Pocket Notes 2 — ViewModel and StateFlow
Put two layers between the screen and the database. The repository owns the DAO, the ViewModel owns one state object, and a note saved anywhere appears on screen without a single line of code saying "refresh".
5.8Pocket Notes 3 — the note list and the empty state
Turn a plain column of text into a real list: cards, human-readable timestamps, a title that shrinks as you scroll, and the screen everybody forgets to design — the one with nothing on it.
5.9Pocket Notes 4 — the editor screen
A second screen, and the road between them. A route is just a piece of text, the + button stops lying, and the editor has no Save button on purpose — leaving it saves, which means catching both ways out.
5.10Pocket Notes 5 — swipe to delete, with undo
Drag a card left and the note is gone from SQLite immediately — no timer, no pending state, no "are you sure?". A snackbar with an Undo button puts the very same note back where it was.
5.11Pocket Notes 6 — search and final polish
A search box that filters as you type, a second empty state for "found nothing", a live word count, and a keyboard that stops covering the sentence you are writing. Pocket Notes is finished.
5.12Focus Flow 1 — navigation skeleton
The last and largest app starts here. You build the project, write a full light and dark colour scheme by hand, draw an adaptive icon as a vector, and wire three tabs together with a bottom navigation bar that has no state of its own.
5.13Focus Flow 2 — the timer engine
Build the clock that actually counts. A ViewModel holds every piece of timer state, a coroutine ticks ten times a second without freezing the screen, and the loop measures real elapsed time instead of trusting delay to be exact.
5.14Focus Flow 3 — the ring dial on Canvas
Replace the number with a picture of the number. You draw a ring that empties as the phase runs down, plus twelve tick marks placed with a line of trigonometry — all by hand on a Canvas, with no chart library anywhere.
5.15Focus Flow 4 — sessions in Room
Give the app a memory. Every finished phase is written into a Room database as a row, and the line under the clock stops counting in memory and starts reading today's real totals straight out of the database — updating itself after every write.
5.16Focus Flow 5 — settings with DataStore
Build the Settings tab for real. Focus length, break length and a keep-screen-on switch, stored in DataStore, read as a Flow, and applied to the running timer the moment you change them — but never in the middle of a round you are already in.
5.17Focus Flow 6 — notifications
Put the phone face down. A notification fires the moment a phase ends — which needs a channel created before the first post, a permission declared in the manifest, and on Android 13 and newer a runtime request the user is allowed to refuse without breaking anything.
5.18Focus Flow 7 — the stats chart
The last chapter. Every session you have saved becomes three totals and a seven-day bar chart, drawn by hand on a Canvas with measured text and rounded bars — plus a proper empty state for the very first run. Focus Flow is finished, and so is Part 5.