Skip to content

05AndroidKotlin · Compose · Hilt · MVI

Graditelj Navika

An Android habit builder in Kotlin and Compose, and a practical lesson in what Firestore’s cache actually does.

MVIcapture pending
fig. 05 · habit streak grid, recomposition sketch (representation)

The hang that wasn’t in the UI

Saving a habit froze the button indefinitely. The cause was architectural: Firestore configured with a memory-only cache never resolves reads the way disk-backed persistence does, and the UI was waiting on a write path that behaved differently than assumed.

The fix landed in the cache configuration itself. Debugging Compose recomposition on the streak screens came after, once saves stopped hanging.

Architecture as insurance

MVI with Clean Architecture boundaries and Hilt injection kept state transitions predictable enough to debug methodically instead of by guesswork.

The polish layer: shimmer loading states, confetti when streaks land, Coil-managed profile images.

What makes it technically interesting

  • MVI / Clean Architecture with Hilt-managed injection across feature modules
  • Save-button hang traced to a memory-only Firestore cache configuration: fixed at the settings level, not papered over in UI
  • Compose recomposition debugging on the streak screens
  • Shimmer loading states, confetti animations and Coil profile-image support
GitHub Get in touch