Un clon educativo de Instagram desarrollado con Kotlin Compose, Room Database, Material Design 3 y arquitectura moderna de Android.
Este proyecto está diseñado para enseñar los conceptos fundamentales de desarrollo Android:
- XML vs Editor Gráfico: Comparación y migración a Compose
- Layouts: Diferencias entre LinearLayout y RelativeLayout (conceptos aplicados en Compose)
- Widgets Básicos: Implementación de componentes Material Design
- Actividades: Gestión del ciclo de vida y navegación
- Internacionalización: Soporte multiidioma
- Base de Datos: Room para persistencia local
- Arquitectura Moderna: MVVM, Repository Pattern, Hilt
- Kotlin - Lenguaje de programación
- Jetpack Compose - UI moderna y declarativa
- Material Design 3 - Sistema de diseño
- Hilt - Inyección de dependencias
- Room - Base de datos local SQLite
- DataStore - Almacenamiento de preferencias
- Gson - Serialización JSON
- Navigation Compose - Navegación entre pantallas
- Coil - Carga de imágenes
- Lifecycle - ViewModels y estados
- JUnit - Tests unitarios
- Espresso - Tests de UI
- Truth - Assertions mejoradas
- Configuración del proyecto con dependencias modernas
- Tema personalizado estilo Instagram
- Base de datos Room con entidades completas
- Componentes UI reutilizables (botones, campos, cards)
- Sistema de navegación con Bottom Navigation
- Internacionalización (Español/Inglés)
- Arquitectura base con repositorios
- Pantallas de autenticación (Login/Registro)
- Feed principal con posts y stories
- Pantalla de perfil de usuario
- Sistema de comentarios
- Búsqueda y exploración
- Integración con API REST
- Notificaciones push
- Stories con temporizador
- Chat directo
- Filtros de cámara
app/
├── src/main/java/pe/edu/idat/dsi/dami/idatgram/
│ ├── data/ # Capa de datos
│ │ ├── dao/ # Data Access Objects
│ │ │ ├── UserDao.kt
│ │ │ ├── PostDao.kt
│ │ │ ├── CommentDao.kt
│ │ │ └── StoryDao.kt
│ │ ├── database/ # Configuración Room
│ │ │ └── IdatgramDatabase.kt
│ │ ├── entity/ # Entidades de BD
│ │ │ ├── User.kt
│ │ │ ├── Post.kt
│ │ │ ├── Comment.kt
│ │ │ └── Story.kt
│ │ └── repository/ # Repositorios
│ │ ├── UserRepository.kt
│ │ └── PostRepository.kt
│ ├── di/ # Inyección de dependencias
│ │ └── DatabaseModule.kt
│ ├── navigation/ # Navegación
│ │ ├── IdatgramRoutes.kt
│ │ ├── IdatgramNavGraph.kt
│ │ └── IdatgramBottomNavigation.kt
│ ├── ui/
│ │ ├── components/ # Componentes reutilizables
│ │ │ ├── Buttons.kt
│ │ │ ├── TextFields.kt
│ │ │ └── Cards.kt
│ │ ├── screens/ # Pantallas (próximamente)
│ │ └── theme/ # Tema personalizado
│ │ ├── Color.kt
│ │ ├── Theme.kt
│ │ └── Type.kt
│ ├── IdatgramApplication.kt # Application principal
│ └── MainActivity.kt # Activity principal
├── src/main/res/
│ ├── values/strings.xml # Strings en español
│ └── values-en/strings.xml # Strings en inglés
└── build.gradle.kts # Configuración del módulo
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ UI (Compose) │ -> │ ViewModel │ -> │ Repository │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
v
┌─────────────────┐ ┌─────────────────┐
│ Remote API │ │ Local Database │
│ (Futuro) │ │ (Room) │
└─────────────────┘ └─────────────────┘
erDiagram
USER ||--o{ POST : creates
USER ||--o{ COMMENT : writes
USER ||--o{ STORY : publishes
USER ||--o{ USER_FOLLOW : follows
POST ||--o{ COMMENT : has
POST ||--o{ POST_LIKE : receives
POST ||--o{ SAVED_POST : saved_by
COMMENT ||--o{ COMMENT_LIKE : receives
STORY ||--o{ STORY_VIEW : viewed_by
USER {
string id PK
string username
string email
string displayName
string bio
string profileImageUrl
int followersCount
int followingCount
int postsCount
boolean isVerified
boolean isPrivate
}
POST {
string id PK
string userId FK
string caption
string imageUrl
int likesCount
int commentsCount
string location
long createdAt
}
- Android Studio Hedgehog (2023.1.1) o superior
- JDK 11 o superior
- Android SDK 34
- Dispositivo/Emulador con API 29+
-
Clonar el repositorio
git clone https://github.com/tu-usuario/idatgram.git cd idatgram -
Abrir en Android Studio
- Abrir Android Studio
- Seleccionar "Open an existing project"
- Navegar a la carpeta del proyecto
-
Sincronizar dependencias
./gradlew clean build
-
Ejecutar la aplicación
- Conectar dispositivo o iniciar emulador
- Ejecutar desde Android Studio o:
./gradlew installDebug
Este proyecto está estructurado en módulos progresivos:
- Módulo 1: Configuración y componentes básicos
- Módulo 2: Base de datos y arquitectura
- Módulo 3: Navegación y pantallas
- Módulo 4: Funcionalidades avanzadas
El proyecto incluye:
- Comentarios extensivos en el código
- TODOs estructurados para completar en clase
- Ejercicios progresivos de dificultad creciente
- Ejemplos comparativos (XML vs Compose)
-
Componentes básicos:
- Crear nuevos componentes UI
- Personalizar el tema de colores
- Agregar nuevos idiomas
-
Base de datos:
- Agregar nuevas entidades
- Crear consultas complejas
- Implementar migraciones
-
Navegación:
- Agregar nuevas pantallas
- Implementar deep linking
- Crear animaciones de transición
# Limpiar proyecto
./gradlew clean
# Build completo
./gradlew build
# Ejecutar tests
./gradlew test
# Generar APK de debug
./gradlew assembleDebug# Ver esquema de BD (en dispositivo rooteado)
adb shell
run-as pe.edu.idat.dsi.dami.idatgram
cd databases
sqlite3 idatgram_database
# Comandos SQL útiles
.tables
.schema users
SELECT * FROM users;- Declarativo vs Imperativo
- State Management
- Recomposición
- Preview Functions
- Design System
- Color Schemes
- Typography Scale
- Component Library
- Entities y Relationships
- DAOs y Queries
- Migrations
- Repository Pattern
- MVVM Pattern
- Dependency Injection
- Clean Architecture
- Separation of Concerns
Editar ui/theme/Color.kt:
val InstagramBlue = Color(0xFF405DE6)
val InstagramPink = Color(0xFFC13584)
// Personalizar según necesidades- Crear carpeta
values-[codigo]/ - Agregar
strings.xmltraducido - Usar
stringResource(R.string.key)en Compose
Seguir el patrón establecido en ui/components/:
@Composable
fun MiComponente(
parametros: Tipo,
modifier: Modifier = Modifier
) {
// Implementación
}
@Preview
@Composable
private fun MiComponentePreview() {
IdatgramTheme {
MiComponente(parametrosEjemplo)
}
}- Fork del proyecto
- Crear rama feature:
git checkout -b feature/nueva-funcionalidad - Commit cambios:
git commit -m 'Agregar nueva funcionalidad' - Push a la rama:
git push origin feature/nueva-funcionalidad - Crear Pull Request
- Nomenclatura: PascalCase para clases, camelCase para funciones
- Comentarios: Documenta funciones públicas
- Previews: Incluir @Preview para componentes UI
- Testing: Escribir tests para lógica de negocio
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE.md para detalles.
- Julio Leonardo - Desarrollo inicial - @jleonardoDeveloper
- IDAT por el apoyo educativo
- Comunidad Android por las mejores prácticas
- Material Design por las guías de diseño
- Instagram por la inspiración de diseño
- Issues: GitHub Issues
- Documentación: Wiki del proyecto
- Email: julio.leonardo.developer@gmail.com
¡Esperamos que este proyecto te ayude a aprender desarrollo Android moderno! 🚀📱