Imagify es una aplicación Android moderna para explorar, buscar y descargar fotos de Unsplash, diseñada con Jetpack Compose y arquitectura limpia. ¡Descubre imágenes increíbles y personaliza tu experiencia!
- 🖼️ Explora fotos editoriales y populares de Unsplash
- 🔍 Búsqueda avanzada por palabras clave y orientación
- 📥 Descarga imágenes directamente a tu dispositivo
- 🎨 Interfaz moderna con Material 3 y Jetpack Compose
- ⚡️ Carga rápida y caché inteligente con Coil
- 🔒 Preferencias de usuario y configuración personalizable
- 🔗 Detalles completos de cada foto y autor
- 🛡️ Integración con Firebase Crashlytics, Analytics y Performance
| Pantalla Principal | Búsqueda | Detalle de Imagen | Datos EXIF |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Clona el repositorio:
git clone https://github.com/juanmadev5/Imagify.git
- Abre el proyecto en Android Studio.
- Configura tu clave de API de Unsplash:
- Ve a
app/src/main/java/com/jmdev/app/imagify/Constants.kty agrega tu API Key en la constanteUNSPLASH_API_KEY.
- Ve a
- Agrega tu
google-services.jsonde Firebase:- Creá un proyecto en Firebase Console, registrá la app con el namespace
com.jmdev.app.imagifyy descargá el archivogoogle-services.jsongenerado. - Colocalo en
app/google-services.json(el archivo no está versionado en el repo).
- Creá un proyecto en Firebase Console, registrá la app con el namespace
- Sincroniza dependencias y ejecuta en tu dispositivo/emulador.
Imagify/
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/jmdev/app/imagify/
│ │ │ │ ├── data/
│ │ │ │ │ ├── paging/ # PagingSource de Home y Búsqueda
│ │ │ │ │ ├── remote/ # API, interceptores
│ │ │ │ │ ├── repository/ # Implementación de repositorios
│ │ │ │ ├── domain/
│ │ │ │ │ ├── repository/ # Contratos de repositorios
│ │ │ │ │ ├── usecase/ # Casos de uso
│ │ │ │ ├── di/ # Inyección de dependencias (Koin)
│ │ │ │ ├── model/ # Modelos de dominio
│ │ │ │ ├── presentation/ # UI y pantallas (Compose)
│ │ │ │ ├── utils/ # Utilidades
│ │ │ ├── res/ # Recursos gráficos y strings
│ ├── build.gradle.kts
├── assets/ # Screenshots
├── README.md
Imagify incluye pruebas unitarias que validan la configuración base de la aplicación, la integración de dependencias con Koin y Coil, la lógica de los casos de uso del dominio, y el comportamiento de los StateFlow expuestos por los ViewModels.
Los tests viven en:
app/src/test/java/com/jmdev/app/imagify/
├── AppTest.kt
├── domain/usecase/
│ ├── DownloadPhotoUseCaseTest.kt
│ ├── GetPhotoUseCaseTest.kt
│ ├── GetUserPreferencesUseCaseTest.kt
│ ├── GetUserProfileUseCaseTest.kt
│ ├── SaveOrientationUseCaseTest.kt
│ └── SaveQualityUseCaseTest.kt
├── presentation/screens/
│ ├── imageDetailScreen/ImageDetailViewModelTest.kt
│ ├── mainScreen/MainScreenViewModelTest.kt
│ └── settingsScreen/SettingsViewModelTest.kt
Qué se prueba:
- ✅ Verificación de módulos de Koin (
appModule.verify()) - ✅ Políticas de caché (memoria, disco, red) de las requests de imágenes armadas con
buildImageRequest - ✅ Casos de uso del dominio (
GetPhotoUseCase,GetUserProfileUseCase,GetUserPreferencesUseCase,SaveOrientationUseCase,SaveQualityUseCase,DownloadPhotoUseCase), mockeando los repositorios con Mockito - ✅ Los
StateFlowdeMainScreenViewModel,ImageDetailViewModelySettingsViewModel(carga de preferencias, eventos de UI, estados de descarga), usando Turbine
Para correrlos:
./gradlew testDebugUnitTestAnálisis estático (debe pasar limpio antes de dar por terminado un cambio):
./gradlew lint
./gradlew detektdetekt usa un baseline (app/config/detekt/baseline.xml) para no re-señalar deuda de estilo preexistente; un cambio nuevo debe seguir pasando sin agregar hallazgos.
- Fotos proporcionadas por Unsplash
- Iconos de Material Icons
- Desarrollado por @juanmadev5
¡Contribuciones y sugerencias son bienvenidas! ⭐



