/Shuttle

Demo KMP Compose Decompose MVIKotlin Koin SpaceX app

Primary LanguageKotlinApache License 2.0Apache-2.0

Shuttle 🚀

Very simple demo project to showcase:

  1. Compose (testing)
  2. Decompose
  3. MVIKotlin
  4. KMP
  5. SpaceX API
  6. Koin
  7. Coroutines
  8. SQLDelight
  9. Kotlinx.Serialization
  10. Kotlinx.DateTime
  11. Kotlin Common testing
  12. Compose testing

What is Shuttle

The app is a very simple single screen app that just loads:

  1. SpaceX company info
  2. SpaceX Rocket launches

The purpose of this app is to play around with the SpaceX REST API and showcase some of my learnings about other tools on Kotlin multiplatform and Android development.

Main Filters Social Links
Light
Dark

Decisions

While developing this tiny app I had to make some decisions that might make it different than yours:

  1. The app is going to be kept the same size and I'm not planning to add more screens or features. This allows me to iterate faster and try out some other ideas.
  2. The libraries are carefully picked to allow sharing code with other platforms as much as possible through KMP.
  3. Initially I started with 3 modules for the app A. Shared B. Compose-Shared
    C. Android/Desktop app
  4. After a bit of coding I realized having Compose-Shared, blocks the project from publishing quickly. So I dropped it for now. Might come back to it again in future. So it's just Jetpack Compose for now.
  5. I like "Feature modules", however, this app only has one feature I really did not see the value of creating another module for the sake of having the modules. Best part is, breaking it to smaller modules and adding more feature modules is quite easy
  6. As the side effect of using Decompose I get the device-rotation handling for free
  7. As the side effect of using Compose I get dark-theme handling for free
  8. I find this architecture super and easily testable, I have added some sample tests to some of the layers.
  9. The entire launch JSON data of SpaceX API is not too much and can be loaded without pagination. So for the sake of caching and simplicity I disabled the pagination in the API and everything is loaded all at once.
  10. On the other hand to reduce the total data loaded over network I "selected" the fields I really needed. (Many thanks to SpaceX query options)

Contribution

As always I'm all open to any form of contributions, so feel free to post issues, PRs, even fork and copy for yourself. Would love to see what you have in mind about this project.