JO
joshayoung/LazyPizza
Native Android Application for Pizza Orders (Jetpack Compose, Kotlin, Flows, Coroutines, Room)
LazyPizza
Android Application for Pizza Orders
Screenshots
Walkthroughs
Improvement Notes
- This app assumes 'happy-path', so I have not added much error handling.
- The app allows guest checkout, but this will not scale in the current form because I am just using a string for this user.
- The toppings are not listed on the history page.
- Orders are just a serialized list of IDs. If one of these IDs were to change then the order would link to a non-existing ID.
Notes
io.coil-kt.coil3:coil-network-okhttpis needed to getAsyncImageworking withcoil.- If your preview does not seem to be depicting the correct color for your
MaterialThemein the preview window, then make sure you are wrapping your preview in your theme block (i.e.LazyPizzaTheme { ... }). - If a join returns all null results all of the values in the object used for deserialization have to be nullable or it wlll crash the app!
- If you use a key for something like
LazyVerticalGrid, make sure your keys are all unique for the preview.- Otherwise the preview will not work.
- If you have a
lazycomponent inside another lazy commpoent, make sure the inner one has either aheightorheightInso the outer component can render. Otherwise it does not know enought to render the correct height. - Compose does not support nested
Lazylayouts unless the inner ones have defined heights.- To circumvent this, you can use a
Columnas the inner layout and loop through your items using aforEachloop.- This is not very performant, but it is ok if you only have a few items in your list.
- To circumvent this, you can use a
- If you want the repeating elements in a
Lazylayout to take up the full height of the largest element in the component being usined, you can use.height(IntrinsicSize.Max)on the outer element.
Running This Application
- This application requires authentication from AppWrite on the app launch in order to project assets (images/database) access.
- This is not user facing.
- In order to authenticate in the app using SMS, you will need to setup a test firebase phone number as outlined below.
AppWrite
- To run this application after clone, you will need to create a
local.propertiesfile with the following values fromAppWrite:- API_ENDPOINT=""
- API_PROJECT_ID=""
- AUTH_EMAIL=""
- AUTH_HEADER=""
- AUTH_PASSWORD=""
- AUTH_USERNAME=""
- BUCKET_ID=""
- DATABASE_ID=""
- TOPPINGS_COLLECTION_ID=""
- MENU_ITEMS_COLLECTION_ID=""
- ORDERS_COLLECTION_ID=""
Firebase
- You will need to setup a firebase project and add your
google-services.jsonfile to the applicationsappfolder. - In addition, you will need to enable
AuthenticationandPhone/SMSverification and add a test phone number and 2factor code in order to login.
Miscellaneous
- This file (
local.properties) will also need to include this value (it can be any string).- GUEST_USER=""
Ktlint
./gradlew ktlintCheck- generate reports./gradlew ktlintFormat- format code
Add Firebase Storage
- Run through the setup: https://firebase.google.com/docs/storage/android/start
- Add your config file here:
app/google-services.json- Add this to .gitignore (at least for now).
- Console: https://console.firebase.google.com
- Storage: https://console.firebase.google.com/project/lazypizza-22122/storage/lazypizza-22122.firebasestorage.app/files
Generate SHA-256 Key
./gradlew signingReport
Convert Video Format
- https://ffmpeg.org/ffmpeg.html#Video-and-Audio-file-format-conversion
ffmpeg -i milestone_one.webm -c:v libx264 milestone_one.mp4
Ktlint Plugin
Re-Attach Debugger
- View > Tool Windows > Debug
Resources
- Font
- https://firebase.google.com/docs/storage/android/start
- Image Caching with Coil Compose - Everything You Need to Know
- Async with Token
- Room Relationship
- Understanding the internal of Flow, StateFlow, and SharedFlow
Provided Resources
- Adding Shadows in Compose
- State in Jetpack Compose
- Where to hoist state
- Stateful vs Stateless Composables
- How to Save & Restore the Scroll Position of a LazyColumn Persistently
- How to Create a Lazy Column With Categories in Jetpack Compose
- The Full Jetpack Compose Responsive UI Crash Course
- Full Guide to Material3 Theming in Compose Multiplatform
- Buttons - UX With Material3
- Create a Splash Screen in Compose Multiplatform for iOS & Android - KMP for Beginners
- Connect your App to Firebase
- Add Firebase to your Android project
- Visual Go
- Stateful vs. Stateless Composables In Jetpack Compose? - Everything You Need to Know
- Nested Scrolling
- Date Range Picker
- Disable Dates in the Past
On this page
Contributors
MIT License
Created October 1, 2025
Updated March 10, 2026







