A 2-screen note-taking Android app built with Jetpack Compose, following clean architecture with feature-layered modularization. Uses Koin for dependency injection.
:app ← Application, MainActivity, nav wiring
:build-logic ← Gradle convention plugins
:core:domain ← Result, Error, DataError, UiText (pure Kotlin)
:core:presentation ← ObserveAsEvents, UiText extensions, DataError.toUiText()
:core:design-system ← AppButton, AppTextField, AppCard, AppIcons, theme
:feature:notes:domain ← Note, NoteError, NoteRepository interface
:feature:notes:data ← Room DB, NoteDao, RoomNoteDataSource, repository impl
:feature:notes:presentation ← ViewModels, State/Action/Event, screens, nav routes
presentation→domain,core:*data→domain,core:*domain→core:domainonly:app→ everything
- Note List — shows all notes (LazyColumn), FAB to create, delete via icon, tap to edit.
- Note Editor — create/edit note with title + content fields, save & delete, process-death restoration via
SavedStateHandle.
Requires Android SDK and a JDK 17.
# Generate the Gradle wrapper (once, with Gradle installed)
gradle wrapper --gradle-version 8.5
# Assemble debug APK
./gradlew :app:assembleDebug
# Run unit tests
./gradlew :feature:notes:presentation:test
./gradlew :feature:notes:data:test- MVI:
State/Action/Event(only when one-time side effects exist),Root/Screencomposable split. - Result wrapper:
Result<T, E>withDataErrorand featureNoteError. - Koin: per-layer modules (
notesDataModule,notesPresentationModule) assembled inNotesApplication. - Type-safe navigation:
@Serializableroute objects + feature nav graph. - Accessibility & responsiveness: content descriptions, 48dp touch targets, font-scale & width previews, light/dark theme.