An Android app that lets users compare 2 providers of a service at a time - ride-sharing (Uber and Bolt) or food delivery (pick any 2 of Uber Eats, Bolt Food, and Glovo) - side-by-side in split screen mode.
CompareApp simplifies comparing prices between two apps at once by opening both side-by-side in split screen with your search already filled in - locations for rides, or a restaurant/dish for food delivery. A snackbar reminds you to swipe the middle divider up or down to pick the cheaper one. Which food delivery apps are compared is configurable from Settings.
- Modern UI: Built with Jetpack Compose and Material3 design system
- Split Screen Mode: Automatically opens two apps side-by-side, with a hint on how to swipe to the one you want
- Ride Comparison: Compares Uber and Bolt for a given pickup/dropoff
- Food Delivery Comparison: Compares any 2 of Uber Eats, Bolt Food, and Glovo for a restaurant or dish search, configurable from Settings
- Smart Geocoding: Converts text addresses to coordinates for accurate location matching
- Deep Linking: Seamlessly integrates with each provider's app using their deep link APIs
- Incoming Location Links: Share a location from Maps ("Open with" a
geo:link) to prepopulate the dropoff field, using your current location as pickup - Location Services: Supports current location detection with Google Play Services
- Offline Fallback: Gracefully handles geocoding failures with text-based fallbacks
- MVVM Architecture: Clean separation of concerns with Hilt dependency injection
- Android device or emulator running Android 7.0 (API 24) or higher
- Uber and Bolt apps installed (for ride comparison)
- 2 of Uber Eats, Bolt Food, and Glovo installed (for food delivery comparison)
- Android Studio Hedgehog (2023.1.1) or later (for development)
-
Clone the repository:
git clone https://github.com/neteinstein/CompareUberVsBoltPriceApp.git cd CompareUberVsBoltPriceApp -
Open the project in Android Studio
-
Sync Gradle and build:
./gradlew assembleDebug
-
Run on your device or emulator
Rides:
- Launch the CompareApp
- Enter your pickup location (e.g., "Times Square, New York")
- Enter your dropoff location (e.g., "Central Park, New York")
- Tap the Compare button
- Both Uber and Bolt apps will open in split screen mode with your locations pre-filled
- Swipe the middle divider up or down to bring the cheaper one to full screen
Food delivery:
- Enter a restaurant name or a dish to search for
- Tap Search Food
- Your 2 selected food delivery apps (configurable under Settings > Comparison configuration) open in split screen with the search pre-filled where supported
- Swipe the middle divider up or down to bring the cheaper one to full screen
CompareApp follows the MVVM (Model-View-ViewModel) architecture pattern with Hilt dependency injection:
┌─────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌──────────────┐ ┌────────────────────┐ │
│ │ MainActivity │ ◄─────► │ CompareScreen │ │
│ │ (Entry Point) │ │ (Compose UI) │ │
│ └──────────────┘ └─────────┬──────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ MainViewModel │ │
│ │ (Business Logic)│ │
│ └────────┬────────┘ │
└─────────────────────────────────────┼───────────────────┘
│
┌─────────────────────────────────────┼───────────────────┐
│ Domain Layer │ │
│ │ │
│ ┌────────────────────────┴────────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────────┐ ┌─────────────────┐ │
│ │ LocationRepository│ │ AppRepository │ │
│ │ (Geocoding & │ │ (App Install │ │
│ │ Location) │ │ Checking) │ │
│ └──────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
┌────────────────────────┴─────────────────────────────────┐
│ Data Layer │
│ ┌──────────────────┐ ┌─────────────────┐ │
│ │ Geocoder │ │ PackageManager │ │
│ │ (Android System) │ │ (Android System)│ │
│ └──────────────────┘ └─────────────────┘ │
└──────────────────────────────────────────────────────────┘
- MainActivity: Android entry point and deep link launcher
- CompareScreen: Jetpack Compose UI for user input
- MainViewModel: Manages UI state and business logic
- LocationRepository: Handles geocoding and location services
- AppRepository: Checks app installation status
# Debug build
./gradlew assembleDebug
# Install to connected device
./gradlew installDebug
# Run tests
./gradlew test
# Run lint checks
./gradlew lint# Build unsigned release APK
./gradlew assembleReleaseThe APK will be at: app/build/outputs/apk/release/app-release-unsigned.apk
For signed releases and Play Store deployment, see docs/DEPLOYMENT.md
- CHANGELOG - Release history and version changes
- Architecture Guide - Detailed low-level architecture
- Deep Links Reference - Uber, Uber Eats, Bolt, and Bolt Food deep-link formats: what's officially documented, what's verified from each app's manifest, and what's still an unverified guess
- CI/CD Pipeline - Continuous integration and deployment
- Deployment Guide - Play Store deployment process
- Future Roadmap - Ideas for future enhancements
- Language: Kotlin
- Min SDK: 24 (Android 7.0 Nougat)
- Target SDK: 36 (Android 14+)
- UI Framework: Jetpack Compose with Material3
- Architecture: MVVM with Hilt dependency injection
- Location Services: Google Play Services Location API
- Geocoding: Android Geocoder API
- Testing: JUnit, Mockito, Robolectric, Espresso
- Android device with API 24+ (Android 7.0 or higher)
- Split screen support (available on Android 7.0+)
- Uber and Bolt apps installed from Play Store (for ride comparison)
- The 2 food delivery apps selected in Settings installed from Play Store (for food delivery comparison)
- Internet connection (for geocoding)
- Location permissions (for current location feature)
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For issues and questions, please open an issue on GitHub.