Set up Android Studio and run your first app
Build a reliable development workspace, understand the generated project, and run a welcome screen on a device.

Learn Kotlin and Jetpack Compose by building Field Notes: a small app for recording what you learn. Work through the lessons in order, then use the checkpoints to test your understanding.
Build a reliable development workspace, understand the generated project, and run a welcome screen on a device.

Practice variables, functions, nullability, collections, and data classes using the information your app will display.

Create a reusable form, understand modifiers, and check the screen with a keyboard, larger text, and accessibility tools.

Trace UI events through a ViewModel, collect state with the lifecycle, and distinguish rotation from process death and persistence.

Build a list-to-editor flow, pass stable identifiers, and test back behavior instead of treating navigation as a collection of buttons.

Define a table and DAO, connect a repository, and verify that a successful save survives closing and reopening the app.

Start with a fake feed, perform a controlled HTTPS request off the main thread, and make loading, empty, and failure states visible.

Turn the practice app into a reviewable release with meaningful tests, data-preservation checks, signing, and an honest store listing.


Follow a reproducible debugging session, inspect an incorrect calculation, read crash evidence, and verify a focused repair.
Explore the language behind the course with focused exercises in data handling, screen states, and asynchronous work.

Build a reading queue, compare eager and lazy processing, and choose a sequence only when its behavior fits your task.

Build a reusable batch validator, keep result types meaningful, and choose the smallest generic interface your application actually needs.

Turn a study planner specification into deterministic checks, test boundaries and failures, and move the same cases into a Kotlin test suite.

Build an explicit task-import result, preserve useful error messages, and separate invalid user input from exceptions at external boundaries.

Build a reusable task summary, choose let and also deliberately, and keep Kotlin transformations easy to understand and test.

Use nullable types, explicit validation, and small recovery rules to make missing values understandable in an Android app.

Filter, sort, group, and update records with clear rules for identity, ordering, and empty results.

Replace contradictory flags with explicit outcomes and make loading, content, empty, and failure behavior easier to review.

Practice suspend functions, structured concurrency, dispatchers, and cancellation before connecting asynchronous work to Android screens.