88 lines
3.4 KiB
Markdown
88 lines
3.4 KiB
Markdown
# Contacts Assessment App
|
|
|
|
A simplified Kotlin Multiplatform (KMP) contacts management app designed for technical interviews.
|
|
This app mirrors GART architecture patterns and contains intentional bugs for candidates to identify
|
|
and fix.
|
|
|
|
## Project Overview
|
|
|
|
This is an Android-focused KMP app that displays contacts and groups with the following features:
|
|
|
|
- Bottom navigation with Groups and Contacts tabs
|
|
- Status badges for contacts (Active, Pending, Inactive)
|
|
- Nostr-style npub identifiers for contacts
|
|
- Avatar images loaded from network
|
|
- Room database with reactive Flow-based queries
|
|
- Clean Architecture with domain, data, and presentation layers
|
|
- ViewObjects (VOs) separating domain from presentation
|
|
- Dependency injection with Koin
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Android Studio Ladybug (2024.2.1) or newer
|
|
- Android SDK 26+
|
|
- JDK 17 is **auto-provisioned** by the Gradle toolchain — no manual install needed
|
|
|
|
### Build & Run
|
|
|
|
```bash
|
|
# Build debug APK
|
|
./gradlew assembleDebug
|
|
|
|
# On Windows, use:
|
|
gradlew.bat assembleDebug
|
|
|
|
# Install on connected device
|
|
adb install -r composeApp/build/outputs/apk/debug/composeApp-debug.apk
|
|
|
|
# Or run directly from Android Studio
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
| Problem | Fix |
|
|
|---------|-----|
|
|
| `Unsupported class file major version` | The toolchain should handle this automatically. If not, ensure JDK 17+ is installed. |
|
|
| Out of memory during build | Increase heap in `gradle.properties`: `org.gradle.jvmargs=-Xmx3072M` |
|
|
| `SDK location not found` | Create a `local.properties` file with `sdk.dir=/path/to/your/Android/Sdk` |
|
|
| Gradle sync fails in Android Studio | File -> Invalidate Caches -> Restart, then re-sync. |
|
|
|
|
## Architecture
|
|
|
|
```
|
|
composeApp/src/
|
|
├── androidMain/kotlin/io/assessment/contacts/
|
|
│ ├── ContactsApplication.kt
|
|
│ ├── MainActivity.kt
|
|
│ └── di/DatabaseModule.kt # Android-specific Room setup
|
|
└── commonMain/kotlin/io/assessment/contacts/
|
|
├── App.kt
|
|
├── MainViewModel.kt
|
|
├── core/
|
|
│ ├── data/
|
|
│ │ ├── database/ # Room entities, DAOs, DatabaseSeeder
|
|
│ │ ├── datasource/ # Data sources
|
|
│ │ └── repository/ # Repository implementations
|
|
│ ├── domain/
|
|
│ │ ├── contact/ # Contact, ContactStatus, ContactError
|
|
│ │ ├── group/ # Group, GroupError
|
|
│ │ ├── result/ # Result type utilities
|
|
│ │ └── usecase/ # Use case interfaces
|
|
│ └── presentation/ # Shared presentation utilities
|
|
├── contacts/
|
|
│ ├── data/ # ContactMapper
|
|
│ ├── domain/ # ObserveContactsUseCase
|
|
│ ├── di/ # ContactsModule
|
|
│ └── presentation/ # ViewModel, Screen, State, ContactVO
|
|
├── groups/
|
|
│ ├── data/ # GroupMapper
|
|
│ ├── domain/ # ObserveGroupsUseCase
|
|
│ ├── di/ # GroupsModule
|
|
│ └── presentation/ # ViewModel, Screen, State, GroupVO
|
|
├── designsystem/ # Theme, Colors, Typography
|
|
├── navigation/ # NavigationRoot, BottomNavDestItem
|
|
└── di/ # App-level DI modules
|
|
```
|