A simple and elegant mobile application that provides essential information about the sun's position and path.
SolPan is a foundational application for understanding the sun's movement, built with a modern Android tech stack.
- Clean, Intuitive UI: A modern interface built with Jetpack Compose and Material 3 Expressive.
- Solid Foundation: A well-structured project that's easy to build upon.
- Solar Panel Optimization: Use the phone sensors to orient your solar panels for maximum energy output.
- Adaptive Layout: Staggered grid UI that adapts gracefully to both phone and tablet screen widths.
SolPan follows a straightforward single-screen architecture with a clear separation of concerns:
- ViewModel + StateFlow — UI state is managed in a single
ViewModeland exposed as aStateFlow, keeping the composables stateless and easy to test. - Clean Analytics Abstraction — All event tracking is routed through a testable
AnalyticsTrackerinterface, decoupling the UI from any specific analytics backend. - Adaptive Layout — The staggered grid automatically adjusts column count based on available window width, providing a polished experience on phones and tablets alike.
📖 For detailed architecture, design decisions, performance tuning, security hardening, and testing strategies, see:
- API Documentation - Dokka-generated reference for all public APIs
- ARCHITECTURE.md — Deep dive into modular design patterns
- PERFORMANCE.md — Baseline metrics and optimization strategies
- SECURITY.md — Security practices and data protection
- TESTING.md — Testing strategies and benchmarking
- RELEASE.md — Semantic versioning, automated release workflow, changelog management
- CODE_COVERAGE.md — Code coverage metrics, quality gates, and CI/CD reporting
To build and run the project, you'll need:
- Android Studio Meerkat | 2025.1.1 or later
- JDK 21
Clone the repository and open it in Android Studio:
git clone https://github.com/mobilemobilellc/solpan.git# Assemble a release APK
./gradlew assembleRelease
# Format code
./gradlew app:spotlessApply
# Run static analysis
./gradlew app:detekt
# Run unit tests (45 tests)
./gradlew :app:testDebugUnitTest
# Regenerate screenshot reference images (after intentional UI changes)
./gradlew :app:updateDebugScreenshotTest
# Validate screenshots haven't changed
./gradlew :app:validateDebugScreenshotTestThis project is a showcase of modern Android development practices.
| Category | Library / Tool |
|---|---|
| Language | 100% Kotlin |
| UI | Jetpack Compose + Material 3 Expressive (1.5.0-alpha17) |
| Navigation | Navigation 3 (nav3 1.2.0-alpha01) |
| State management | Lifecycle ViewModel + StateFlow (2.11.0-alpha03) |
| Async | Coroutines & Flow |
| Permissions | Accompanist Permissions |
| Persistence | DataStore Preferences |
| Analytics | Firebase Analytics + Crashlytics + Performance Monitoring, abstracted via AnalyticsTracker |
| Screenshot testing | Android Compose Screenshot Testing (com.android.compose.screenshot) |
| Code quality | Detekt + Spotless/ktlint |
| Performance | Baseline Profiles + ProGuard/R8 |
Contributions are welcome! Whether it's reporting a bug, suggesting a feature, or submitting a pull request, all help is appreciated. Please see CONTRIBUTING.md for detailed guidelines.
- Website: mobilemobile.app
- Support Us: Buy Me a Coffee

