A modern Android application combining expense tracking (Ledger) with AI-powered travel itinerary planning, built with Kotlin and Jetpack Compose.
- Group Management: Create and manage expense groups with multiple members
- Smart Expense Splitting:
- Equal split - automatically divides expenses evenly
- Manual split - customize amounts for each member
- Balance Tracking: Real-time calculation of who owes whom
- Expense History: View all group expenses with details
- AI-Powered Generation: Describe your travel needs and let AI create a personalized itinerary
- Itinerary Management: View and organize your travel plans
- Detailed Planning: See locations, times, and descriptions for each itinerary item
- Material Design 3
- Dark/Light theme support
- Pull-to-refresh
- Bottom navigation
- Smooth animations
- Language: Kotlin
- UI: Jetpack Compose (Material 3)
- Architecture: MVVM (Model-View-ViewModel)
- Dependency Injection: Hilt
- Networking: Retrofit 2 + OkHttp 3
- JSON: Moshi
- Navigation: Navigation Compose
- Storage: DataStore (Preferences)
- Async: Kotlin Coroutines + Flow
app/src/main/java/cc/jingtianhu/groupledger/
βββ data/
β βββ api/ # API definitions and DTOs
β βββ repository/ # Data repositories
βββ di/ # Dependency injection modules
βββ features/
β βββ auth/ # Login & Registration
β βββ itinerary/ # Travel itinerary features
β β βββ list/
β β βββ detail/
β β βββ generate/
β βββ ledger/ # Expense tracking features
β βββ list/
β βββ detail/
β βββ balance/
β βββ add_expense/
β βββ add_group/
βββ navigation/ # Navigation setup
βββ ui/theme/ # Theme and styling
βββ MainActivity.kt # App entry point
- Android Studio Hedgehog or newer
- JDK 17
- Android SDK (API level 26+)
- Backend API running (see backend setup)
- Ensure your Django backend is running on
localhost:8000 - Update
BASE_URLindi/NetworkModule.ktif using a different address:private const val BASE_URL = "http://10.0.2.2:8000/" // For emulator // or private const val BASE_URL = "http://YOUR_IP:8000/" // For physical device
- Clone the repository
- Open project in Android Studio
- Sync Gradle dependencies
- Run on emulator or device
POST /api/register/- User registrationPOST /api/login/- User login
GET /api/groups/- List groupsPOST /api/groups/- Create groupGET /api/groups/{id}/- Group detailsGET /api/groups/{id}/balances/- Group balancesPOST /api/expenses/- Create expense
GET /api/itineraries/- List itinerariesGET /api/itineraries/{id}/- Itinerary detailsPOST /api/itineraries/generate/- AI generate itineraryPOST /api/itinerary-items/- Create itinerary item
- Register: Create an account with username and password
- Login: Sign in to access your data
- Create a Group: Tap the + button on Groups screen
- Add Members: Enter member user IDs (comma-separated)
- Add Expenses:
- Tap + in a group
- Enter description and amount
- Select who paid
- Choose split type (Equal or Manual)
- Review split amounts
- Create expense
- View Balances: Tap "View Balances" button in group detail
- Generate Itinerary:
- Tap + on Itinerary screen
- Enter destination (e.g., "Tokyo")
- Describe your needs (e.g., "3 days, interested in food and culture")
- Tap "Generate Itinerary"
- Wait for AI to create your plan
- View Details: Tap any itinerary to see full schedule
Modify in NetworkModule.kt:
OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)HTTP logging is enabled by default. To disable in production:
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.NONE) // Change to NONESee KNOWN_ISSUES.md for detailed list of known bugs and limitations.
- Member IDs must be entered manually when creating groups (no user search)
- Dummy IDs used in AddExpense (will cause API errors)
- No logout function
- No input validation on some fields
See IMPLEMENTATION_SUMMARY.md for complete implementation details.
- Authentication (login/register)
- Group management
- Expense creation with splits
- Balance viewing
- Itinerary generation (AI)
- Itinerary viewing
- Bottom navigation
- Pull-to-refresh
- User search for groups
- Receipt image upload
- Comprehensive testing
- Production-ready error handling
- Manual itinerary creation
- Expense editing/deletion
./gradlew test./gradlew connectedAndroidTestNote: Tests need to be written. See testing strategy in blueprint.
- Follow Kotlin coding conventions
- Use meaningful variable names
- Add KDoc comments for public functions
- Keep composables small and focused
main- Production-ready codedevelop- Development branchfeature/*- Feature branches
Key dependencies (see app/build.gradle.kts for versions):
androidx.compose.material3- Material Design 3androidx.navigation:navigation-compose- Navigationcom.google.dagger:hilt-android- Dependency injectioncom.squareup.retrofit2:retrofit- HTTP clientcom.squareup.moshi:moshi-kotlin- JSON parsingandroidx.datastore:datastore-preferences- Local storage
[Add your license here]
[Add your name here]
- Blueprint design inspired by modern travel and expense tracking apps
- AI itinerary generation powered by backend AI service
- Material Design 3 guidelines
For issues and questions:
- Check KNOWN_ISSUES.md
- Review IMPLEMENTATION_SUMMARY.md
- See ITEMIZED_OCR_IMPLEMENTATION_GUIDE.md for OCR receipt scanning feature
- See AUTO_REFRESH_FIX.md for auto-refresh implementation details
- Create a GitHub issue
Built with β€οΈ using Kotlin and Jetpack Compose