Esta aplicación móvil Android permite a los usuarios registrarse, iniciar sesión y gestionar información sobre sus mascotas. Utiliza Firebase Authentication para la autenticación de usuarios y Firebase Firestore como base de datos para almacenar los datos de las mascotas. La interfaz de usuario ha sido modernizada recientemente con un tema verde predominante y elementos visuales mejorados.
El flujo principal de la aplicación es el siguiente:
- Pantalla de Splash (
SplashActivity): Se muestra brevemente al iniciar la aplicación. - Pantalla de Login/Registro (
Login): Permite a los usuarios existentes iniciar sesión o a los nuevos usuarios registrarse. La autenticación se realiza con Firebase, incluyendo verificación por correo electrónico. - Pantalla de Bienvenida (
Bienvenida): Una vez autenticado, el usuario accede a esta pantalla que sirve como menú principal, ofreciendo opciones como registrar una nueva mascota o ver las mascotas existentes. - Gestión de Mascotas:
- Formulario de Mascotas (
FormPets): Para registrar los detalles de una nueva mascota. - Visualización de Mascotas (
PetsTarActivity conteniendoPetsFragment): Muestra una lista de las mascotas registradas por el usuario. - Detalle y Edición de Mascota (
PetsClinicFragment): Permite ver, modificar o eliminar los datos de una mascota seleccionada.
- Formulario de Mascotas (
A continuación, se detallan las principales Activities, Fragments, Layouts y otros componentes clave.
- Layout Asociado:
layout_splash.xml - Propósito: Es la primera pantalla que ve el usuario al abrir la aplicación. Muestra una imagen o logo de bienvenida durante un breve período (2 segundos).
- Funcionamiento:
- Infla
layout_splash.xml. - Utiliza un
Handlerpara introducir un retraso. - Después del retraso, navega automáticamente a
LoginActivity y finalizaSplashActivitypara que el usuario no pueda volver a ella.
- Infla
- Layout (
layout_splash.xml):
- Layout Asociado:
layout_login.xml - Propósito: Gestiona la autenticación de usuarios, permitiendo el inicio de sesión para usuarios existentes y el registro para nuevos usuarios.
- Funcionamiento:
- Infla
layout_login.xml. - Inicializa los campos de texto para email (
TextEmail) y contraseña (TextPassword), y los botones de login (Btnlogin) y registro (Btnregistrar). - Registro:
- Al pulsar "Registrar", obtiene el email y la contraseña.
- Valida que la contraseña tenga al menos 6 caracteres.
- Llama a
auth.createUserWithEmailAndPassword()de Firebase. - Si el registro es exitoso, envía un correo de verificación (
user.sendEmailVerification()) y muestra un mensaje al usuario.
- Inicio de Sesión:
- Al pulsar "Login", obtiene el email y la contraseña.
- Valida que los campos no estén vacíos.
- Llama a
auth.signInWithEmailAndPassword()de Firebase. - Si el inicio de sesión es exitoso y el email del usuario está verificado (
user.isEmailVerified), navega a laBienvenidaActivity, pasando el correo del usuario como extra. - Muestra mensajes de error o informativos al usuario mediante
Toast.
- Infla
- Layout (
layout_login.xml):- Utiliza
ConstraintLayoutcon un fondo verde lima (#32CD32). - Un
ImageView(imageView) en la parte superior, configurado para ser responsivo. - Dos
EditText(TextEmail,TextPassword) para la entrada de credenciales, estilizados con fondo blanco redondeado (@drawable/bg_edittext_rounded_white), texto negro y hints grises. Tienen márgenes para separación. - Un
TextView(textCorreo3) con el texto "¿No tienes cuenta? Regístrate", con un efecto de sombreado para resaltar sobre un fondo claro. - Dos
Button(Btnlogin,Btnregistrar) estilizados con fondo verde oscuro redondeado (@drawable/bg_button_rounded_corners_green) y texto blanco. Están distribuidos horizontalmente usando unaGuideline.
- Utiliza
- Layout Asociado:
layout_bienvenida.xml - Propósito: Pantalla principal después de un inicio de sesión exitoso. Proporciona opciones de navegación a otras funcionalidades de la aplicación.
- Funcionamiento:
- Infla
layout_bienvenida.xml. - Recibe el correo del usuario desde
LoginActivity (a través deintent.getStringExtra("Correo")). - Configura listeners para los botones:
ImageButton(bntFormPetsPrinc): Navega aFormPetsActivity para registrar una nueva mascota.Button(bntFormPets): (Su funcionalidad exacta podría variar, pero por nombre sugiere ir al formulario de mascotas o a la lista).Button(bntFormPets2): Navega aPetsTarActivity para ver la lista de mascotas registradas.
- Infla
- Layout (
layout_bienvenida.xml):- Usa
ConstraintLayoutcon un fondo de imagen (@drawable/Bienvenida). - Un
TextView(textBienvenida) que muestra un mensaje de bienvenida, con texto blanco. - Un
ImageButton(bntFormPetsPrinc) redondo con fondo verde oscuro (@drawable/bg_button_round_green) y una imagen (ej.@drawable/iconpets), probablemente para añadir mascotas. - Dos
Button(bntFormPets,bntFormPets2) estilizados con fondo verde oscuro y esquinas redondeadas (@drawable/bg_button_rounded_corners_green) y texto blanco. Estos botones permiten acceder a diferentes secciones. - Otros
TextViews(textNamePrinc,textNamePrinc2) con texto blanco para describir las acciones de los botones.
- Usa
- Layout Asociado:
layout_formpets.xml - Propósito: Permite al usuario registrar los detalles de una nueva mascota.
- Funcionamiento:
- Infla
layout_formpets.xml. - Inicializa los
EditTextpara nombre, edad, vacunas, dueño y veterinario, y los botones de guardar y atrás. - Guardar Mascota:
- Al pulsar "Guardar" (
btnGuardar), obtiene los datos de losEditTexts. - Realiza una validación básica (ej. el nombre de la mascota es obligatorio).
- Obtiene el ID del usuario actual de Firebase Auth (
FirebaseAuth.getInstance().currentUser?.uid). - Crea un objeto
HashMapcon los datos de la mascota, incluyendo eluserIdy unmascotaIdgenerado por Firestore. - Guarda la mascota en la colección "mascotas" de Firestore usando
db.collection("mascotas").document().set(mascota). - Muestra mensajes de éxito o error y finaliza la actividad si el guardado es exitoso.
- Al pulsar "Guardar" (
- Botón Atrás (
btnAtras): Navega de vuelta aBienvenidaActivity.
- Infla
- Layout (
layout_formpets.xml):- Utiliza
ConstraintLayoutcon una imagen de fondo (@drawable/nuevamascota) que ocupa toda la pantalla. - Un
ImageButton(btnAtras) redondo con fondo verde oscuro (@drawable/bg_button_round_green) e icono de flecha, ubicado en la esquina superior derecha para volver. - Cinco
EditText(editNombre,editEdad,editVacunas,editDueno,editVeterinario) para ingresar los datos de la mascota. Están estilizados con fondo blanco redondeado (@drawable/bg_edittext_rounded_white) y tienen márgenes de16dp. Están encadenados verticalmente y distribuidos. - Un
Button(btnGuardar) estilizado con fondo verde oscuro redondeado (@drawable/bg_button_rounded_corners_green), texto blanco y anchomatch_parentcon márgenes, ubicado en la parte inferior.
- Utiliza
- Layout Asociado:
layout_petstar.xml - Propósito: Actúa como una actividad contenedora para los fragmentos relacionados con la visualización y gestión de mascotas (
PetsFragmentyPetsClinic). - Funcionamiento:
- Infla
layout_petstar.xml. - En su método
onCreate, sisavedInstanceStatees nulo (es decir, la actividad se crea por primera vez), inicia una transacción de fragmentos para cargarPetsFragmentdentro de un contenedor (probablemente unFrameLayoutcon IDR.id.fragment_mascotas).
- Infla
- Layout (
layout_petstar.xml):
- Layout Asociado:
fragment_pets.xml - Propósito: Muestra una lista de todas las mascotas registradas por el usuario.
- Funcionamiento:
- Infla
fragment_pets.xml. - Inicializa un
RecyclerView(recyclerViewMascotas) y suLinearLayoutManager. - Llama a
cargarMascotas():- Obtiene los documentos de la colección "mascotas" de Firestore.
- Para cada documento, lo convierte a un objeto
Pety asigna eldocument.idal campomascotaIddel objeto. - Crea una instancia de
PetsAdaptercon la lista de mascotas obtenida. - Configura un listener de clic para el adaptador: cuando se selecciona una mascota, crea una instancia de
PetsClinic.newInstance(mascota.mascotaId)y la reemplaza en el contenedor de fragmentos (IDR.id.fragment_mascotas), añadiendo la transacción albackStack. - Asigna el adaptador al
RecyclerView.
- Infla
- Layout (
fragment_pets.xml):- Usa un
FrameLayoutcomo raíz con fondo verde lima (#32CD32). - Contiene un
RecyclerView(recyclerViewMascotas) que ocupa todo el espacio, configurado conandroid:clipToPadding="false"para un mejor efecto visual con el padding.
- Usa un
- Layout Asociado:
fragment_pets_clinic.xml - Propósito: Permite ver, editar y eliminar los detalles de una mascota específica.
- Funcionamiento:
- Utiliza un método factoría
newInstance(mascotaId: String)para recibir el ID de la mascota a través de los argumentos del fragmento. - En
onCreateView:- Infla
fragment_pets_clinic.xml. - Obtiene el
mascotaIdde los argumentos. - Inicializa los
EditText(nombre, edad, vacunas, dueño, veterinario) y los botones (guardar, volver, eliminar). - Si
mascotaIdno está vacío, llama acargarMascota().
- Infla
cargarMascota():- Obtiene el documento de la mascota desde Firestore usando
mascotaId. - Si se encuentra, mapea los datos a los
EditTextcorrespondientes.
- Obtiene el documento de la mascota desde Firestore usando
actualizarMascota():- Al pulsar "Guardar" (
btnGuardar), obtiene los datos de losEditTexts. - Realiza validaciones básicas (nombre y edad no vacíos).
- Crea un
HashMapcon los datos actualizados. - Actualiza el documento en Firestore usando
db.collection("mascotas").document(mascotaId).update(updatedMascota). - Muestra un
Toasty navega hacia atrás (parentFragmentManager.popBackStack()).
- Al pulsar "Guardar" (
eliminarMascota():- Al pulsar "Eliminar" (
btnEliminar), elimina el documento de Firestore usandodb.collection("mascotas").document(mascotaId).delete(). - Muestra un
Toasty navega hacia atrás.
- Al pulsar "Eliminar" (
- Botón Volver (
btnVolver): Navega hacia atrás en la pila de fragmentos (parentFragmentManager.popBackStack()).
- Utiliza un método factoría
- Layout (
fragment_pets_clinic.xml):- Usa
ConstraintLayoutcon una imagen de fondo (@drawable/nuevamascota). - Un
ImageButton(btnVolver) redondo con fondo verde oscuro, ubicado en la esquina superior derecha. - Cinco
EditText(editNombre,editEdad,editVacunas,editDueno,editVeterinario) estilizados con fondo blanco redondeado, con márgenes, y encadenados verticalmente. - Dos
Button(btnGuardar,btnEliminar) estilizados con fondo verde oscuro redondeado y texto blanco, distribuidos horizontalmente en la parte inferior mediante unaGuideline.
- Usa
- Layout de Ítem Asociado:
layout_tarjetamascota.xml - Propósito: Adapta una lista de objetos
Petpara ser mostrada en unRecyclerView. - Funcionamiento:
- Recibe una lista de
Pety una lambdaonClicken su constructor. MascotaViewHolder(clase interna):- Mantiene las referencias a los
ImageViewyTextViewsdentro delayout_tarjetamascota.xml(para imagen, nombre, edad, vacunas, dueño, veterinario).
- Mantiene las referencias a los
onCreateViewHolder(): Inflalayout_tarjetamascota.xmlpara crear la vista de cada ítem.onBindViewHolder():- Obtiene el objeto
Petpara la posición actual. - Asigna los datos de la mascota (nombre, edad, vacunas, etc.) a los
TextViewsdelholder. - Utiliza la librería
Glidepara cargar la imagen de la mascota (mascota.fotoUrl) en elImageView. SifotoUrlestá vacía o hay un error, muestra una imagen por defecto (R.drawable.mascota_default1). - Configura un
OnClickListeneren elitemViewdelholderque ejecuta la lambdaonClickpasada al constructor, proveyendo el objetoPetseleccionado.
- Obtiene el objeto
getItemCount(): Devuelve el tamaño de lalistaMascotas.
- Recibe una lista de
- Layout (
layout_tarjetamascota.xml):- Utiliza un
CardViewcomo elemento raíz, con un color de fondo verde oscuro (#228B22) y esquinas redondeadas. - Dentro del
CardView, unConstraintLayoutorganiza los elementos. - Un
ImageView(imgMascota) para mostrar la foto de la mascota. - Varios
TextView(txtNombre,txtEdad,txtVacunas,txtDueno,txtVeterinario) para mostrar los detalles de la mascota, con texto de color blanco para mejorar la legibilidad sobre el fondo oscuro. Se han ajustado paddings y tamaños de fuente para una mejor presentación.
- Utiliza un
- Propósito: Clase de datos (presumiblemente un
data classen Kotlin) que representa la estructura de una mascota. - Campos esperados (basado en el uso en adaptadores y fragmentos):
mascotaId: String(ID del documento en Firestore)nombreMascota: StringedadMascota: Int(oStringsi no se convierte estrictamente)vacunas: StringnombreDueno: StringnombreVeterinario: StringfotoUrl: String(URL de la imagen de la mascota)userId: String(ID del usuario dueño de la mascota)
bg_button_round_green.xml: Define un fondo de forma ovalada (círculo si ancho y alto son iguales) con color verde oscuro (#228B22). Usado paraImageButtonredondos.bg_button_rounded_corners_green.xml: Define un fondo rectangular con esquinas redondeadas y color verde oscuro (#228B22). Usado para botones estándar.bg_edittext_rounded_white.xml: Define un fondo rectangular con esquinas redondeadas y color blanco. Usado para los camposEditText.- Imágenes de fondo:
@drawable/Bienvenida: Usada enlayout_bienvenida.xml.@drawable/nuevamascota: Usada enlayout_formpets.xmlyfragment_pets_clinic.xml.@drawable/login: Usada enlayout_splash.xml.
- Iconos:
@drawable/iconpets(o similar): Usado enImageButtonenlayout_bienvenida.xml.- Icono de flecha para el botón de "atrás".
- Imágenes por defecto:
@drawable/mascota_default1: Usada enPetsAdaptercuando no hayfotoUrlo hay un error de carga.
- Firebase Authentication:
- Utilizada en
Login.ktpara el registro de nuevos usuarios (createUserWithEmailAndPassword) y el inicio de sesión de usuarios existentes (signInWithEmailAndPassword). - Se gestiona la verificación por correo electrónico.
- Utilizada en
- Firebase Firestore:
- Utilizada como base de datos NoSQL para almacenar la información de las mascotas.
- Colección
mascotas: Todos los datos de las mascotas se guardan en documentos dentro de esta colección. FormPets.kt: Crea nuevos documentos en la colecciónmascotasal registrar una nueva mascota.PetsFragment.kt: Lee todos los documentos de la colecciónmascotaspara mostrarlos en una lista.PetsClinic.kt:- Lee un documento específico de la colección
mascotasusando sumascotaId. - Actualiza un documento existente usando
update(). - Elimina un documento existente usando
delete().
- Lee un documento específico de la colección

