Showcase de la Aplicación
3. Introducción
3.1. Propósito del documento
Este documento de documentación funcional ha sido desarrollado como parte de nuestro proyecto de fin de asignatura de programación móvil, con el objetivo de proporcionar una visión clara y detallada de todos los aspectos funcionales de nuestra aplicación PawTracker. Como estudiantes de programación, hemos querido plasmar aquí todo el proceso de análisis, diseño e implementación que hemos seguido para crear esta solución de seguimiento de mascotas.
La finalidad principal de este documento es servir como guía tanto para nosotros durante el desarrollo como para futuros desarrolladores que puedan continuar o mantener el proyecto. También servirá para que los evaluadores puedan entender el alcance y la complejidad de nuestra aplicación, así como las decisiones técnicas que hemos tomado durante su implementación.
Esta documentación funcional incluye todos los aspectos necesarios para comprender completamente la aplicación: desde los requisitos funcionales que definen lo que la aplicación debe hacer, hasta los diagramas de arquitectura que muestran cómo están organizados sus componentes, pasando por detalles de la interfaz de usuario, gestión de datos y plan de pruebas.
3.2. Alcance del proyecto
PawTracker es una aplicación móvil nativa para Android desarrollada desde cero por nuestro equipo, que permite a los dueños de mascotas realizar un seguimiento en tiempo real de la ubicación de sus perros. El alcance del proyecto abarca:
- Monitorización GPS en tiempo real: La aplicación permite visualizar la posición exacta de cada mascota en un mapa interactivo, actualizando la información constantemente para proporcionar datos precisos.
- Sistema de zonas seguras (geofencing): Los usuarios pueden definir áreas geográficas consideradas seguras para sus mascotas. La aplicación detecta automáticamente cuando la mascota sale de estas zonas y envía notificaciones de alerta.
- Gestión de múltiples mascotas: La aplicación permite registrar y gestionar varias mascotas desde una misma cuenta, cada una con su propio perfil personalizado.
- Sistema de autenticación: Implementación completa de un sistema de registro e inicio de sesión seguro utilizando Firebase Authentication.
- Base de datos en tiempo real: Uso de Firebase Realtime Database para sincronizar y almacenar la información de usuarios, mascotas y ubicaciones, garantizando que los datos estén siempre actualizados.
- Interfaz moderna e intuitiva: Diseño de una interfaz de usuario siguiendo los principios de Material Design 3, con soporte para temas claros y oscuros, y adaptabilidad a diferentes tamaños de pantalla.
- Notificaciones push: Sistema de alertas que informa a los usuarios cuando sus mascotas salen de las zonas seguras establecidas.
Fuera del alcance de esta versión inicial quedan funcionalidades como la integración con dispositivos GPS específicos para mascotas, la versión para iOS, y funcionalidades sociales como compartir la ubicación con otros usuarios o generar informes estadísticos de actividad. Estas características podrían considerarse para futuras versiones si el proyecto continúa su desarrollo.
3.3. Información importante para pruebas
INFORMACIÓN IMPORTANTE PARA PRUEBAS
Cuenta Principal de Prueba
Esta cuenta está preparada con diferentes perros ya insertados y configurada para probar todas las funcionalidades de la aplicación:
Usuario: sadaborras63@gmail.com
Contraseña: perros123
Cuenta para Simulación de Perro
Esta cuenta permite simular y controlar la ubicación del perro Ron, que pertenece al usuario Juan Borrás:
Usuario: perro1@gmail.com
Contraseña: perro111
4. Descripción General
4.1. Visión general de la aplicación
PawTracker es una aplicación móvil que hemos desarrollado como parte de nuestro proyecto académico, pensada para resolver un problema común entre los dueños de mascotas: cómo mantener localizados a sus perros en todo momento. La aplicación ofrece un sistema de seguimiento GPS en tiempo real, permitiendo visualizar la ubicación exacta de las mascotas en un mapa interactivo.
En nuestro desarrollo, nos hemos centrado en crear una herramienta que sea realmente útil y práctica. El usuario puede definir "zonas seguras" (como el hogar o el parque habitual) y recibir una notificación inmediata si su mascota sale de estos perímetros. Esto es especialmente útil para perros escapistas o para momentos en que la mascota está bajo el cuidado de otras personas.
Hemos implementado la aplicación utilizando una arquitectura MVVM (Model-View-ViewModel) para separar claramente la lógica de negocio de la interfaz de usuario. Para el backend, utilizamos Firebase, lo que nos permitió incorporar fácilmente autenticación de usuarios, almacenamiento en la nube y notificaciones push. Para la parte de geolocalización, integramos Google Maps y los servicios de ubicación de Google Play, aprovechando su precisión y eficiencia energética.
La interfaz de usuario ha sido diseñada siguiendo los principios de Material Design 3, lo que proporciona una experiencia moderna, intuitiva y agradable visualmente, con soporte tanto para tema claro como oscuro.
4.2. Objetivos principales
Durante el desarrollo de PawTracker, nos planteamos los siguientes objetivos clave:
- Crear un sistema de seguimiento en tiempo real: Implementar una solución que muestre con precisión la ubicación de las mascotas y actualice esta información de forma continua con un equilibrio óptimo entre exactitud y consumo de batería.
- Desarrollar un sistema de alertas eficiente: Diseñar un mecanismo de geofencing (zonas seguras) que detecte de manera fiable cuando una mascota abandona un área predefinida y envíe notificaciones inmediatas al propietario.
- Facilitar la gestión de múltiples mascotas: Permitir que los usuarios puedan registrar varios perros en la aplicación y cambiar fácilmente entre ellos para ver su ubicación y configurar sus zonas seguras individualmente.
- Implementar una experiencia de usuario fluida: Diseñar una interfaz intuitiva y agradable que permita a usuarios con diferentes niveles de conocimiento tecnológico utilizar todas las funcionalidades sin dificultad.
- Garantizar el funcionamiento en segundo plano: Asegurar que los servicios de seguimiento y notificaciones sigan funcionando incluso cuando la aplicación no está abierta o tras el reinicio del dispositivo.
- Optimizar el consumo de recursos: Minimizar el impacto en la batería y los datos móviles del dispositivo, implementando estrategias de actualización adaptativas según el contexto de uso.
4.3. Público objetivo
Al diseñar PawTracker, hemos pensado en diferentes perfiles de usuario que podrían beneficiarse de nuestra aplicación:
- Dueños preocupados por sus mascotas: Personas que quieren tener la tranquilidad de saber dónde está su perro en todo momento, especialmente con mascotas que tienen tendencia a escaparse o perderse.
- Familias con jardines amplios o fincas: Usuarios que tienen espacios grandes donde sus perros pueden moverse libremente, pero quieren asegurarse de que no se alejen demasiado.
- Propietarios de múltiples perros: Personas que tienen varios perros y necesitan una herramienta centralizada para gestionar y monitorizar a todos ellos de forma sencilla.
- Personas activas: Usuarios que salen a correr o hacer senderismo con sus perros y quieren poder soltarlos sin perderlos de vista.
- Cuidadores de perros: Profesionales o personas que cuidan temporalmente de las mascotas de otros y quieren ofrecer un extra de seguridad.
La aplicación ha sido diseñada para ser accesible a usuarios con diferentes niveles de habilidad tecnológica, priorizando una interfaz clara e intuitiva que no requiera conocimientos técnicos avanzados para su uso cotidiano.
5. Requisitos Funcionales
A continuación se detallan los requisitos funcionales que se han implementado en la aplicación PawTracker, basados en las clases y funcionalidades reales del código:
Autenticación y Gestión de Usuarios
- RF-1: Registro de usuarios
La aplicación permite a los nuevos usuarios crear una cuenta mediante:
- Formulario de registro con email y contraseña (RegisterActivity)
- Validación de formato de email y seguridad de contraseña
- Aceptación de términos y condiciones
- Almacenamiento de credenciales en Firebase Authentication
- Creación de perfil básico en la base de datos
- RF-2: Inicio de sesión multimodal
Ofrece múltiples métodos de autenticación implementados en MainActivity y SplashLoginActivity:
- Email y contraseña con validación en Firebase
- Inicio de sesión con Google mediante OAuth
- Opción "Recordarme" para almacenar credenciales
- Detección de sesiones activas y timeout automático (5 minutos)
- RF-3: Gestión de perfil de usuario
Implementado en PerfilUsuario y EditarUsuario, permite:
- Visualización de información personal (nombre, apellidos, email)
- Edición de datos del perfil incluyendo imagen de usuario
- Almacenamiento y visualización de la fecha de nacimiento
- Cálculo automático de edad basada en la fecha de nacimiento
- Procesamiento y optimización de imágenes de perfil
- RF-4: Cierre de sesión seguro
La aplicación implementa un sistema seguro para finalizar sesiones que:
- Elimina credenciales temporales y tokens de autenticación
- Limpia la caché de datos sensibles (DatosPrecargados)
- Redirige al usuario a la pantalla de inicio de sesión
- Detiene los servicios de monitorización activos
Gestión de Perros
- RF-5: Registro y administración de perros
Mediante las clases PerfilPerro y EditarPerro, el sistema permite:
- Crear perfiles para múltiples perros asociados a un usuario
- Configurar datos específicos: nombre, raza, peso
- Registrar fechas importantes (nacimiento, adopción)
- Cálculo automático de la edad del perro
- Subir y procesar imágenes del perro (recorte, optimización)
- RF-6: Relación entre usuarios y perros
Implementado en la estructura de base de datos y en DogsClusterManager:
- Asociación de perros a usuarios mediante campo "dueñoId"
- Verificación de propiedad para operaciones sensibles
- Sistema bidireccional de referencia (usuario → perros, perro → usuario)
- Estructura de datos optimizada para consultas frecuentes
- RF-7: Selector visual de perros
Mediante DogSpinnerAdapter, la aplicación ofrece:
- Spinner personalizado con imágenes y nombres de los perros
- Cambio rápido entre perros en la pantalla principal
- Visualización de imagen de perfil en formato circular
- Actualización automática al añadir o modificar perros
Sistema de Geolocalización
- RF-9: Seguimiento en tiempo real
La aplicación debe permitir el seguimiento en tiempo real de la ubicación de las mascotas, actualizando la información de ubicación constantemente.
- RF-10: Visualización en mapa interactivo
La aplicación debe permitir visualizar la ubicación de las mascotas en un mapa interactivo de Google Maps.
- RF-11: Marcadores personalizados
La aplicación debe permitir marcar las ubicaciones de las mascotas en el mapa con imágenes personalizadas.
- RF-12: Sistema de clustering
La aplicación debe implementar un sistema de clustering para gestionar eficientemente múltiples marcadores en el mapa.
Sistema de Zonas Seguras
- RF-13: Creación de zonas seguras
La aplicación debe permitir a los usuarios definir zonas seguras para sus mascotas, incluyendo la configuración de perímetros y radios.
- RF-14: Visualización gráfica de zonas
La aplicación debe permitir visualizar gráficamente las zonas seguras definidas en el mapa.
- RF-15: Sistema de geofencing
La aplicación debe implementar un sistema de geofencing para detectar automáticamente cuando una mascota abandona una zona segura.
Sistema de Notificaciones
- RF-16: Alertas de zona segura
La aplicación debe enviar notificaciones inmediatas cuando una mascota abandona una zona segura.
- RF-17: Recordatorios periódicos
La aplicación debe enviar recordatorios periódicos cuando una mascota permanece fuera de una zona segura.
- RF-18: Notificaciones personalizadas
La aplicación debe enviar notificaciones personalizadas para cada mascota registrada.
Gestión de Datos
- RF-19: Sincronización en tiempo real
La aplicación debe sincronizar datos en tiempo real entre el dispositivo y la nube.
- RF-20: Persistencia offline
La aplicación debe mantener datos disponibles cuando no hay conexión a internet.
- RF-21: Gestión de imágenes
La aplicación debe gestionar imágenes de mascotas, incluyendo su procesamiento y almacenamiento.
6. Requisitos No Funcionales
Además de las funcionalidades específicas, nuestra aplicación PawTracker debe cumplir con una serie de requisitos no funcionales que aseguren su calidad, rendimiento y usabilidad. Estos requisitos definen cómo debe comportarse el sistema y establecen las bases para una experiencia de usuario satisfactoria.
6.1. Rendimiento
El rendimiento es crucial en una aplicación de seguimiento en tiempo real. Hemos establecido los siguientes requisitos para garantizar una experiencia fluida:
- RNF-1: Tiempo de respuesta
La aplicación debe responder a las interacciones del usuario de manera ágil:
- El tiempo de inicio de sesión no debe superar los 2 segundos en condiciones normales de red.
- La carga inicial del mapa debe completarse en menos de 3 segundos.
- El cambio entre perfiles de mascotas debe ser prácticamente instantáneo (menos de 500ms).
- La actualización de la ubicación en el mapa debe producirse cada 5-10 segundos, dependiendo del modo de uso.
- RNF-2: Uso de recursos
La aplicación debe hacer un uso eficiente de los recursos del dispositivo:
- El consumo de batería no debe superar el 5% por hora cuando la aplicación funciona en segundo plano.
- El consumo de datos móviles debe ser inferior a 10MB por hora de uso activo.
- El espacio de almacenamiento requerido para la instalación debe ser inferior a 50MB (excluyendo datos de usuario).
- La memoria RAM utilizada no debe superar los 100MB en uso normal.
- RNF-3: Escalabilidad
La aplicación debe ser capaz de manejar el crecimiento sin degradación del rendimiento:
- Soporte para hasta 10 mascotas por cuenta de usuario sin pérdida de rendimiento.
- Capacidad de gestionar múltiples zonas seguras por mascota (hasta 5).
- Almacenamiento de historial de ubicaciones durante al menos 7 días.
6.2. Usabilidad
La facilidad de uso es fundamental para que nuestra aplicación sea accesible para usuarios de diferentes niveles de experiencia tecnológica:
- RNF-4: Facilidad de aprendizaje
Los usuarios nuevos deben poder aprender a usar las funciones principales de la aplicación sin necesidad de tutoriales extensos:
- Un usuario nuevo debe ser capaz de completar el registro e iniciar el seguimiento de una mascota en menos de 5 minutos.
- Todas las funcionalidades principales deben ser accesibles con máximo 3 toques desde la pantalla principal.
- Los elementos de la interfaz deben ser autoexplicativos, con iconos universalmente reconocibles.
- RNF-5: Coherencia y estándares
La aplicación debe seguir patrones de diseño coherentes y familiares para los usuarios de Android:
- Adherencia a las guías de Material Design 3.
- Comportamiento consistente de los elementos de navegación en toda la aplicación.
- Terminología uniforme en toda la interfaz.
- RNF-6: Prevención de errores
La aplicación debe minimizar la posibilidad de errores del usuario:
- Validación en tiempo real de los campos de formulario.
- Mensajes de confirmación para acciones irreversibles (eliminar mascota, cerrar sesión, etc.).
- Feedback visual claro para todas las acciones realizadas.
6.3. Accesibilidad
Hemos diseñado la aplicación considerando usuarios con diferentes capacidades y preferencias:
- RNF-7: Adaptabilidad visual
La aplicación debe ser visualmente adaptable a diferentes necesidades:
- Soporte completo para modo oscuro/claro, sincronizado con las preferencias del sistema.
- Contraste suficiente entre texto y fondo (ratio mínimo de 4.5:1 para texto normal).
- Tamaño de fuente ajustable según la configuración del sistema.
- RNF-8: Compatibilidad con herramientas de accesibilidad
La aplicación debe funcionar correctamente con las herramientas de accesibilidad de Android:
- Compatibilidad con TalkBack para usuarios con discapacidad visual.
- Descripción textual para todos los elementos visuales importantes.
- Navegación posible usando solo teclado o dispositivos de entrada alternativos.
6.4. Seguridad
La seguridad es esencial, especialmente al tratarse de datos de ubicación y información personal:
- RNF-9: Autenticación y autorización
El sistema debe garantizar que solo usuarios autorizados puedan acceder a la información:
- Uso de Firebase Authentication con estándares actuales de seguridad.
- Sesiones que expiran automáticamente tras 30 días de inactividad.
- Bloqueo temporal tras 5 intentos fallidos de inicio de sesión.
- RNF-10: Protección de datos
Los datos sensibles deben estar protegidos tanto en tránsito como en reposo:
- Todas las comunicaciones con servidores deben usar HTTPS.
- Datos sensibles almacenados localmente deben estar cifrados.
- Las contraseñas nunca se almacenan en texto plano, solo hashes seguros.
- Las claves API y credenciales no se incluyen directamente en el código fuente.
- RNF-11: Privacidad
La aplicación debe respetar la privacidad de los usuarios:
- Clara política de privacidad accesible desde la aplicación.
- Recopilación solo de datos necesarios para el funcionamiento.
- Opción para que los usuarios eliminen completamente su cuenta y todos los datos asociados.
- Separación y aislamiento de datos entre diferentes usuarios.
7. Arquitectura de la Aplicación
7.1. Estructura general
La arquitectura de PawTracker sigue un enfoque pragmático basado en Activities y Services con interacción directa a Firebase, priorizando la funcionalidad sobre patrones arquitectónicos complejos.
Componentes principales
La aplicación está organizada en los siguientes componentes interconectados:
- Activities: Constituyen el núcleo de la interfaz de usuario y manejan la lógica de negocio:
MapsActivity: Pantalla principal que integra el mapa, gestión de perros y zonas segurasSplashLoginActivity: Maneja la autenticación y precarga de datosPerfilPerroyPerfilUsuario: Visualización y acceso a edición de perfilesEditarPerroyEditarUsuario: Edición de datos con persistencia en FirebaseAjustesActivity: Configuración de la aplicación y preferencias de usuario
- Services y BroadcastReceivers: Gestionan la funcionalidad en segundo plano:
GeofencingService: Servicio en primer plano para monitoreo continuo de ubicacionesGeofenceBroadcastReciver: Maneja las notificaciones y eventos de geolocalizaciónBootCompletedReceiver: Restaura servicios tras el reinicio del dispositivo
- Clases de utilidad especializada:
DogLocationManager: Centraliza la lógica de geolocalización y zonas segurasDogsClusterManager: Optimiza la visualización de múltiples marcadores en el mapaDatosPrecargados: Singleton que implementa un sistema de caché centralizadaLoadingSpinner: Componente visual para indicadores de carga dinámicos
Gestión de datos
La aplicación implementa una estrategia de datos en dos niveles:
- Persistencia remota: Firebase Realtime Database almacena todos los datos de usuarios, perros, ubicaciones y estados de geofencing, permitiendo sincronización en tiempo real entre dispositivos.
- Caché local:
DatosPrecargadosmantiene una copia en memoria de los datos más utilizados, reduciendo consultas a Firebase y permitiendo un funcionamiento más fluido.
Patrones de diseño aplicados
El proyecto utiliza varios patrones de diseño efectivos:
- Singleton: En
DatosPrecargadospara gestión centralizada de datos en caché - Observer: Mediante ValueEventListener de Firebase para actualizaciones reactivas
- Adapter: En implementaciones como
DogSpinnerAdapterpara visualización personalizada - Foreground Service: Para garantizar la monitorización continua de ubicaciones
- Broadcast Receiver: Para captura de eventos del sistema como reinicio del dispositivo
Esta estructura arquitectónica directa facilita el flujo de datos en tiempo real necesario para la funcionalidad principal de monitoreo GPS, a la vez que mantiene un rendimiento óptimo en dispositivos móviles.
7.2. Diagrama de componentes
A continuación detallamos los componentes específicos y cómo interactúan entre sí:
Componentes de UI (Activities)
- SplashLoginActivity: Punto de entrada a la aplicación, maneja la autenticación inicial y precarga de datos.
- MapsActivity: Actividad principal que muestra el mapa interactivo y permite visualizar y seguir la ubicación de las mascotas.
- PerfilPerro: Actividad para mostrar y acceder a la edición de información de mascotas.
- PerfilUsuario: Actividad para mostrar y acceder a la edición del perfil de usuario.
- EditarPerro: Actividad para la edición completa de datos de perros.
- EditarUsuario: Actividad para la edición del perfil del usuario.
- AjustesActivity: Actividad para configurar preferencias y ver información del desarrollador.
Servicios y Receptores
- GeofencingService: Servicio en primer plano que monitoriza continuamente si las mascotas entran o salen de las zonas seguras definidas.
- GeofenceBroadcastReciver: Recibe y procesa eventos de geofencing, enviando notificaciones cuando un perro sale de su zona segura.
- BootCompletedReceiver: Receptor de broadcast que reinicia los servicios necesarios cuando el dispositivo se enciende.
Gestores y utilidades
- DogLocationManager: Clase central que gestiona todas las operaciones relacionadas con la ubicación de las mascotas, incluyendo la configuración del cliente de ubicación y la gestión de zonas seguras.
- DogsClusterManager: Optimiza la visualización de múltiples perros en el mapa mediante agrupación de marcadores.
- DatosPrecargados: Implementa un sistema de caché centralizado para minimizar consultas a Firebase.
- LoadingSpinner: Componente visual reutilizable para mostrar indicadores de carga.
Flujo de interacción para crear una zona segura
Como ejemplo concreto de esta arquitectura, cuando un usuario define una zona segura, el flujo es el siguiente:
- El usuario selecciona un perro en el spinner de
MapsActivityy pulsa el botón de edición de zona. - La actividad llama al método
activarModoEdicionZonaSegura(), que a su vez invocalocationManager.activarModoEdicionZona(perroSeleccionadoId!!). - Cuando el usuario toca el mapa, se llama a
locationManager.definirZonaSegura(latLng)que dibuja un círculo en esa posición. - Al pulsar guardar, se invoca
locationManager.guardarZonaSegura(perroSeleccionadoId!!), que almacena las coordenadas y el radio en Firebase. - El servicio
GeofencingServicecomienza a monitorizar esta zona y enviará notificaciones cuando el perro salga de ella.
Esta arquitectura ha demostrado ser efectiva para nuestra aplicación, proporcionando un equilibrio adecuado entre simplicidad de implementación y rendimiento en situaciones de uso real.
8. Casos de Uso
8.1. Descripción de los casos principales
A continuación se presentan los casos de uso principales de PawTracker, implementados realmente en el código de la aplicación y verificados contra las clases proporcionadas.
8.1.1. Casos de uso de autenticación
CU-01: Registro de nuevos usuarios
Actor principal: Usuario no registrado
Precondiciones: El usuario tiene la aplicación instalada y acceso a internet
Flujo básico:
- El usuario inicia la aplicación y selecciona "Registrarse"
- El sistema muestra el formulario de registro con campos para email, contraseña y confirmación
- El usuario completa los campos requeridos
- El sistema valida los datos en tiempo real, verificando:
- Formato de email válido con Patterns.EMAIL_ADDRESS
- Contraseña segura con al menos una mayúscula, una minúscula y un número
- Coincidencia entre contraseña y confirmación
- Aceptación de términos y condiciones
- El usuario envía el formulario
- El sistema crea la cuenta usando FirebaseAuth.createUserWithEmailAndPassword
- El sistema almacena datos básicos en Firebase Database (email, createdAt)
- El sistema muestra un mensaje de éxito y redirige a MainActivity
Flujos alternativos:
- Email ya registrado: Se muestra un diálogo de error específico
- Validación fallida: Se muestra el error junto al campo correspondiente utilizando un MaterialAlertDialog
- Error de red: Se muestra mensaje de error de conexión
Implementación: Este caso de uso está implementado en la clase RegisterActivity utilizando Firebase Authentication.
CU-02: Inicio de sesión
Actor principal: Usuario registrado
Precondiciones: El usuario tiene una cuenta válida en el sistema
Flujo básico:
- El usuario inicia la aplicación y visualiza la pantalla de login (MainActivity)
- El usuario introduce su email y contraseña
- El usuario puede marcar la opción "Recordarme" para mantener sus credenciales
- El usuario pulsa el botón de inicio de sesión
- El sistema inicia SplashLoginActivity que:
- Muestra una pantalla de carga con logo pulsante y barra de progreso
- Autentica al usuario mediante FirebaseAuth.signInWithEmailAndPassword
- Almacena el tiempo de login en SharedPreferences para control de sesión
- Precarga datos iniciales usando DatosPrecargados
- Tras la autenticación exitosa, el sistema redirige a MapsActivity
Flujos alternativos:
- Inicio de sesión con Google: El usuario puede elegir iniciar sesión con su cuenta de Google
- Credenciales incorrectas: SplashLoginActivity retorna a MainActivity con mensaje de error
- Sesión activa: Si existe una sesión no expirada (menos de 5 minutos desde último login), se omite la autenticación y se carga directamente MapsActivity
Implementación: Este caso de uso está implementado en las clases MainActivity y SplashLoginActivity.
8.1.2. Casos de uso de gestión de mascotas
CU-03: Visualización de perfil de perro
Actor principal: Usuario autenticado
Precondiciones: Usuario con sesión activa y al menos un perro registrado
Flujo básico:
- El usuario selecciona un perro en MapsActivity y pulsa el botón de perfil
- El sistema abre PerfilPerro pasando el ID del perro seleccionado
- El sistema carga los datos del perro desde Firebase:
- Información básica: nombre, raza, peso
- Imagen de perfil codificada en Base64
- Fechas de nacimiento y adopción
- Edad calculada automáticamente
- Datos del dueño
- El sistema muestra la información junto con opciones de edición
Flujos alternativos:
- Error al cargar datos: Se muestra toast de error
- Imagen no disponible: Se muestra imagen por defecto
Implementación: Este caso de uso está implementado en la clase PerfilPerro.
CU-04: Edición de perfil de perro
Actor principal: Usuario autenticado
Precondiciones: Usuario visualizando perfil de un perro (CU-03)
Flujo básico:
- El usuario pulsa el botón "Editar" en PerfilPerro
- El sistema inicia EditarPerro con transición animada (slide_up)
- EditarPerro carga los datos actuales del perro desde Firebase
- El usuario puede modificar:
- Nombre y raza del perro
- Peso (valor numérico)
- Fechas de nacimiento y adopción mediante selectores personalizados
- Imagen de perfil (cámara o galería con recorte mediante UCrop)
- Dueño asignado mediante spinner
- El usuario confirma los cambios con el botón "Guardar"
- El sistema valida que los campos obligatorios estén completos
- El sistema guarda los cambios en Firebase mediante updateChildren
- El sistema muestra mensaje de confirmación y vuelve a PerfilPerro con animación
Flujos alternativos:
- Campos vacíos: Se muestra mensaje indicando que hay campos obligatorios sin completar
- Formato incorrecto: Se verifica que el peso sea un número válido
- Error al guardar imagen: Se muestra mensaje específico de error
- Cancelar edición: El usuario puede volver sin guardar mediante botón "Atrás"
Implementación: Este caso de uso está implementado en la clase EditarPerro.
8.1.3. Casos de uso de geolocalización
CU-05: Visualización de ubicación de perros
Actor principal: Usuario autenticado
Precondiciones: Usuario con sesión activa y permisos de ubicación concedidos
Flujo básico:
- El usuario accede a MapsActivity (pantalla principal)
- El sistema:
- Inicializa Google Maps con mapsFragment.getMapAsync
- Crea DogsClusterManager para gestionar marcadores
- Configura DogLocationManager para seguimiento de ubicaciones
- Carga la lista de perros desde DatosPrecargados o Firebase
- Muestra los perros en el selector (spinner) con DogSpinnerAdapter
- El usuario selecciona un perro del spinner
- El sistema:
- Llama a locationManager.mostrarUbicacionPerro(perroId)
- Muestra un marcador personalizado con la imagen del perro en su ubicación
- Visualiza su zona segura si está definida
- Actualiza periódicamente la posición mediante Firebase listener
- El usuario puede hacer zoom, moverse por el mapa y cambiar entre perros
Implementación: Este caso de uso está implementado en MapsActivity junto con DogLocationManager y DogsClusterManager.
CU-06: Creación y edición de zona segura
Actor principal: Usuario autenticado
Precondiciones: Usuario con sesión activa y un perro seleccionado en el mapa
Flujo básico:
- El usuario selecciona un perro en el spinner de MapsActivity
- El usuario pulsa el botón de edición de zona segura
- El sistema:
- Invoca activarModoEdicionZonaSegura() en MapsActivity
- Llama a locationManager.activarModoEdicionZona(perroId)
- Muestra banner "EDITANDO ZONA SEGURA" y botones de guardar/cancelar
- Si existe una zona previa, centra el mapa en esa ubicación
- El usuario toca un punto en el mapa para definir el centro de la zona
- El sistema dibuja un círculo verde con radio fijo de 100 metros
- El usuario pulsa el botón de guardar (FloatingActionButton verde)
- El sistema:
- Ejecuta locationManager.guardarZonaSegura(perroId)
- Almacena las coordenadas y radio en Firebase
- Actualiza la caché en DatosPrecargados
- Muestra mensaje de confirmación
- Desactiva el modo de edición
Flujos alternativos:
- Cancelar edición: El usuario pulsa botón cancelar y se restaura la zona original
- Error al guardar: Se muestra mensaje de error si hay problemas de conectividad
- No definir zona: Si el usuario intenta guardar sin tocar el mapa, se muestra mensaje "Definir zona segura"
Implementación: Este caso de uso está implementado en MapsActivity y DogLocationManager.
8.1.4. Casos de uso de monitoreo y notificaciones
CU-07: Notificación de salida de zona segura
Actor principal: Sistema (GeofencingService)
Actores secundarios: Usuario con perros monitorizados
Precondiciones:
- Servicio GeofencingService iniciado para un perro específico
- Zona segura definida para el perro
- Notificaciones habilitadas en ajustes
Flujo básico:
- GeofencingService monitoriza periódicamente la posición del perro (cada 30 segundos)
- El sistema detecta que el perro ha salido de su zona segura mediante:
- Cálculo de distancia entre posición actual y centro de zona segura
- Comparación con el radio de la zona (100 metros)
- El sistema en DogLocationManager:
- Actualiza el color de la zona segura a rojo
- Actualiza el estado en Firebase a "OUT" en geofencing_status/{perroId}
- Activa el GeofenceBroadcastReciver para gestionar notificaciones
- GeofenceBroadcastReciver:
- Crea canal de notificación con prioridad alta
- Envía notificación push inmediata
- Programa notificaciones periódicas cada 30 segundos mientras el perro siga fuera
- Cuando el perro regresa a la zona segura, el sistema:
- Actualiza el color de la zona a verde
- Cambia el estado en Firebase a "IN"
- Cancela las notificaciones periódicas
Implementación: Este caso de uso está implementado por las clases GeofencingService, DogLocationManager y GeofenceBroadcastReciver.
CU-08: Configuración de notificaciones
Actor principal: Usuario autenticado
Precondiciones: Usuario con sesión activa
Flujo básico:
- El usuario accede a AjustesActivity desde el botón de configuración en MapsActivity
- El sistema muestra opciones de ajustes incluyendo un switch para activar/desactivar notificaciones
- El usuario activa el switch de notificaciones
- El sistema:
- En Android 13+, solicita el permiso POST_NOTIFICATIONS si es necesario
- Guarda la preferencia en SharedPreferences ("notifications_enabled", true)
- Crea canales de notificación necesarios
- El sistema confirma la activación y las notificaciones quedan habilitadas
Flujos alternativos:
- Desactivación de notificaciones: El usuario desactiva el switch y el sistema guarda la preferencia (false)
- Permiso denegado: Si el usuario rechaza el permiso en Android 13+, las notificaciones no podrán mostrarse aunque estén activadas en la app
- Reinicio del dispositivo: BootCompletedReceiver restaura el estado de notificaciones tras el reinicio
Implementación: Este caso de uso está implementado en la clase AjustesActivity, con apoyo de BootCompletedReceiver para persistencia tras reinicios.
CU-A04: Cambiar contraseña de usuario
Actores: Usuario autenticado
Precondiciones:
- El usuario debe estar autenticado en la aplicación
- El usuario debe conocer su contraseña actual
Flujo básico:
- El usuario accede a la opción de cambio de contraseña desde el menú de ajustes
- El sistema muestra un formulario con:
- Email del usuario (no editable)
- Campo para la contraseña actual
- Campo para la nueva contraseña
- Campo para confirmar la nueva contraseña
- El usuario introduce su contraseña actual
- El usuario introduce y confirma su nueva contraseña
- El sistema valida los datos introducidos
- El sistema actualiza la contraseña en Firebase Authentication
- El sistema muestra un mensaje de éxito y retorna a la pantalla anterior
Flujos alternativos:
- Contraseña actual incorrecta:
- El sistema muestra un mensaje de error indicando que la contraseña actual es incorrecta
- El usuario debe volver a introducir la contraseña actual correcta
- Las nuevas contraseñas no coinciden:
- El sistema muestra un mensaje de error indicando que las contraseñas no coinciden
- El usuario debe volver a introducir y confirmar la nueva contraseña
- La nueva contraseña no cumple los requisitos mínimos:
- El sistema muestra un mensaje indicando que la contraseña debe tener al menos 6 caracteres
- El usuario debe introducir una contraseña que cumpla los requisitos
Postcondiciones:
- La contraseña del usuario ha sido actualizada en Firebase Authentication
- El usuario puede iniciar sesión con su nueva contraseña
Implementación:
- Clase principal:
ChangePasswordActivity.kt - Layout:
activity_change_password.xml - Servicios utilizados: Firebase Authentication
8.2. Diagramas de casos de uso
Los siguientes diagramas representan visualmente los casos de uso descritos anteriormente y sus relaciones con los actores del sistema.
8.2.1. Diagrama general de casos de uso
Figura 8.1: Diagrama de casos de uso del sistema PawTracker
Este diagrama muestra la relación entre los diferentes actores del sistema (usuarios registrados, no registrados y procesos automáticos) y los casos de uso que pueden ejecutar.
8.2.2. Matriz de trazabilidad: Clases implementadoras vs. Casos de uso
La siguiente matriz muestra la relación entre los casos de uso y las clases que implementan su funcionalidad:
| Caso de Uso | Register Activity | Main / Splash | Perfil Perro | Editar Perro | Maps Activity | Dog Location Manager | Geofencing Service | Geofence Broadcast | Ajustes Activity | Boot Completed |
|---|---|---|---|---|---|---|---|---|---|---|
| CU-01: Registro | ✓ | |||||||||
| CU-02: Inicio de sesión | ✓ | |||||||||
| CU-03: Perfil de perro | ✓ | |||||||||
| CU-04: Edición de perro | ✓ | |||||||||
| CU-05: Ubicación en mapa | ✓ | ✓ | ||||||||
| CU-06: Zona segura | ✓ | ✓ | ||||||||
| CU-07: Notificaciones | ✓ | ✓ | ✓ | |||||||
| CU-08: Config. notificaciones | ✓ | ✓ | ||||||||
| CU-A03: Cerrar sesión | ✓ | ✓ | ||||||||
| CU-A04: Cambiar contraseña | ✓ |
Esta matriz demuestra la distribución clara de responsabilidades entre los componentes de la aplicación, donde cada caso de uso está respaldado por clases específicas que implementan su funcionalidad.
9. Interfaz de Usuario
La interfaz de usuario de PawTracker ha sido desarrollada siguiendo los principios de Material Design con un enfoque personalizado, priorizando la facilidad de uso y una experiencia intuitiva. A continuación, se detallan los elementos de diseño y las consideraciones de experiencia de usuario realmente implementados en la aplicación.
9.1. Sistema visual y elementos de diseño
9.1.1. Paleta de colores
La aplicación implementa un sistema de colores dual (claro/oscuro) definido en los archivos colors.xml, colors_v2.xml y sus contrapartes para el modo oscuro:
- Color primario: #246BFD (Azul brillante) - El color distintivo de la aplicación utilizado en botones principales, acentos y elementos interactivos.
- Color primario variante: #3A75E6 (Azul medio) - Utilizado para variaciones del color primario.
- Color primario oscuro: #1D54CC (Azul oscuro) - Aplicado a la barra de estado y elementos que requieren mayor contraste.
- Color secundario: #FF8A3C (Naranja) - Utilizado como complemento para acciones secundarias.
- Colores de estado:
- Success: #4ADE80 (Verde) - Para acciones exitosas y zonas seguras
- Warning: #FBA73F (Ámbar) - Para alertas y advertencias
- Error: #F75555 (Rojo) - Para errores y notificaciones importantes
- Escala de grises: Una escala completa desde #F5F5F5 hasta #212529 para fondos, textos y elementos de interfaz.
En el modo oscuro, la aplicación utiliza una paleta adaptada con colores optimizados para bajo brillo:
- Color primario (oscuro): #4285FF
- Background (oscuro): #121212
- Surface (oscuro): #1E1E1E
9.1.2. Tipografía
Contrario a lo que se podría esperar, la aplicación no utiliza Roboto como fuente principal, sino una combinación de dos familias tipográficas:
- Noto Sans: La fuente principal de la aplicación, definida en font.xml con sus variantes:
- Noto Sans Regular: Para texto general
- Noto Sans Medium: Para énfasis y subtítulos
- Noto Sans SemiBold: Para subtítulos y elementos destacados
- Noto Sans Bold: Para títulos y encabezados
- Montserrat: Utilizada como respaldo y en ciertos elementos, especialmente en modo oscuro:
- Montserrat Regular: Mapea a Noto Sans Regular
- Montserrat Medium: Mapea a Noto Sans Medium
- Montserrat Bold: Mapea a Noto Sans Bold
Los tamaños de texto están sistematizados en una jerarquía clara:
- H1: 28sp (notosans_bold)
- H2: 24sp (notosans_bold)
- H3: 20sp (notosans_semibold)
- Body1: 16sp (notosans_regular)
- Body2: 14sp (notosans_regular)
- Caption: 12sp (notosans_regular)
9.1.3. Dimensiones y espaciados
La aplicación implementa un sistema de dimensiones coherente definido en dimens.xml:
- spacing_small: 4dp
- spacing_medium: 8dp
- spacing_large: 16dp
- spacing_xlarge: 24dp
- spacing_xxlarge: 32dp
- corner_radius: 8dp (para elementos con esquinas redondeadas)
- elevation_card: 2dp (para sombras de tarjetas)
- border_width: 1dp (para bordes de elementos)
9.1.4. Componentes de Material Design
La aplicación implementa versiones personalizadas de los componentes estándar de Material Design:
- Botones personalizados: Definidos en
Widget.App.Buttoncon esquinas redondeadas de 8dp - Botones de Google: Implementación personalizada para inicio de sesión con Google
- Cards: Con un estilo consistente que incluye bordes suaves y elevación de 1-2dp
- Floating Action Buttons (FAB): Para acciones principales como guardar zonas seguras
- TextInputLayout: Campos de texto con bordes y estilo personalizado
- Switches: Con estilos personalizados para temas claro y oscuro
- Bottom navigation: Implementada como un CardView personalizado en la parte inferior
- Custom markers: Marcadores personalizados para el mapa con foto del perro
9.2. Pantallas implementadas
9.2.1. Pantalla de inicio/login (MainActivity)
Esta pantalla, definida en activity_main.xml, presenta un diseño distintivo con las siguientes características:
Figura 9.1: Pantalla de inicio de sesión mostrando el formulario de autenticación
Figura 9.2: Vista de la pantalla de login durante la introducción de credenciales
- Fondo azul primario (#246BFD) en la parte superior
- Logo circular de la aplicación centrado en la parte superior
- CardView blanco (#FAFAFA) para contener el formulario de login
- Campos de email y contraseña con bordes sutiles (#D9DFE6)
- Opción "Recordar usuario" mediante checkbox
- Botón de inicio de sesión principal con color primario
- Separador visual con texto "O"
- Botón de inicio de sesión con Google
- Enlace para crear cuenta nueva en la parte inferior
9.2.2. Pantalla de registro (RegisterActivity)
Similar a la pantalla de login pero adaptada para el registro de nuevos usuarios:
- Mantiene el mismo estilo visual con fondo azul y card blanco
- Campo adicional para repetir contraseña
- Checkbox para aceptar términos y condiciones con enlace
- Botón "Crear cuenta" como acción principal
- Enlace para volver a inicio de sesión
9.2.3. Pantalla de carga (SplashLoginActivity)
Una pantalla minimalista que muestra:
Figura 9.3: Pantalla de carga (splash screen) con logo y barra de progreso
- Logo grande de PawTracker (160dp x 160dp)
- Barra de progreso horizontal animada
- Texto "Iniciando aplicación..."
- Nombre de la aplicación en la parte inferior
- Fondo completo en color primario
9.2.4. Pantalla principal del mapa (MapsActivity)
El centro de operaciones de la aplicación con múltiples elementos interactivos:
Figura 9.4: Pantalla principal con mapa y ubicación de mascota
Figura 9.5: Pantalla de mapa en modo de edición de zona segura
- Toolbar superior:
- Spinner personalizado para selección de perros con imágenes circulares
- Foto de perfil del usuario en formato circular
- Mapa central:
- Implementación de Google Maps a pantalla completa
- Marcadores personalizados con fotos de perros
- Visualización de zonas seguras como círculos
- Floating Action Button: Para editar zonas seguras
- Banner de edición: Aparece con texto de advertencia cuando se está editando una zona
- Barra de navegación inferior: CardView con cuatro opciones principales:
- Zona segura
- Perfil
- Ajustes
- Próx. (placeholder para futuras funcionalidades)
9.2.5. Pantalla de ajustes (AjustesActivity)
Una interfaz de configuración organizada en tarjetas:
Figura 9.6: Pantalla de ajustes con opciones de configuración
- Toolbar con título "Ajustes" y botón atrás
- Tarjeta principal de configuraciones:
- Switch para cambiar entre modo claro/oscuro
- Switch para activar/desactivar notificaciones
- Switch para desactivar optimización de batería
- Botón para probar notificaciones
- Botón para cerrar sesión
- Tarjeta de desarrolladores:
- RecyclerView con elementos item_developer.xml
- Muestra fotos y nombres de los desarrolladores
9.2.6. Pantalla de perfil de perro (PerfilPerro)
Una interfaz detallada para visualizar la información de las mascotas:
Figura 9.7: Pantalla de perfil de mascota con información detallada
- Imagen circular grande del perro en la parte superior
- Nombre y raza destacados debajo de la imagen
- Tarjeta de características: Muestra nombre, raza, peso y edad
- Tarjeta de fechas: Visualización de fechas de nacimiento y adopción
- Tarjeta de información del dueño: Muestra foto e información del propietario
- Botón "Editar perfil": En la parte inferior para acceder a la edición
9.2.7. Pantalla de edición de perro (EditarPerro)
Permite modificar todos los datos del perfil de mascota:
Figura 9.8: Pantalla de edición de perfil de mascota
- Imagen con botón de edición superpuesto
- Tarjeta de datos básicos: Campos editables para nombre, raza, peso
- Tarjeta de fechas: Selectores personalizados para fechas de nacimiento y adopción
- Tarjeta de dueño: Spinner para seleccionar propietario
- Botón "Guardar cambios": En la parte inferior
9.2.8. Pantallas de perfil y edición de usuario
Equivalentes a las de perro pero adaptadas para gestionar perfiles de usuarios:
Figura 9.9: Pantalla de perfil de usuario
Figura 9.10: Pantalla de edición de perfil de usuario
- Muestran información personal: nombre, apellidos, email, edad
- Incluyen fecha de nacimiento
- Opción para simular ser un perro (característica para pruebas)
9.2.9. Cambio de Contraseña
La pantalla de cambio de contraseña, definida en activity_change_password.xml, proporciona una interfaz segura y amigable para que los usuarios actualicen sus credenciales de acceso. Esta pantalla implementa las siguientes características:
- Interfaz minimalista y segura con campos protegidos
- Validación en tiempo real de la contraseña actual
- Verificación de coincidencia entre la nueva contraseña y su confirmación
- Retroalimentación visual inmediata sobre el estado del proceso
Los componentes principales de la interfaz incluyen:
- Campo de email no editable que muestra la cuenta actual
- Campo seguro para la contraseña actual
- Campos para la nueva contraseña y su confirmación
- Botón de acción principal para confirmar el cambio
- Botón de retroceso para cancelar la operación
Figura 9.11: Pantalla de cambio de contraseña con campos seguros y validación
La implementación en ChangePasswordActivity.kt gestiona:
- Validación de seguridad:
- Verificación de la contraseña actual mediante reautenticación
- Comprobación de longitud mínima de 6 caracteres
- Validación de coincidencia entre campos de nueva contraseña
- Gestión de errores:
- Mensajes claros sobre problemas de validación
- Retroalimentación sobre el éxito o fracaso del proceso
- Manejo de errores de autenticación de Firebase
- Experiencia de usuario:
- Campos de contraseña con visibilidad toggleable
- Animaciones suaves en transiciones
- Prevención de múltiples envíos simultáneos
9.3. Patrones de interacción y navegación
9.3.1. Estrategia de navegación
La aplicación implementa un modelo de navegación basado en actividades independientes con transiciones entre ellas:
- Navegación jerárquica: La mayoría de las pantallas incluyen un botón de retroceso explícito en la toolbar
- Navegación tabular simplificada: La barra inferior permite acceso directo a secciones principales
- Transiciones directas: Las actividades se lanzan mediante intents explícitos
9.3.2. Patrones de interacción comunes
Se identifican varios patrones consistentes en toda la aplicación:
- Selección de imágenes: Tanto para perfil de usuario como de mascotas
- Selección de fechas: Mediante un diálogo personalizado con NumberPicker (date_spinner_dialog.xml)
- Edición en dos fases: Primero visualización (Perfil) y luego edición (Editar)
- Confirmación de acciones: Mediante diálogos o mensajes toast
- Selección de perros: A través de spinner personalizado con imágenes
9.3.3. Uso de feedback visual
La aplicación proporciona retroalimentación al usuario mediante:
- Loading spinners: Indicadores de carga para operaciones asíncronas
- Banner de advertencia: Durante la edición de zonas seguras
- Cambios de color: Para zonas seguras (verde cuando el perro está dentro, rojo cuando está fuera)
- Toast messages: Para confirmaciones y errores
9.4. Temas y accesibilidad
9.4.1. Sistema de temas claro/oscuro
La aplicación implementa un sistema completo de temas claro y oscuro:
- Tema claro (por defecto): Fondos claros (#FFFFFF, #F8F9FA) con texto oscuro
- Tema oscuro: Fondos oscuros (#121212, #1E1E1E) con texto claro
- Switch en ajustes: Permite al usuario cambiar entre temas
- Atributos adaptables: Uso de ?attr/colorSurface y ?attr/colorOnSurface para adaptarse automáticamente
9.4.2. Consideraciones de accesibilidad
La aplicación tiene en cuenta varios aspectos de accesibilidad:
- Tamaños de toque: Elementos interactivos con tamaño mínimo de 48dp
- Contraste: Combinaciones de color que proporcionan contraste adecuado
- ContentDescription: En elementos visuales importantes para compatibilidad con lectores de pantalla
- Dimensiones adaptables: Sistema que facilita la adaptación a diferentes tamaños de pantalla
9.4.3. Estado visual de elementos interactivos
Los elementos interactivos tienen estados visuales claros:
- Botones: Con estado normal, presionado y deshabilitado
- Campos de texto: Con indicación clara de foco y error
- Switches: Con colores distintivos para estados activado/desactivado
- Elementos seleccionables: Con efecto ripple para feedback táctil
En resumen, la interfaz de PawTracker combina principios de Material Design con una implementación personalizada para crear una experiencia coherente, intuitiva y adaptable a diferentes necesidades y preferencias de los usuarios. El sistema visual cuidadosamente definido y los patrones de interacción consistentes facilitan el uso de las funcionalidades principales de seguimiento y gestión de mascotas.
9.5. Layouts implementados
PawTracker utiliza una variedad de layouts XML para construir su interfaz de usuario. A continuación se detallan los principales layouts implementados y los componentes clave utilizados en cada uno:
9.5.1. Layouts de pantallas principales
- activity_main.xml: Layout de la pantalla de inicio de sesión
- ConstraintLayout como contenedor principal
- FrameLayout para el icono circular de la aplicación
- CardView contenedor del formulario de login
- TextInputLayout para campos de email y contraseña
- CheckBox para la opción "Recordar usuario"
- MaterialButton para el botón de inicio de sesión
- SignInButton de Google para autenticación alternativa
- activity_register.xml: Layout para el registro de nuevos usuarios
- ConstraintLayout como contenedor principal
- Tres TextInputLayout para email, contraseña y confirmación
- LinearLayout para el contenedor de términos y condiciones
- CheckBox y TextView para aceptación de términos
- MaterialButton para el botón de registro
- activity_maps.xml: Layout principal con mapa y navegación
- CoordinatorLayout como contenedor principal para gestionar comportamientos complejos
- AppBarLayout y Toolbar personalizados con Spinner para selección de perros
- Fragment de SupportMapFragment para el mapa interactivo
- FloatingActionButton para edición de zonas seguras
- MaterialCardView para la barra de navegación inferior
- TextView para banner de edición de zona
- LinearLayout para botones de aceptar/cancelar zona segura
- activity_splash_login.xml: Pantalla de carga inicial
- ConstraintLayout con fondo de color primario
- ImageView para logo grande centrado
- ProgressBar horizontal estilizado
- TextView para mostrar estado de carga y nombre de la aplicación
- activity_ajustes.xml: Pantalla de configuraciones
- CoordinatorLayout como contenedor principal
- NestedScrollView para permitir desplazamiento
- MaterialCardView para agrupar opciones de configuración
- SwitchMaterial para opciones de tema, notificaciones y batería
- RecyclerView para mostrar lista de desarrolladores
- ImageButton para cerrar sesión
9.5.2. Layouts de perfil y edición
- perfil_perro.xml: Visualización de datos de mascota
- CoordinatorLayout como contenedor principal
- NestedScrollView para permitir desplazamiento
- ShapeableImageView circular para foto de perfil
- Tres MaterialCardView para agrupar información por categorías
- Múltiples LinearLayout para estructurar datos en pares clave-valor
- MaterialButton para acceder a edición
- editar_perro.xml: Formulario de edición de mascota
- CoordinatorLayout como contenedor principal
- ShapeableImageView con FloatingActionButton superpuesto para cambiar foto
- Tres MaterialCardView para campos editables agrupados por categoría
- EditText para nombre, raza y peso
- Campos de fecha con selector personalizado
- Spinner para selección de dueño
- MaterialButton para guardar cambios
- perfil_usuario.xml: Visualización de perfil de usuario
- Estructura similar a perfil_perro.xml
- Sección adicional para mostrar estado de simulación de perro
- ImageButton para cierre de sesión en la toolbar
- editar_usuario.xml: Formulario de edición de usuario
- Estructura similar a editar_perro.xml
- Campo email deshabilitado (no editable)
- SwitchMaterial para opción "Simular perro"
- Sección condicional para seleccionar dueño cuando es un perro
9.5.3. Layouts auxiliares y componentes reutilizables
- custom_marker_layout.xml: Diseño personalizado para marcadores en el mapa
- FrameLayout contenedor
- LinearLayout con fondo de marcador personalizado
- ImageView circular para mostrar foto del perro dentro del marcador
- date_spinner_dialog.xml: Selector de fecha personalizado
- LinearLayout como contenedor principal
- Tres NumberPicker para día, mes y año
- Botones de aceptar y cancelar en la parte inferior
- item_developer.xml: Elemento para lista de desarrolladores
- MaterialCardView como contenedor principal
- ConstraintLayout para posicionamiento preciso
- ShapeableImageView circular para foto del desarrollador
- TextView para nombre del desarrollador
- spinner_item_with_image.xml: Elemento personalizado para selector de perros
- LinearLayout horizontal
- ShapeableImageView circular para foto del perro
- TextView para nombre del perro
- loading_image.xml: Indicador de carga para imágenes
- ProgressBar simple centrado e indeterminado
- loading_spinner.xml: Indicador de carga personalizado
- ImageView con animación de rotación aplicada
La aplicación utiliza consistentemente los siguientes patrones en la implementación de layouts:
- CoordinatorLayout para pantallas complejas con múltiples elementos interactivos
- Organización de información en MaterialCardView para agrupamiento visual
- NestedScrollView para permitir desplazamiento en pantallas con mucho contenido
- ShapeableImageView para imágenes de perfil circulares con estilos consistentes
- Toolbars personalizadas con navegación hacia atrás y títulos centrados
- Botones primarios con estilo consistente al final de los formularios
- Organización de elementos en LinearLayout horizontal para etiquetas y valores
Esta estructura de layouts proporciona una experiencia de usuario coherente a través de toda la aplicación, con patrones de diseño reconocibles que facilitan el aprendizaje y uso de las diferentes funcionalidades.
10. Integraciones Externas
10.1. APIs o servicios externos utilizados
10.1.1. Google Maps API
Esta API proporciona la funcionalidad de mapas interactivos y geolocalización:
- Funcionalidades implementadas:
- Visualización de mapas en la aplicación
- Seguimiento de ubicación en tiempo real
- Creación y visualización de zonas geográficas (geofences)
- Marcadores personalizados para mascotas
- Clustering para gestión eficiente de múltiples marcadores
- Implementación: La integración se realiza mediante la biblioteca de Maps SDK para Android, configurada en el archivo build.gradle y con una API key en el AndroidManifest.xml.
10.1.2. Firebase Authentication
Este servicio gestiona la autenticación de usuarios de forma segura:
- Funcionalidades implementadas:
- Registro de usuarios con email y contraseña
- Inicio de sesión seguro
- Gestión de sesiones
- Validación de credenciales
- Implementación: Configurado mediante el archivo google-services.json y las dependencias correspondientes en build.gradle. Se utiliza la clase FirebaseAuth para manejar las operaciones de autenticación.
10.1.3. Firebase Realtime Database
Base de datos en tiempo real para sincronización de datos:
- Funcionalidades implementadas:
- Almacenamiento de perfiles de usuario y mascotas
- Sincronización de ubicaciones en tiempo real
- Persistencia de zonas seguras
- Historial de ubicaciones
- Estructura de datos: Organización jerárquica con nodos para usuarios, mascotas, ubicaciones y zonas seguras, optimizada para consultas frecuentes y actualizaciones en tiempo real.
10.1.4. FusedLocationProviderClient (Google Play Services)
Proporciona acceso optimizado a los servicios de ubicación del dispositivo:
- Funcionalidades implementadas:
- Obtención eficiente de la ubicación precisa
- Actualización periódica de ubicación
- Optimización del consumo de batería
- Combinación de múltiples fuentes (GPS, WiFi, red móvil)
- Implementación: Utilizado en la clase DogLocationManager para gestionar las actualizaciones de ubicación con diferentes intervalos según las necesidades de la aplicación.
10.1.5. Firebase Cloud Messaging (FCM)
Sistema de notificaciones push:
- Funcionalidades implementadas:
- Notificaciones instantáneas cuando un perro sale de su zona segura
- Notificaciones periódicas mientras el perro permanece fuera
- Alertas personalizadas por mascota
- Implementación: Gestionado por GeofenceBroadcastReceiver y configurado en AndroidManifest.xml con los permisos correspondientes.
10.2. Detalles de conexión y autenticación
La aplicación gestiona las credenciales y configuraciones de los servicios externos de la siguiente manera:
- Google Maps API Key: Almacenada de forma segura en el AndroidManifest.xml, con restricciones de uso por aplicación y dominio.
- Firebase: Configurado mediante el archivo google-services.json que contiene información de conexión al proyecto Firebase.
- Tokens FCM: Gestionados automáticamente por la biblioteca FCM y almacenados de forma segura.
11. Gestión de Datos
El manejo eficiente de los datos es un componente crítico de PawTracker debido a la naturaleza de la aplicación, que requiere sincronización en tiempo real de ubicaciones, persistencia para funcionamiento offline, y gestión óptima de recursos. Como equipo de estudiantes, investigamos diferentes alternativas antes de decidir la arquitectura de datos que mejor se adaptara a nuestros requisitos funcionales y no funcionales.
En esta sección, detallamos las decisiones que tomamos respecto al modelado, almacenamiento y flujo de datos en nuestra aplicación.
11.1. Modelo de datos
Hemos diseñado un modelo de datos optimizado para consultas frecuentes de ubicación y actualización en tiempo real, sacrificando cierta normalización en favor del rendimiento y la simplicidad de implementación. Después de analizar diferentes sistemas de gestión de datos, seleccionamos Firebase Realtime Database como nuestro principal sistema de almacenamiento por su excelente soporte para actualizaciones en tiempo real y su facilidad de integración con otras herramientas de Google.
11.1.1. Entidades principales
Nuestro modelo de datos se compone de las siguientes entidades principales:
- Usuario: Representa a un dueño de mascotas registrado en la aplicación. Contiene información personal básica y referencia a sus mascotas.
- Perro: Representa cada mascota registrada por un usuario. Contiene datos como nombre, raza, edad, y una ubicación actual.
- Ubicación: Representa la posición geográfica de una mascota en un momento determinado, incluyendo coordenadas y metadatos como precisión y velocidad.
- ZonaSegura: Define un perímetro geográfico considerado seguro para una mascota específica.
- HistorialUbicaciones: Registro temporal de las posiciones anteriores de cada mascota.
- Notificación: Registro de alertas enviadas al usuario cuando una mascota sale de una zona segura.
11.1.2. Esquema de datos en Firebase
Utilizamos una estructura jerárquica en Firebase Realtime Database, optimizada para nuestros patrones de acceso más frecuentes. A continuación, se muestra el esquema real implementado en nuestro proyecto:
{
"geofencing_status": {
"3TNBo6Ox0Dbzfc7clTc9hQr78vo1": "IN",
"HwWNNqxtWQOR9FWhG1MToOXfqkH3": "IN",
"mascota1": "OUT"
},
"locations": {
"3TNBo6Ox0Dbzfc7clTc9hQr78vo1": {
"latitude": 42.8331235,
"longitude": -1.567736
},
"9L10iVFht4fjujsEpDPbjpV5WSg2": {
"latitude": 42.8063202,
"longitude": -1.6283644
},
"oO4YEvacmudmJcDVDUsthvuJ1LK2": {
"latitude": 37.4219983,
"longitude": -122.084,
"timestamp": 1740971147354
}
},
"users": {
"3TNBo6Ox0Dbzfc7clTc9hQr78vo1": {
"apellidos": "",
"dueñoId": "oO4YEvacmudmJcDVDUsthvuJ1LK2",
"fechaAdopcion": 0,
"fechaNacimiento": -123552000000,
"imagenBase64": "iVBORw0KGgoAAAANSUhEUgAAA...",
"isPerro": true,
"nombre": "Nina",
"peso": 9,
"raza": "Westie",
"zonaSegura": {
"latitud": 42.83302049020985,
"longitud": -1.56803447753191,
"radio": 100
}
}
}
}
Esta estructura fue diseñada específicamente para soportar las necesidades de nuestra aplicación de geolocalización con las siguientes características principales:
- geofencing_status: Almacena el estado de cada perro en relación a sus zonas seguras. Los valores posibles incluyen "IN" (dentro de la zona) y "OUT" (fuera de la zona). La estructura utiliza IDs de perros como clave para permitir un monitoreo eficiente.
- locations: Contiene las coordenadas actuales de cada perro, con propiedades de latitud, longitud y timestamp. Utilizamos el ID del perro como clave para permitir consultas eficientes por mascota.
- users: Este nodo almacena información tanto de usuarios humanos como de perros. Utilizamos el campo "isPerro" para distinguir entre ambos tipos de entidades:
- Usuarios humanos (isPerro=false): Contienen información como nombre, apellidos, email, fecha de nacimiento y una imagen de perfil codificada en Base64.
- Perros (isPerro=true): Almacenan datos específicos como nombre, raza, peso, fechas de nacimiento y adopción, imagen codificada en Base64, y una referencia al ID de su dueño.
- Zona segura: Para los perros, se almacena un subnodo "zonaSegura" que contiene la latitud, longitud y radio que definen el perímetro de seguridad para el monitoreo.
Este diseño nos permite implementar eficientemente las principales funcionalidades de la aplicación:
- Seguimiento en tiempo real de la ubicación de cada perro
- Detección eficiente cuando un perro sale de su zona segura configurada
- Visualización de múltiples perros en el mapa con sus respectivas zonas seguras
- Manejo de relaciones entre dueños y perros para un acceso rápido a los datos relevantes