Una aplicación Android moderna para consultar el clima de cualquier ciudad del mundo, desarrollada con Jetpack Compose y las últimas tecnologías de Android.
- Consulta del clima por ciudad: Obtén información meteorológica actualizada de cualquier ubicación
- Búsqueda inteligente: Sistema de autocompletado para encontrar ciudades fácilmente
- Pronóstico extendido: Información del clima para los próximos 3 días
- Interfaz moderna: Diseñada con Material Design 3 y Jetpack Compose
- Animaciones fluidas: Transiciones suaves y efectos visuales atractivos
- Datos en tiempo real: Información meteorológica actualizada
- Kotlin: Lenguaje principal de desarrollo
- Jetpack Compose: UI moderna y declarativa
- Hilt: Inyección de dependencias
- MVVM + Clean Architecture: Arquitectura modular con separación de capas
- Multi-Module Architecture: Módulos separados (app, domain, data)
- KSP: Kotlin Symbol Processing para generación de código
- Retrofit: Cliente HTTP para consumo de APIs
- OkHttp: Interceptores y logging de red
- Gson: Serialización/deserialización JSON
- Kotlinx Serialization: Manejo de datos JSON
- Compose Animations: Animaciones fluidas y naturales
- Custom Themes: Temas personalizados con colores dinámicos
- Material Design Components: Componentes modernos y accesibles
- Material Design 3: Sistema de diseño moderno
- Material Icons Extended: Iconografía extendida
- Coil: Carga de imágenes optimizada
- Splash Screen: Pantalla de inicio personalizada con animaciones
- Responsive Design: Adaptable a diferentes tamaños de pantalla
- Navigation Compose: Navegación entre pantallas
- Lifecycle Runtime Compose: Manejo del ciclo de vida
- Coroutines: Programación asíncrona
- Android SDK: Mínimo API 26 (Android 8.0)
- Compile SDK: API 36 (Android 15)
- Target SDK: API 36 (Android 15)
- Kotlin: 2.2.21
- Java: 11
- Gradle: 8.13.1
- KSP: 2.2.21-2.0.4
git clone https://github.com/tu-usuario/WeatherScope.git
cd WeatherScopeLa aplicación está preconfigurada y lista para usar. No se requiere configuración adicional de APIs externas.
./gradlew assembleDebugO abrir el proyecto en Android Studio y ejecutar directamente.
El proyecto sigue una arquitectura Clean Architecture con módulos separados para una mejor organización y mantenibilidad:
WeatherScope/
├── app/ # Módulo principal de la aplicación
│ ├── src/main/java/com/bold/weatherscope/
│ │ ├── presentation/ # UI y ViewModels
│ │ │ ├── splash/ # Pantalla de splash
│ │ │ ├── main/ # Pantalla principal con búsqueda
│ │ │ ├── detail/ # Pantalla de detalle del clima
│ │ │ └── components/ # Componentes reutilizables
│ │ ├── di/ # Módulos de inyección de dependencias
│ │ │ ├── NetworkModule.kt # Configuración de red
│ │ │ └── RepositoryModule.kt # Binding de repositorios
│ │ ├── navigation/ # Navegación entre pantallas
│ │ └── ui/theme/ # Tema y colores de la app
│ ├── src/main/res/ # Recursos Android (layouts, strings, etc.)
│ ├── src/test/ # Tests unitarios
│ ├── src/androidTest/ # Tests de instrumentación
│ └── build.gradle.kts # Configuración del módulo app
│
├── domain/ # Módulo de dominio (lógica de negocio)
│ ├── src/main/java/com/bold/domain/
│ │ ├── model/ # Modelos de dominio
│ │ │ ├── SearchLocation.kt # Modelo de ubicación de búsqueda
│ │ │ └── WeatherForecast.kt # Modelo de pronóstico del clima
│ │ ├── repository/ # Interfaces de repositorios
│ │ │ └── WeatherRepository.kt
│ │ ├── usecase/ # Casos de uso
│ │ │ ├── SearchLocationsUseCase.kt
│ │ │ └── GetForecastUseCase.kt
│ │ └── util/ # Utilidades del dominio
│ │ └── Resource.kt # Wrapper para estados de datos
│ └── build.gradle.kts # Configuración del módulo domain
│
├── data/ # Módulo de datos (acceso a datos)
│ ├── src/main/java/com/bold/data/
│ │ ├── remote/ # Fuentes de datos remotas
│ │ │ ├── api/ # Interfaces de API
│ │ │ │ └── WeatherApi.kt # API del clima
│ │ │ └── dto/ # Data Transfer Objects
│ │ │ ├── SearchLocationDto.kt
│ │ │ └── ForecastDto.kt
│ │ ├── repository/ # Implementaciones de repositorios
│ │ │ └── WeatherRepositoryImpl.kt
│ │ └── mapper/ # Mappers DTO → Domain
│ │ └── WeatherMapper.kt
│ └── build.gradle.kts # Configuración del módulo data
│
├── gradle/
│ ├── libs.versions.toml # Catálogo centralizado de versiones
│ └── wrapper/ # Gradle Wrapper
├── build.gradle.kts # Configuración raíz del proyecto
├── settings.gradle.kts # Configuración de módulos
└── README.md
- Responsabilidad: Capa de presentación y configuración de la aplicación
- Contiene: Activities, Composables, ViewModels, Navigation, DI, Themes
- Dependencias: Depende de
domainydatamodules
- Responsabilidad: Lógica de negocio pura, independiente de frameworks
- Contiene: Modelos de dominio, Use Cases, Repository interfaces, Utilities
- Dependencias: Solo Kotlin estándar, sin dependencias de Android
- Responsabilidad: Acceso a datos externos (APIs, bases de datos)
- Contiene: Repository implementations, API clients, DTOs, Mappers
- Dependencias: Retrofit, OkHttp, Gson, implementa interfaces de
domain
UI (Compose) → ViewModel → UseCase → Repository Interface (Domain)
↓
Repository Implementation (Data) → API
Esta arquitectura modular proporciona:
- ✅ Separación de responsabilidades
- ✅ Facilidad para testing
- ✅ Reutilización de código
- ✅ Mantenibilidad mejorada
- ✅ Escalabilidad del proyecto
La aplicación requiere los siguientes permisos:
INTERNET: Acceso a internet para funcionalidad de redACCESS_NETWORK_STATE: Estado de la red para verificar conectividad
Asegúrate de configurar las siguientes variables:
- Configuraciones de debug/release según el entorno de desarrollo
WeatherScope cuenta con una suite completa de tests unitarios que cubren toda la lógica de negocio y validaciones críticas del proyecto.
# Ejecutar tests de todos los módulos
./gradlew :domain:test :app:testDebugUnitTest
# O usar el script automatizado
./scripts/check_coverage.sh# Generar reporte HTML y XML de cobertura
./gradlew jacocoTestReport
# Ver reporte HTML en:
# app/build/reports/jacoco/jacocoTestReport/html/index.html# Ejecutar pipeline completo (limpieza, tests, cobertura)
./scripts/run_tests.sh./gradlew :domain:test./gradlew :app:testDebugUnitTest./gradlew clean :domain:test :app:testDebugUnitTestLos reportes se generan automáticamente en:
app/build/reports/
├── jacoco/jacocoTestReport/
│ ├── html/index.html # Reporte HTML interactivo
│ └── jacocoTestReport.xml # Reporte XML para CI/CD
└── tests/testDebugUnitTest/
└── index.html # Resultados de tests unitarios
- JUnit 4: Framework principal de testing
- Mockito: Mocking de dependencias
- Turbine: Testing de Kotlin Flows
- Jacoco: Reportes de cobertura de código
El proyecto incluye un pipeline completo de GitHub Actions:
# .github/workflows/ci.yml
- Ejecuta tests automáticamente en cada push/PR
- Genera reportes de cobertura
- Verifica calidad de código con lint
- Construye APK de debug
- Publica reportes en Codecov# Simular pipeline completo
./scripts/run_tests.sh./gradlew :domain:test --info./gradlew :domain:test --tests "SearchLocationsUseCaseTest"./gradlew :domain:test --continue./gradlew assembleDebug./gradlew assembleRelease- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-caracteristica) - Commit tus cambios (
git commit -am 'Agrega nueva característica') - Push a la rama (
git push origin feature/nueva-caracteristica) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Desarrollado con ❤️ por Jimmy alejandro reyes vega