UNIVERSIDAD POLITÉCNICA DE MADRID
Escuela Técnica Superior de Ingeniería de Sistemas Informáticos
MADRID
TRABAJO FIN DE GRADO EN INGENIERÍA DEL SOFTWARE
App en Android para geolocalizar:
FIBAND
Autor: CLAUDIA AURA PLESA
Tutor:
AGUSTÍN YAGÜE PANADERO
JULIO DE 2018
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa i
Todos nuestros sueños se pueden hacer realidad
si tenemos el coraje de perseguirlos.
Walt Disney.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
ii Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa iii
RESUMEN
En la actualidad, el IoT (Internet of Things) es un concepto que nos rodea en nuestro día a día. Es por ello que el aplicarlo junto con el desarrollo de una aplicación móvil se ha convertido en una actividad muy popular y que puede crear servicios muy útiles para ayudarnos en nuestras actividades cotidianas. En este proyecto, se ha decidido combinar estas dos ideas para crear Fiband. Fiband se trata de una aplicación móvil para Android la cual se conecta con una pulsera geolocalizadora pudiendo monitorizar la ubicación de las personas que la lleven. Para el desarrollo de esta aplicación se va a utilizar la metodología ágil Mobile-D, orientada al desarrollo de proyectos pequeños de aplicaciones móviles, es por ello que se ha considerado la metodología más óptima para este trabajo de fin de grado.
En este documento se explicarán las fases de Mobile-D seguidas durante el desarrollo de la aplicación, el público al que está dirigida, factor de diferenciación, costes y conexión con la parte hardware (pulsera), además de todas las tecnologías y procedimientos usados para el desarrollo del mismo. Finalmente se presentarán las conclusiones y posibles proyectos de futuro para mejorar FiBand.
Palabras Clave: FiBand, App, Mobile-D, Android, pulsera, geolocalización.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
iv Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa v
ABSTRACT
Nowadays, IoT (Internet of Things) is a concept that surrounds us in our day to day lives. That is why it has become very usual to apply the IoT along with the development of a mobile application, moreover, it can set up very useful services for our day to day lives. For this project, it has been decided to combine these two ideas for creating Fiband. Fiband is a mobile application for Android that connects with a locator bracelet, in this way, we can monitor the location of the person that wears this bracelet. For the development of this application we are going to use the agile methodology Mobile-D, oriented to the development of little mobile applications projects, that’s why it has been decided that this methodology would be the most optimum for use in this final project. In the following document, we are going to explain the Mobile-D steps followed during the development of the App, the market to which it is addressed, differentiation factor, costs and connection with the hardware part (bracelet), as well as all the technologies and procedures used for the growth of this project. Finally, we are going to present the conclusions and future possible ways to continue developing and improving Fiband.
Key words: FiBand, App, Mobile-D, Android, bracelet, geolocation.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
vi Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa vii
AGRADECIMIENTOS
En este trabajo quiero expresar mi agradecimiento inicialmente a mi tutor, por creer y apoyar esta idea desde el principio. A mis padres por brindarme tanto apoyo y cariño haciendo que sea posible el haber llegado hoy aquí. A mis amigos, por haberme aguantado y animado en las subidas y bajadas que ha supuesto este proceso. A Eugenio, por haber sido mi pilar durante el desarrollo de este proyecto. A mis profesores, por haberme brindado los conocimientos necesarios para poder desarrollar este proyecto y muchos más. Finalmente quiero agradecer a todas las personas que se han visto implicadas en esta etapa y me han ayudado y apoyado a llevarla a cabo. ¡Gracias!
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
viii Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
INDICE
RESUMEN ........................................................................................................................ iii ABSTRACT ........................................................................................................................ v AGRADECIMIENTOS ..................................................................................................... vii INDICE DE ILUSTRACIONES ......................................................................................... xi INDICE DE TABLAS ...................................................................................................... xiii Capítulo 1. Presentación del proyecto .................................................................................. 1
1.1 Introducción .......................................................................................................... 1 1.2 Objetivos .............................................................................................................. 1 1.3 Restricciones del proyecto .................................................................................... 2
1.3.1 Pulsera geolocalizable ....................................................................................... 2 1.3.2 Dispositivos móviles y sistema operativo ............................................................. 3
1.4 Estructura de la memoria ...................................................................................... 6 Capítulo 2. Descripción del problema ................................................................................... 7
2.1 Estado del arte ..................................................................................................... 7 Capítulo 3. Ciclo del desarrollo del proyecto con metodología Mobile-D .............................. 11
3.1 Introducción a la metodología Mobile-D .............................................................. 11 3.2 Fase de exploración ........................................................................................... 12
3.2.1 Establecimiento de interesados ......................................................................... 12 3.2.2 Definición del alcance ..................................................................................... 13 3.2.3 Establecimiento de proyecto ............................................................................ 15
3.3 Fase de inicialización.......................................................................................... 16 3.3.1 Puesta en marcha del proyecto.......................................................................... 16 3.3.2 Planificación inicial ........................................................................................ 16 3.3.3 Día de prueba ................................................................................................. 35 3.3.4 Día de lanzamiento ......................................................................................... 35
3.4 Fase de producto ................................................................................................ 36 3.4.1 Versión 0 ....................................................................................................... 36 3.4.2 Versión 1 ....................................................................................................... 39 3.4.3 Versión 2 ....................................................................................................... 43 3.4.4 Versión 3 ....................................................................................................... 46
3.5 Fase de estabilización ........................................................................................ 47 3.6 Fase de pruebas ................................................................................................. 48
3.6.1 Identificación de clases de equivalencia ............................................................. 49 3.6.2 Definición de los casos de prueba ..................................................................... 53
Capítulo 4. Conclusiones y vías de ampliación .................................................................... 58 4.1 Vías de ampliación ............................................................................................. 58 4.2 Conclusiones generales ..................................................................................... 58 4.3 Conclusiones personales .................................................................................... 58
Capítulo 5. Bibliografía y glosario ...................................................................................... 59 5.1 Bibliografía ......................................................................................................... 59 5.2 Glosario .............................................................................................................. 60
Anexo 1. Diagrama de Gantt .............................................................................................. 61 Anexo 2. Software adjunto ................................................................................................. 63
I. Código implementado en la Versión 0 ................................................................... 63 II. Código implementado en la Versión 1 ................................................................... 89 III. Código impementado en la Versión 2 ............................................................... 113 IV. Código implementado en la Versión 3 .............................................................. 126
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
INDICE DE ILUSTRACIONES
ILUSTRACION 1. DISPOSITIVO GEOLOCALIZABLE GOOME ........................................ 3 ILUSTRACION 2. ESTADÍSTICAS DE USO DE SISTEMAS OPERATIVOS MOVILES .... 4 ILUSTRACION 3. ESTADÍSTICAS DE USO DE VERSIONES ANDROID ......................... 5 ILUSTRACION 4. CICLO DE DESARROLLO MOBILE-D ............................................... 12 ILUSTRACION 5. VISIÓN GENERAL DE FIBAND .......................................................... 15 ILUSTRACION 6. TECNOLOGÍAS UTILIZADAS PARA LA APLICACIÓN ...................... 15 ILUSTRACION 7. MOCKUP INICIAL .............................................................................. 17 ILUSTRACION 8. MODELO ENTIDAD RELACIÓN ........................................................ 18 ILUSTRACION 9. ARQUITECTURA KRUCHTEN 4+1 .................................................... 18 ILUSTRACION 10. DIAGRAMA DE CLASES .................................................................. 19 ILUSTRACION 11. VISTA PROCESO - PULSERA ......................................................... 21 ILUSTRACION 12. VISTA PROCESO - SERVIDOR WEB .............................................. 21 ILUSTRACION 13. VISTA PROCESO - APLICACIÓN MÓVIL ........................................ 22 ILUSTRACION 14. VISTA IMPLEMENTACIÓN .............................................................. 23 ILUSTRACION 15. VISTA DE DESPLIEGUE O FÍSICA .................................................. 24 ILUSTRACION 16. VISTA ESCENARIOS – DIAGRAMA DE CASOS DE USO............... 25 ILUSTRACION 17. INTERFAZ ACTIVITY INICIAL .......................................................... 37 ILUSTRACION 18. INTERFAZ ACTIVITY REGISTRO .................................................... 37 ILUSTRACION 19. INTERFACES ACTIVITY LOGIN ...................................................... 38 ILUSTRACION 20. INTERFACES ACTIVITY HOME ...................................................... 40 ILUSTRACION 21. INTERFACES ACTIVITY PULSERA ................................................. 41 ILUSTRACION 22. INTERFAZ ACTIVITY MAPA PULSERAS ........................................ 42 ILUSTRACION 23. INTERFAZ ACTIVITY CONFIGURAR CUENTA ............................... 44 ILUSTRACION 24. INTERFAZ ACTIVITY CONFIGURAR PULSERA ............................. 45 ILUSTRACION 25. INTERFAZ ACTIVITY SOBRE NOSOTROS .................................... 46 ILUSTRACION 26. ICONO FIBAND ................................................................................ 46 ILUSTRACION 27. INTEGRACIÓN FASES FIBAND ...................................................... 48
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
INDICE DE TABLAS
TABLA 1. TABLA DE COMPARACIÓN DE DISPOSITIVOS INTERNACIONALES ............ 8 TABLA 2. TABLA DE COMPARACIÓN DE DISPOSITIVOS NACIONALES ....................... 9 TABLA 3. IMPORTANCIA DE LOS REQUISITOS FUNCIONALES .................................. 13 TABLA 4. IMPORTANCIA DE LOS REQUISITOS NO FUNCIONALES ........................... 14 TABLA 5. CASO DE USO EXTENDIDO - REGISTRARSE EN LA APP ........................... 26 TABLA 6. CASO DE USO ALTERNATIVO1 - REGISTRARSE EN LA APP ..................... 27 TABLA 7. CASO DE USO ALTERNATIVO2 - REGISTRARSE EN LA APP ..................... 27 TABLA 8. CASO DE USO EXTENDIDO – INICIAR SESIÓN ............................................ 28 TABLA 9. CASO DE USO ALTERNATIVO1 – INICIAR SESION ...................................... 28 TABLA 10. CASO DE USO ALTERNATIVO1.1 – INICIAR SESION ................................. 28 TABLA 11. CASO DE USO ALTERNATIVO2 – INICIAR SESION .................................... 29 TABLA 12. CASO DE USO EXTENDIDO – AÑADIR PULSERA ...................................... 29 TABLA 13. CASO DE USO ALTERNATIVO1 – AÑADIR PULSERA ................................ 30 TABLA 14. CASO DE USO EXTENDIDO – EDITAR DATOS PULSERA ......................... 30 TABLA 15. CASO DE USO ALTERNATIVO1 – EDITAR DATOS PULSERA ................... 31 TABLA 16. CASO DE USO EXTENDIDO – ELIMINAR PULSERA ................................... 31 TABLA 17. CASO DE USO ALTERNATIVO1 – ELIMINAR PULSERA ............................. 32 TABLA 18. CASO DE USO EXTENDIDO – VER PULSERA EN EL MAPA ...................... 32 TABLA 19. CASO DE USO EXTENDIDO – CONFIGURAR CUENTA .............................. 33 TABLA 20. CASO DE USO ALTERNATIVO1 – CONFIGURAR CUENTA ........................ 34 TABLA 21. CASO DE USO EXTENDIDO – VER INFORMACIÓN SOBRE FIBAND ........ 34 TABLA 22. CASO DE USO EXTENDIDO – CERRAR SESIÓN ........................................ 35 TABLA 23. CASO DE USO EXTENDIDO – ENVIAR DATOS DE UBICACIÓN ................ 35 TABLA 24. ORGANIZACIÓN DE VERSIONES DE FIBAND ............................................ 36 TABLA 25. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 0 ......................................... 39 TABLA 26. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 1 ......................................... 43 TABLA 27. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 2 ...................................... 46 TABLA 28. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 3 ......................................... 47 TABLA 29. CLASE DE EQUIVALENCIA - ACTIVITY INICIO............................................ 49 TABLA 30. CLASE DE EQUIVALENCIA - ACTIVITY LOGIN ........................................... 49 TABLA 31. CLASE DE EQUIVALENCIA - ACTIVITY REGISTRO .................................... 51 TABLA 32. CLASE DE EQUIVALENCIA - ACTIVITY HOME ............................................ 52 TABLA 33. CLASE DE EQUIVALENCIA - ACTIVITY PULSERA ...................................... 53 TABLA 34. CLASE DE EQUIVALENCIA - ACTIVITY MAPA ............................................ 53 TABLA 35. PRUEBAS DE LA ACTIVITY INICIO .............................................................. 53 TABLA 36. PRUEBAS DE LA ACTIVITY LOGIN .............................................................. 54 TABLA 37. PRUEBAS DE LA ACTIVITY REGISTRO ...................................................... 55 TABLA 38. PRUEBAS DE LA ACTIVITY HOME .............................................................. 56 TABLA 39. PRUEBAS DE LA ACTIVITY PULSERA ........................................................ 57 TABLA 40. PRUEBAS DE LA ACTIVITY MAPA ............................................................... 57
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 1
Capítulo 1. Presentación del proyecto 1.1 Introducción
Nos encontramos en un mundo donde se le da demasiada importancia a lo que realmente carece de ésta y se nos olvida valorar las cosas esenciales, las personas, la familia, nuestro bienestar y el de las personas que nos rodean, etc. Este proyecto se basa en la creación de una herramienta software que nos permita cuidar estas cosas manteniéndonos en contacto con las personas que más nos importan, para ello, se ha desarrollado Fiband, una aplicación para Android, la cual se conecta con una pulsera con un localizador GPS (Global Positioning System) y muestra la ubicación de ésta. Se trata de una idea sencilla pero que implica un enorme impacto ya que, gracias a la geolocalización, podemos saber siempre dónde están nuestros allegados más pequeños o aquellos más mayores que necesitan de nuestros cuidados, sin la necesidad de que estos lleven un smartphone. Fiband es concebida con un propósito de ayuda social y su funcionalidad principal es la de monitorización de la ubicación de las personas. Para ello se ha desarrollado un producto que se divide en dos partes, una aplicación móvil totalmente gratuita y accesible para cualquier persona y una pulsera geolocalizable.
Para dicho desarrollo se ha utilizado la metodología Mobile-D propuesta por Pekka Abrahamsson y su equipo del VTT (Technical Research of Finland), el cual lidera una corriente muy importante de desarrollo ágil centrada en las plataformas móviles.
1.2 Objetivos
Con la realización de esta aplicación se pretenden alcanzar varios objetivos. Uno de ellos es disminuir este número: 121.1181. Un número que representa todas las denuncias de desaparición de personas, recibidas por el PDyRH desde que entrara en funcionamiento en el año 2010. El Sistema de Personas Desaparecidas y Restos Humanos (PDyRH) perteneciente al Ministerio del Interior tiene como finalidad la identificación de personas desaparecidas y cadáveres/restos humanos sin identificar a partir de las denuncias de desaparición recibidas. 121.118 es un número que se lee rápido y puede hasta parecer pequeño, pero cabe destacar que cada cifra de este número representa a una persona y cada persona tiene un núcleo familiar y unos amigos que también se ven afectados.
Otro número a tener en cuenta es 30.000, el cual hace referencia al número de desapariciones infantiles forzadas reconocidas en España durante el año 2009, lo que nos convertía en el segundo país del mundo con mayor número de desapariciones infantiles forzadas.
1Según el informe de Enero de 2017 publicado por el Ministerio del Interior http://www.interior.gob.es/documents/10180/6960463/Informe_Desaparecidos_Espa%C3%B1a_2017.pdf/16f1015e-c91a-460a-9f55-059bb970a0cb [Consulta 16/02/2018]
2https://www.elconfidencial.com/espana/2017-09-19/30-000-casos-y-ni-uno-resuelto-las-familias-de-ninos-robados-piden-explicaciones-a-lesmes_1446087/ [Consulta 28/02/2018]
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
2 Claudia Aura Plesa
Continuamos citando que, en España, las cifras del Alzheimer y la demencia se sitúan en torno a 600.000 pacientes3, por lo que el número de perjudicados, teniendo en cuenta a los familiares, es mucho mayor. Cabe destacar que este número se encuentra ascendiendo ya que, según el Instituto Nacional de Estadística, para mediados de este siglo la cifra podría llegar al millón de pacientes. En este caso, Fiband ayuda a los familiares y personas a cargo de los pacientes a que sea más fácil su cuidado, evitando que estos puedan perderse. Este se trata de un área primordial en este proyecto ya que al tratarse de un problema que cada vez afecta a más personas, es necesario buscar todas las soluciones posibles para ayudar al bienestar de estos pacientes y el de sus familiares o cuidadores.
Como podemos observar, las principales motivaciones de este proyecto son de ayuda social y mejorar la calidad de vida de las personas, aunque también cabe destacar los objetivos técnicos que nos han llevado a realizar este proyecto:
➢ El desarrollo de una aplicación móvil en Android. ➢ Uso de la metodología ágil Mobile-D para el desarrollo del proyecto. ➢ El desarrollo de un sistema de localización de personas basado en banda GPS. ➢ El desarrollo de un producto intuitivo y fácil de manejar teniendo en cuenta la
usabilidad. ➢ El desarrollo de un sistema seguro con persistencia de datos ➢ La documentación y el modelado tanto la arquitectura como el desarrollo de un
sistema desde sus inicios ➢ El desarrollo de un producto que cumpla el criterio SMART.
1.3 Restricciones del proyecto
1.3.1 Pulsera geolocalizable
Para la parte hardware de este proyecto inicialmente se han buscado proveedores externos que puedan proporcionarnos un dispositivo GPS geolocalizable ya que no entra dentro de los objetivos del proyecto la fabricación de una placa que tenga estas características.
La búsqueda de las pulseras geolocalizables no fue fructífera ya que todas ellas contienen su propio software, por ello, se buscaron rastreadores GPS con APIs libres que permitieran interoperar con el software de Fiband, aunque dichos dispositivos no tuviesen forma de pulsera. Con estos nuevos patrones de búsqueda se encontró y adquirió el siguiente rastreador GPS ya que en su página web ofrecían una API libre:
3http://www.elmundo.es/ciencia-y-salud/salud/2017/09/21/59c29cffca4741f6058b45b5.html [Consulta 28/02/2018]
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 3
ILUSTRACION 1. DISPOSITIVO GEOLOCALIZABLE GOOME Para poder hacer uso de la API de dicho producto es necesario un ‘access-token’4 el cual el proveedor no ha querido proporcionar, es por ello que finalmente para la presentación de este proyecto se ha decidido programar una simulación del movimiento de las pulseras. Por otro lado, cabe destacar que el uso de la pulsera en sí presenta limitaciones de uso en espacios cubiertos. Si bien, no hay inconveninetes para el cumplimiento de los objetivos del proyecto relacionados con conocer la ubicación de las personas con problemas cognitivos o de niños fuera de entornos controlados. Además, el uso del sistema permitirá la localización del espacio cerrado en el que se ha dejado de recibir la señal. 1.3.2 Dispositivos móviles y sistema operativo
Actualmente existen numerosos sistemas operativos móviles: iOS, Windows Phone, BlackBerry, etc. Para el desarrollo de este proyecto, se ha tomado la decisión de utilizar Android. El motivo principal ha sido debido a que Android es actualmente el sistema operativo más usado del mundo5, por tanto, esto nos permite llegar a más público.
4 http://www.gpsoo.net/open/v1.0/en_dataApi.html [Consulta 5/03/2018] 5 https://elpais.com/tecnologia/2017/04/04/actualidad/1491296467_396232.html [Consulta 02/03/2018]
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
4 Claudia Aura Plesa
Posteriormente, debido a que Android es opensource haciendo que no tengamos que estar preocupados por licencias de código ni problemas comerciales. Por otro lado, hay una gran cantidad de material a nuestra disposición como guías y tutoriales los cuales nos ayudan a que sea más fácil el desarrollo de una aplicación. El último motivo es debido a que en la universidad aprendemos Java en la mayoría de las asignaturas, además es de los lenguajes más utilizados actualmente y tiene mucha documentación, soporte y apoyo por parte de la comunidad de desarrolladores en internet. Cabe destacar que los lenguajes XML y MySQL también se imparten en la universidad, luego gracias a este proyecto se ha podido poner en práctica lo aprendido. Otro dato que se ha tenido en cuenta ha sido que Android es un sistema operativo que desde el año 2008 en el que fue lanzado, no ha parado de evolucionar. Dicho avance le ha permitido incorporar siempre funcionalidades nuevas o mejorar las ya existentes. A continuación, se adjuntan todas las versiones de Android, las cuales, reciben en inglés el nombre de diferentes postres, siguiendo además un orden alfabético:
- A: Apple pie (v1.0): tarta de manzana - B: Banana bread (v1.1): pan de plátano - C: Cupcake (v1.5): magdalena - D: Donut (v1.6): donut - E: Éclair (v2.0/v2.1): pastel francés - F: Froyo (v2.2): abreviatura de “frozen yogurt”, yogur helado - G: Gingerbread (v2.3): pan de jengibre - H: Honeycomb (v3.0/v3.1/v3.2): panal de miel - I: Ice Cream Sandwich (v4.0): sandwich de helado - J: Jelly Bean (v4.1/v4.2/v4.3): gominola - K: KitKat (v4.4): KitKat
ILUSTRACION 2. ESTADÍSTICAS DE USO DE SISTEMAS OPERATIVOS MOVILES
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 5
- L: Lollipop (v5.0/v5.1): piruleta - M: Marshmallow (v6.0): nubes de azúcar - N: Nougat (v7.0/v7.1): turrón - O: Oreo (v8.0/v8.1): oreo
Dicha fragmentación ha hecho que a la hora de desarrollar un proyecto en Android haya que tener en cuenta para qué versiones se quiere realizar. Para tomar dicha decisión, se han consultado las estadísticas de uso de versiones más recientes:
ILUSTRACION 3. ESTADÍSTICAS DE USO DE VERSIONES ANDROID
Como se puede observar, la cuota de uso de las versiones inferiores a la 5.0 es muy pequeña, es por ello que el desarrollo de la aplicación de Fiband se realizará para versiones 5.0 o superiores, además también se ha tenido en cuenta los plazos marcados para la entrega del proyecto, ya que, si no, no daría tiempo a finalizarlo debido a las librerías de compatibilidad. Respecto a la elección de la plataforma de Android Studio para el desarrollo de la aplicación, ha sido debido a que se trata de una herramienta con un entorno muy cómodo, con una compilación rápida, contiene todo lo necesario para desarrollar cualquier IDE y además es oficial de Google, entre otras cosas. Finalmente, respecto a la decisión de utilizar una API REST, se ha llevado a cabo debido al gran impacto que está suponiendo ya que en la actualidad casi no existe un proyecto o aplicación que no disponga de dicha tecnología6. Esto se ha producido por su escalabilidad, es decir, gracias a la separación entre el cliente y el servidor, el producto se puede escalar con un equipo de desarrollo sin que presente dificultades. Además, también es debido a su flexibilidad, portabilidad e independencia.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
6 Claudia Aura Plesa
1.4 Estructura de la memoria
El presente documento recoge todas las fases de desarrollo del proyecto mediante la metodología Mobile-D, incluyendo las tecnologías, herramientas y lenguajes utilizados para el desarrollo de este proyecto. En el Capítulo 2 – Descripción del problema, se realiza un estudio del estado del arte y se compara con las características que presenta Fiband. A continuación, en el Capítulo 3 – Ciclo de desarrollo del proyecto con metodología Mobile-D, se explica el desarrollo del proyecto Fiband mediante el uso de dicha metodología. Posteriormente, en el Capítulo 4 – Conclusiones y vías de ampliación, se plasman las conclusiones sobre el trabajo realizado y posibles trabajos futuros con objetivos de mejoras. Finalmente se adjuntan los anexos con el código desarrollado para la aplicación e información complementaria.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 7
Capítulo 2. Descripción del problema
Todas las cifras indicadas en el apartado 1.2 Objetivos de este documento, reflejan un serio problema ante el cual no podemos apartar la mirada, ya que afecta a miles de familias. Fiband ayudará en esta causa mediante la monitorización de la ubicación de las personas, de esta forma, podremos saber constantemente su localización. Dicha monitorización se realizará mediante la conexión de la aplicación móvil con una banda que contendrá un dispositivo GPS. De esta forma, la persona sólo deberá llevar la banda, como pulsera, por ejemplo, y no tendrá que cargar con un Smartphone, haciendo esto mucho más sencillo para los más pequeños o para los más mayores que les puede resultar tedioso estar pendientes de un dispositivo móvil.
2.1 Estado del arte
Según las normas APA (American Psychological Association), “el estado del arte proviene originalmente del campo de la investigación técnica, científica e industrial y significa, en pocas palabras, la situación de una determinada tecnología. Lo más innovador o reciente con respecto a un arte específico. Esta noción ha pasado a los estudios de investigación académica como “el estado o situación de un tema en la actualidad”. Es una forma de aludir a lo que se sabe sobre un asunto, lo que se ha dicho hasta el momento que ha sido más relevante”6. En este caso, al tratarse de un asunto tan importante, son varias las empresas que han intentado aportar una solución a este problema. La principal función de estos dispositivos será la de la geolocalización mediante GPS, pero muchos de ellos presentan además diferentes funcionalidades que ayudan y hacen más cómoda su utilización. A continuación, se adjunta una tabla donde se recogen los dispositivos más populares y sus diferentes características. Inicialmente se mostrarán los dispositivos internacionales, posteriormente los dispositivos creados y vendidos en España, los cuales, algunos de ellos son extraídos del Centro de Documentación de Referencia Estatal de Alzheimer del Imserso y finalmente se presentarán las características de Fiband y se compararán con las de los demás dispositivos.
❖ Empresas Internacionales:
6 http://normasapa.net/que-es-el-estado-del-arte/ [Consulta 20/03/2018]
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
8 Claudia Aura Plesa
TABLA 1. TABLA DE COMPARACIÓN DE DISPOSITIVOS INTERNACIONALES
Det
ecto
r de
ca
ídas
Lug
ar d
e co
loca
ción
de
l di
spos
itivo
Zapa
to
Bol
sillo
Muñ
eca
Bol
sillo
, ci
ntur
ón o
ca
mis
eta
Muñ
eca
Muñ
eca
Env
ío
de
aler
tas
Com
unic
ació
n po
r vo
z
Bot
ón
SOS
Rel
oj
Perí
met
ro
de
Segu
rida
d
GPS
Prec
io y
foto
299$
159$
36
5$
13
9$
172$
21
€
Nom
bre
del
prod
ucto
GPS
Sho
e ‘h
ttp://
gpss
mar
tsol
e.co
m/g
pssm
art
sole
/’
Pock
etFi
nder
‘h
ttp://
pock
etfin
der
.com
/’
Rev
olut
iona
ry
Tra
cker
‘h
ttps:
//mat
t818
53.
wix
site
.com
/we
bsite
’
Ang
elSe
nse
‘http
s://w
ww
.ang
else
nse.
com
/’
Her
eO V
2 ‘w
ww
.am
azon
.co
m’
Tur
nmeo
n ‘w
ww
.am
azon
.co
m’
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 9
❖ Empresas Nacionales:
TABLA 2. TABLA DE COMPARACIÓN DE DISPOSITIVOS NACIONALES
Det
ecto
r de
ca
ídas
Lug
ar d
e co
loca
ción
de
l di
spos
itivo
Muñ
eca
Muñ
eca
Muñ
eca
Muñ
eca
Muñ
eca
Env
ío
de
aler
tas
Com
unic
ació
n po
r vo
z
Bot
ón
SOS
Rel
oj
Perí
met
ro
de
Segu
rida
d
GPS
Prec
io y
foto
227€
1092
€
15
4€
50€
195€
Nom
bre
del
prod
ucto
eNes
t ‘h
ttp://
ww
w.n
estw
ork.
eu/e
nest
/’
Ker
uve
‘http
://w
ww
.ker
uve.
es/’
Geo
Ban
d ‘h
ttps:
//geo
.ban
d/’
Dig
ital
Mem
ory
‘http
s://i
nven
toe
lect
roni
co.c
om/
es/re
loje
s/49
-re
loj-
alzh
eim
er.h
tml’
Noc
k ‘h
ttps:
//noc
ksen
ior
.nek
i.es/
’
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
10 Claudia Aura Plesa
❖ Fiband: La provisión de un servicio tracking de GPS es común tanto en todos los dispositivos mostrados anteriormente como en Fiband, es por ello que hay que buscar un factor de diferenciación más allá de la geolocalización. En los ejemplos que hemos podido observar, las empresas han incluido diferentes características como permitir llamadas, envío de alertas, detectar si el dispositivo se cae, etc. En nuestro caso, las posibilidades que presenta Fiband son muy extensas y exceden el ámbito del Proyecto de Fin de Grado. Se ha decidido solamente abordar la geolocalización ya que sobre esta funcionalidad se podrán construir las demás:
➢ Posibilidad de crear perímetros de seguridad, de esta forma, la pulsera enviará alertas si se entra o se sale de dichos perímetros.
➢ Pantalla donde se pueda visualizar nombre, apellidos, grupo sanguíneo de la persona que lleva la pulsera y además un teléfono de contacto al que poder llamar si dicha persona se ha extraviado.
➢ Botón SOS que la persona podrá presionar en caso de emergencia y se enviará una alerta a la aplicación con la ubicación.
➢ Posibilidad de realizar llamadas y mantener una comunicación por voz. ➢ Sensor de temperatura, de esta forma, si la pulsera se cae, el sensor ya no captará
la temperatura corporal y enviará una alerta a la aplicación. También se enviará una alerta si la temperatura de la persona que lleva la pulsera supera los 38ºC.
➢ Sensor en la apertura de la pulsera, de esta forma, si la pulsera se abre para ser retirada, se enviará una alerta a la aplicación.
➢ Material con cumplimiento de los estándares de calidad y resistencia al agua y polvo (IP68)7 además de a impactos (IK05)8.
➢ Conexión con el Sistema de Navegación Galileo ya que consta de las últimas tecnologías con sistemas para evitar el spoofing9.
➢ Posibilidad de guardar la última posición por si la pulsera pierde la señal. También cabe destacar la accesibilidad dentro de éste proyecto, ya que se pretende que Fiband pueda ser utilizado por todo el mundo, sin discriminación a las personas con diversidad funcional. Finalmente, el factor de diferenciación clave ha de estar en el precio, ya que como hemos podido observar, casi todos los dispositivos superan los 100€. Aquellos con un coste inferior, se tratan de dispositivos ‘lowcost’ de procedencia asiática para los cuales encontramos numerosas críticas negativas dentro de las páginas de ventas. Dichas críticas van dirigidas a su mala calidad o a la compleja utilización de los mismos. Es por ello, que Fiband ha de tratarse de un dispositivo de calidad, sencillo de utilizar y a un coste asequible.
7 Grado de Protección: IP (Ingress Protection) 6(Nivel de protección ante el Polvo) 8(Nivel de protección frente a líquidos) 8 Grado de Protección: IK05 soporta 0.7julios de energía de impacto
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 11
Capítulo 3. Ciclo del desarrollo del proyecto con metodología Mobile-D
Las aplicaciones móviles necesitan de la utilización de metodologías específicas que se adapten mejor a sus características. Es por ello, que para el desarrollo de esta aplicación se ha llevado a cabo el uso de la metodología Mobile-D, diseñada específicamente para el desarrollo de aplicaciones móviles. A al tratarse de un proyecto de tamaño pequeño, trabajar en un entorno ágil permitirá avanzar y escalar dentro del mismo de una forma más cómoda, ya que, gracias a su característica ágil, Mobile-D permite adaptar la forma de trabajo a las condiciones del proyecto, consiguiendo de esta forma, la flexibilidad e inmediatez deseadas en la respuesta para amoldar el proyecto y su desarrollo a las circunstancias específicas del entorno. Esto es necesario ya que, en las aplicaciones móviles, la experiencia y opinión del usuario tiene una relevancia fundamental, es por ello que, en este ámbito, los enfoques basados en metodologías ágiles son los más adecuados. Por otro lado, la elección de dicha metodología frente a otras como HMD (Hybrid Methodology Design) o Mobile Development Process Spiral es debido a la mezcla te técnicas que la forman, las cuales permiten disponer de un ciclo de desarrollo muy rápido para equipos muy pequeños en el mismo espacio físico, en este caso, una sola persona. A demás, los autores que han probado esta metodología dicen haber obteniendo una certificación CMMI (Capability Maturity Model Integration) de nivel 2, aportándole una ventaja frente a otras metodologías9.
3.1 Introducción a la metodología Mobile-D
Mobile-D es una metodología ágil de desarrollo de software centrado en las aplicaciones móviles. Su comienzo parte de un proyecto finlandés ICAROS10, alrededor de los años 2004-2005, mediante una cooperación muy estrecha con la industria, aunque cabe destacar que la mayor parte del trabajo fue realizada por los investigadores del VTT (Technical Research of Finland) junto con la participación de importantes empresas de TI finlandesas, consiguiendo de esta forma, que la investigación llevada a cabo siguiera las reglas de desarrollo de las aplicaciones comerciales. El método se basa en prácticas ágiles como eXtreme Programming (XP), Crystal Methodologies y Rational Unified, además, dicha metodología consta de 5 etapas: exploración, inicialización, fase de producto, fase de estabilización y la fase de pruebas. Cada etapa consta de una función especial haciendo que el desarrollo de la metodología ágil sea eficiente. 9 http://www.adamwesterski.com/wp-content/files/docsCursos/Agile_doc_TemasAnv.pdf [Consulta 20/03/2018] 10 Interdisciplinary and Collaborative themAtic leaRning of technOlogy and Science
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
12 Claudia Aura Plesa
ILUSTRACION 4. CICLO DE DESARROLLO MOBILE-D
Dentro de cada etapa, se han identificado tres tipos de actividades y tipos de días: días de planificación, de trabajo y de despliegue. Finalmente, dichas etapas serán llevadas a cabo a lo largo de 8 a 10 semanas.
3.2 Fase de exploración
En esta primera fase, se define el plan de proyecto y las partes involucradas, así como el equipo de trabajo y las fechas de entrega. Este proceso se realiza en tres etapas: establecimientos de actores, definición del alcance y el establecimiento de proyecto. A continuación, se explica esta primera fase para el proyecto Fiband:
3.2.1 Establecimiento de interesados El propósito de esta etapa es identificar los stakeholders y grupos de interés que formarán parte del proyecto:
▪ Proveedor: una de las partes implicadas en este proyecto se trata del proveedor de las pulseras las cuales servirán para la monitorización de la posición. Son stakeholders directos y les afecta de manera positiva ya que consumimos uno de sus productos.
▪ Distribuidor: otra parte afectada serán las empresas encargadas de la distribución de las pulseras, es por ello, que también son considerados stakeholders directos ya que les afecta nuestro consumo de su servicio.
▪ Usuarios App: es a quién va orientado el producto, por tanto, se tratan de stakeholders directos. Su uso les supone una mayor tranquilidad puesto que serán los encargados de utilizar la aplicación móvil para realizar el seguimiento de los usuarios que lleven la pulsera.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 13
▪ Usuarios Monitorizados: son los encargados de llevar el dispositivo GPS para permitir la monitorización de su posición, ayudando de esta forma a mejorar su seguridad. Por tanto, ellos también son partícipes en el desarrollo social de este proyecto, haciendo de esta forma, que sean stakeholders directos.
▪ Empresas u organizaciones que traten con niños o ancianos: se tratan de clientes potenciales los cuales podrían afectar a las ventas de nuestro producto, por ello, se consideran stakeholders directos.
▪ Competencia: son considerados stakeholders indirectos ya que pueden afectar a las ventas y precios de nuestro producto.
Finalmente, cabe destacar que los grupos de dirección, de gestión del proyecto, orientado a la arquitectura y especialistas de procesos en este caso, están formados por una sola persona ya que se trata de un proyecto de fin de grado individual. 3.2.2 Definición del alcance En esta segunda etapa se definirán los objetivos establecidos respecto al contenido y funcionalidad de la aplicación con la línea de tiempo del proyecto. Para ello, inicialmente se identifican las principales funcionalidades que tiene Fiband:
− RF1: Proporcionar una información viable y en tiempo real sobre las ubicaciones de las pulseras.
− RF2: Gestionar todos los elementos del sistema: registrarse, iniciar sesión, añadir pulseras, eliminar la cuenta, modificar datos o cerrar sesión.
− RF3: Proporcionar seguridad sobre la información almacenada mediante la generación de tokens aleatorios cada vez que inicie sesión.
− RF4: La aplicación deberá cumplir la LOPD ya que se tratan datos sensibles. Todos ellos se clasifican según la importancia que se ha decidido darle a cada uno, con un valor en una escala del 1 al 5, con: 1 - nada importante, 2 - poco importante, 3 - importante, 4 – bastante importante, 5 - muy importante.
Requerimientos Importancia
RF1 5
RF2 4
RF3 3
RF4 2
TABLA 3. IMPORTANCIA DE LOS REQUISITOS FUNCIONALES
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
14 Claudia Aura Plesa
Posteriormente, se identifican los requisitos no funcionales o también conocidos como atributos de calidad, los cuales aportarán las características y restricciones generales:
− RNF1: La aplicación funcionará sobre una versión Android 5.0 o superior. − RNF2: La aplicación necesita una pulsera GPS capaz de soportar una tarjeta SIM
con datos mediante la cual se enviará la información para permitir la geolocalización.
− RNF3: Se han de tener en cuenta las buenas prácticas para el desarrollo del código. − RNF4: La parte servidora del sistema desarrollado deberá estar en alta
disponibilidad 7 x 24 x 365. − RNF5: El sistema tendrá en cuenta la interoperabilidad ya que hay diversos
componentes que deben comunicarse entre ellos. − RNF6: El sistema tendrá un buen rendimiento para garantizar a los usuarios el uso
del servicio en todo momento. − RNF7: La aplicación ha de poseer una interfaz tanto para una pantalla vertical como
para una horizontal. − RF8: Facilidad de uso e intuitiva.
Dicho requisitos se clasifican según su importancia con los mismos criterios que en el punto anterior.
Requerimientos Importancia
RNF5 5
RNF4 5
RNF6 4
RNF2 4
RNF8 3 RNF3 2 RNF7 1
RNF1 1
TABLA 4. IMPORTANCIA DE LOS REQUISITOS NO FUNCIONALES
Con dichos requisitos iniciales y teniendo en cuenta que el equipo de desarrollo está formado por una sola persona, se establece el objetivo de finalizar el proyecto en 10 semanas. Se adjunta el diagrama de Gantt correspondiente, mediante el cual plasmaremos el tiempo que se estima que se va a emplear para el desarrollo de las diferentes fases del proyecto en el Anexo 1.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 15
3.2.3 Establecimiento de proyecto
En esta última etapa de la fase de exploración, se definirán y asignarán los recursos físicos y tecnológicos necesarios para el desarrollo del proyecto. Para ello, comenzamos definiendo la arquitectura de nuestro producto:
ILUSTRACION 5. VISIÓN GENERAL DE FIBAND
Fiband está formada por dos elementos, la aplicación móvil y una pulsera geolocalizable. La comunicación entre ambas partes se realizará por medio de un tercer involucrado, el proveedor de la pulsera, ya que dicha pulsera enviará los datos de su posición a su propia página web, mientras que nosotros tendremos que solicitarlos haciendo uso de la API libre que el proveedor proporciona. Para el desarrollo de la aplicación móvil se va a utilizar la plataforma Android Studio, empleando el lenguaje de programación Java para las clases y XML para la creación de los elementos gráficos que aparecen en las pantallas.
ILUSTRACION 6. TECNOLOGÍAS UTILIZADAS PARA LA APLICACIÓN Finalmente, las pruebas del producto se realizarán sobre un dispositivo Smartphone con una versión de Android 6.0.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
16 Claudia Aura Plesa
3.3 Fase de inicialización
En esta segunda fase se preparan e identifican todos los recursos necesarios. Se planifican las fases posteriores y se establece tanto el entorno técnico como los recursos físicos, tecnológicos y de comunicaciones. Esta fase se divide en cuatro etapas: la puesta en marcha del proyecto, la planificación inicial, el día de prueba y finalmente el día de lanzamiento como etapa opcional.
3.3.1 Puesta en marcha del proyecto El propósito de esta etapa es establecer la configuración del entorno, la formación y capacitación necesaria por parte del equipo desarrollador para poder llevar a cabo el proyecto y establecer las vías de comunicación con el cliente. Respecto a la formación del equipo de desarrollo, en este caso se trata de un proyecto individual y se parte con los conocimientos y formación adquirida durante el Grado de Ingeniería de Software impartido en la ETSISI. Por otro lado, este proyecto carece de clientes con los cuales consultar los requisitos y objetivos, ya que éstos mismos son establecidos por el propio equipo de desarrollo, es por ello que no se llevará a cabo el desarrollo de las vías de comunicación con el cliente. Respecto a la configuración del entorno de desarrollo, estará compuesto por:
i) Android SDK - el kit de desarrollo Android ii) Android Studio - como entorno integrado de desarrollo iii)PHP como lenguaje de programación para el lado del servidor mediante el cual se
realizan las funciones necesarias con la base de datos (API REST) iv) MySQL como sistema de gestión de la base de datos v) Apache como servidor para la API REST
Finalmente, en esta etapa se realizó la adquisición y configuración del dispositivo geolocalizable GoomeGM02EW. Se trata de un localizador GPS el cual envía su posición GPS haciendo uso de las bandas GSM y es mostrada en nuestra aplicación.
3.3.2 Planificación inicial El objetivo de este punto será generar los modelos y documentación necesaria que ayude a obtener una buena comprensión general del producto. Ello nos permitirá preparar y perfeccionar los planes para las próximas fases del proyecto. Para ello inicialmente se ha creado el Wireframe del proyecto. Se trata del prototipo inicial o una maqueta donde se muestra el diseño que va a tener nuestra aplicación además de la trazabilidad de esta. Esto servirá de ayuda para la fase de diseño.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 17
Abrir diálogo
ILUSTRACION 7. MOCKUP INICIAL
Al mantener pulsado mostrar
opción de editar o eliminar
Lleva a Home Lleva a Inicial
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
18 Claudia Aura Plesa
Posteriormente se realiza el modelo conceptual de datos, representado mediante un diagrama Entidad Relación, el cual nos permitirá obtener una idea general del modelo de dato, pudiendo distinguir entre sus entidades, interrelaciones y sus propiedades.
ILUSTRACION 8. MODELO ENTIDAD RELACIÓN
La cardinalidad representa las siguientes relaciones:
- Un usuario puede tener mínimo ninguna pulsera y máximo N pulseras. - Una pulsera puede pertenecer solamente a un usuario.
Planteamiento de la arquitectura
A continuación, se va a plantear la arquitectura del producto utilizando el modelo de vistas 4+1 de Kruchten. Se trata de un modelo diseñado para describir la arquitectura de sistemas software basado en el uso de múltiples vistas concurrentes. Dichas vistas describen el sistema desde el punto de vista de diferentes interesados, tales como desarrolladores, directores de proyecto o usuarios finales. Como podemos observar en la ilustración 10, las vistas que lo forman son: vista lógica, vista de procesos, vista de despliegue o implementación, vista física y finalmente la vista de escenarios como el ‘+1’.
ILUSTRACION 9. ARQUITECTURA KRUCHTEN 4+1
1:1 0:N
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 19
❖ Vista lógica: En la vista lógica del modelo 4+1 de Kruchten se ha de representar la estructura y funcionalidad final del sistema. En esta vista se soportan el análisis y la especificación de los requisitos funcionales. Para su representación se va a utilizar el diagrama de clases de UML.
ILUSTRACION 10. DIAGRAMA DE CLASES
Gracias a este diagrama se pueden observar las relaciones entre las clases que forman este sistema además de los atributos y métodos que componen dichas clases. Partimos de la clase iFibandActivity la cual se trata de una clase abstracta que contendrá el método encargado de transformar y transportar un objeto en formato JSON. Dicha clase tendrá 5 clases hijas que redefinirán los métodos para adecuarse a sus requisitos:
RegistroActivity. Esta clase contendrá dos interfaces distintas con funcionalidades distintas dependiendo del modo con el que se acceda a ella. Si se accede desde la activity Inicial, la clase permitirá al usuario registrarse dentro de la aplicación, en cambio, si se accede con el modo ‘editar’, permitirá configurar los datos de la cuenta o eliminarla.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
20 Claudia Aura Plesa
LoginActivity permitirá iniciar sesión en la aplicación además de permitir la opción de enviar la contraseña por correo en caso de haberla olvidado. HomeActivity se trata de la interfaz principal en la cual se pueden ver los datos y las pulseras del usuario, además desde ella se podrá añadir, editar o eliminar una pulsera, editar o eliminar la cuenta, ver las pulseras en el mapa, ver información sobre Fiband o simplemente cerrar la sesión. PulseraActivity, al igual que para Registro, permitirá añadir una pulsera o editar los datos de ésta dependiendo del modo en el que se acceda a ella. MapaPulserasActivity es la encargada de mostrar el mapa con las pulseras. Posteriormente tenemos la clase Inicial, la cual se trata de la interfaz principal que se muestra cuando se abre la aplicación, desde ella se puede decidir ir a la opción de registrarse o a la opción de iniciar sesión si ya se tiene una cuenta. La clase RoundedImageView es la encargada de mostrar la foto del usuario en formato redondeado en vez de cuadrada tal y como la cámara toma la imagen. Más tarde la clase SobreNosotrosActivity es la interfaz en la que podremos encontrar información sobre lo que es el proyecto Fiband y una forma de ponerse en contacto con el equipo de desarrollo. Por otro lado, nos encontramos con las clases Usuario y Pulsera las cuales sirven para definir los atributos que tendrán dichos objetos, sus constructores, getters y setters. A continuación, nos encontramos la clase Sesión la cual permite el acceso a su contenido, los atributos del objeto usuario, desde cualquier clase del proyecto. De esta forma, el usuario inicia sesión e independientemente de en qué activity se encuentre podemos tener acceso a sus datos. Finalmente tenemos la clase PulseraAdapter que nos permitirá crear una vista específica para las pulseras, posteriormente dicho objeto adaptador se insertará en un ListView donde se mostrarán todas las pulseras que tiene un usuario.
❖ Vista de proceso: En esta vista se procederá a representar el modelo que sigue el sistema a nivel de procesos y demonios que están en ejecución contínua, manteniendo interconectadas todas las partes que compone el sistema. Para su representación se utiliza el lenguaje de modelado UML. La vista se dividirá en tres partes relacionadas entre sí: la parte de la pulsera, la aplicación móvil y el servidor Web. Pulsera: Este proceso comienza al encender la pulsera y consiste en recoger permanentemente las coordenadas GPS para enviar dicha información permitiendo de esta forma conocer su ubicación de manera constante. En esta primera versión, este será el único proceso que realice la pulsera.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 21
ILUSTRACION 11. VISTA PROCESO - PULSERA Servidor Web: Concurrentemente el servidor recibe y envía la ubicación de la pulsera a la aplicación móvil.
ILUSTRACION 12. VISTA PROCESO - SERVIDOR WEB
Inicio
Fin
Enviar información de posición
Inicio
Fin
Gestionar posición
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
22 Claudia Aura Plesa
Aplicación móvil: Finalmente esta última parte será la encargada de recibir la información de la posición y mostrarla, es decir, de la sincronización de la información.
ILUSTRACION 13. VISTA PROCESO - APLICACIÓN MÓVIL
❖ Vista de implementación: La vista de implementación tiene como objetivo ilustrar la organización de los módulos software que pertenecen al sistema dentro del entorno de desarrollo, es decir, muestra el sistema desde la perspectiva del programador. Para la representación de dicha vista se van a utilizar las siguientes metáforas:
Una línea discontinua para indicar la separación entre el lado del Cliente con el lado del Servidor.
Esta metáfora será la representación de la base de datos donde se almacenará toda la información tratada por nuestro sistema. Dicho marco representará los diferentes módulos que hay tanto en la parte Cliente como en la parte Servidor. Las capas que forman cada módulo se representarán con dicho rectángulo. Finalmente, las conexiones entre las capas se representarán con una línea continua.
Inicio
Fin
Sincronización de la información
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 23
ILUSTRACION 14. VISTA IMPLEMENTACIÓN
Para la justificación de este diseño explicamos módulo a módulo:
➢ Pulsera: está formada por dos capas: por un lado, la apiREST, la cual va a permitir a los desarrolladores interactuar con los datos que tenga la pulsera utilizando una arquitectura REST (Representational State Transfer) caracterizada por tener un protocolo Cliente-Servidor, un conjunto de operaciones como ‘post’, ‘get’, ‘put’ y ‘delete’ entre otras, bien definidas, una sintaxis universal para identificar los recursos y un uso de hipermedios para permitir la navegabilidad. Por otro lado, la capa de comunicación la cual servirá para enviar los datos.
➢ Servidor Web: será el módulo encargado de la gestión de la información. Está formado también por la base de datos y la capa de comunicación encargada de recibir y enviar la información.
➢ Aplicación móvil: este último módulo está formado por tres capas: GUI (Graphical User Inerface) o interfaz de usuario a través de la cual el usuario interactúa con la aplicación, capa lógica donde se implementarán las funcionalidades finales de la aplicación y por último la capa de comunicación que será la encargada de la recepción y envío de la información.
Finalmente, como se puede observar en la representación, se han utilizado dos patrones arquitectónicos:
➢ Cliente-Servidor: Este modelo permitirá el reparto servicios entre los proveedores se los recursos y los demandantes.
CLIENTE SERVIDOR
ApiREST
Pulsera
Comunicación
Aplicación Móvil
Servidor Web
Comunicación
Comunicación
GUI Capa Lógica
BBDD
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
24 Claudia Aura Plesa
➢ Layer Pattern (capas): El proyecto se divide en 3 sistemas software independientes entre sí, la pulsera, la aplicación móvil y el servidor web. Cada sistema es considerado como un módulo los cuales a su vez han sido divididos en capas. Cada capa es una agrupación de submódulos que ofrece un conjunto coherente de servicios, de esta manera, mejoramos la portabilidad, capacidad de modificación y reutilización.
❖ Vista física:
La vista física, está relacionada con la topología de componentes de software en la capa física, es decir, es la encargada de mostrar todo el despliegue de dispositivos que van a tomar parte en nuestro proyecto, además de mostrar la interacción entre ellos. Las metáforas utilizadas para la representación de esta vista serán:
Metáfora gráfica para la representación del servidor. Metáfora gráfica de la base de datos. Metáfora gráfica de la representación de la pulsera. Representación del dispositivo móvil que contiene la aplicación Fiband. Representación de las conexiones entre los dispositivos.
Por otro lado, para dicha representación se utilizará los mismos patrones arquitectónicos que para la vista de implementación.
ILUSTRACION 15. VISTA DE DESPLIEGUE O FÍSICA
Conexión mediante una
tarjeta sim 3G-4G
Conexión Wifi o tarjeta sim
3G-4G
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 25
❖ Escenarios: La representación de esta vista se realizará mediante diagramas de casos de uso. Dichos casos de uso describen de forma clara el funcionamiento del sistema mostrando las interacciones entre objetos y procesos, es decir, representan principalmente los requisitos funcionales. Para dicha representación haremos uso del lenguaje de modelado UML.
ILUSTRACION 16. VISTA ESCENARIOS – DIAGRAMA DE CASOS DE USO
Como se puede observar, tenemos tres actores, la pulsera, el usuario y el servidor web. Estos actores son entidades externas al sistema que guardan relación con el mismo dándole diferentes funcionalidades. El usuario y la pulsera se tratan de actores principales ya que son los encargados de desencadenar todos los casos de uso que tienen asociados y llevar a cabo la funcionalidad, mientras que, por otro lado, el servidor web es un actor de apoyo ya que sólo interactúa cuando el caso de uso le requiere la información, aunque es igual de necesario para el sistema ya que aporta la información necesaria para el desarrollo del caso de uso.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
26 Claudia Aura Plesa
A continuación, se adjuntan los casos de uso extendidos relacionados con dicho diagrama. Ello nos permitirá ver en forma de secuencia de eventos una funcionalidad más una interacción entre un actor y el sistema.
Nombre Registrarse en la App Actores Usuario y Servidor Web Tipo Primario11
Precondiciones Tener la aplicación instalada en el móvil Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Rellenar los datos de
nombre, email, usuario y contraseña.
2. Pulsar el botón ‘insertar’ para entrar en la aplicación.
3. Mostrar diálogo con LOPD y pedir confirmación.
4. Enviar los datos introducidos por el usuario al
servidor web.
5. Recibir los datos y comprobar si el usuario
existe en la base de datos. 6. Guardar los datos
recibidos en la base de datos.
7. Finalizar el registro llevando al usuario a la
activity Home.
TABLA 5. CASO DE USO EXTENDIDO - REGISTRARSE EN LA APP
11Hay tres tipos de casos de uso: Primario (representan los procesos comunes más importantes); Secundario (representan procesos menores o raros); Opcional (representan procesos que pueden no abordarse)
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 27
Curso alternativo de eventos, punto 1 del curso típico registrarse en la app Usuario App Fiband Servidor WEB
1. Presiona el icono de la cámara para añadir una foto
a su cuenta.
2. Abrir la cámara y guardar
la ruta de la foto que el usuario haga.
3. Volver al paso 1 del curso típico de eventos.
TABLA 6. CASO DE USO ALTERNATIVO1 - REGISTRARSE EN LA APP
Curso alternativo de eventos, punto 5 del curso típico registrarse en la app Usuario App Fiband Servidor WEB
1. Si ya existe un usuario devolver código de error.
2. Mostrar mensaje de que ya existe un usuario con
esos datos.
3. Volver al paso 1 del curso típico de eventos.
TABLA 7. CASO DE USO ALTERNATIVO2 - REGISTRARSE EN LA APP
Nombre Iniciar sesión Actores Usuario y Servidor Web Tipo Primario Precondiciones Estar registrado en la aplicación
Curso típico de eventos Usuario App Fiband Servidor WEB
1. Rellenar los datos de usuario y contraseña.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
28 Claudia Aura Plesa
2. Pulsar el botón ‘aceptar’ para entrar en la aplicación.
3. Enviar los datos introducidos por el usuario al
servidor web.
4. Recibir los datos, valida el usuario y se genera el
token. 5. Llevar al usuario a la
activity Home.
TABLA 8. CASO DE USO EXTENDIDO – INICIAR SESIÓN
Curso alternativo de eventos, punto 1 del curso típico iniciar sesión Usuario App Fiband Servidor WEB
1. Presionar el enlace que pregunta si ha olvidado la
contraseña.
2. Introducir email al que enviar la contraseña.
3. Enviar información al servidor web.
4. Validar información recibida.
5. Enviar un correo electrónico al email
introducido por el usuario con la contraseña asociada a
ese email.
6. Mostrar mensaje de ‘correo enviado con éxito’ y
volver al paso 1 del curso típico de eventos.
TABLA 9. CASO DE USO ALTERNATIVO1 – INICIAR SESION
Curso alternativo de eventos, punto 4 del curso alternativo 1
Usuario App Fiband Servidor WEB
1. Devolver código de error si el email no existe en la
base de datos.
2. Mostrar mensaje de que el email no existe en nuestra
base de datos y volver al paso 1 del curso típico de
eventos.
TABLA 10. CASO DE USO ALTERNATIVO1.1 – INICIAR SESION
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 29
Curso alternativo de eventos, punto 4 del curso típico iniciar sesión Usuario App Fiband Servidor WEB
1. Si los datos introducidos no existen en la base de
datos, devolver código de error.
2. Mostrar mensaje de que los datos introducidos no
son correctos.
3. Volver al paso 1 del curso típico de eventos.
TABLA 11. CASO DE USO ALTERNATIVO2 – INICIAR SESION
Nombre Añadir pulsera Actores Usuario y Servidor Web Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Pulsar el botón de añadir
pulsera.
2. Llevar al usuario a la activity pulsera.
3. Introducir el nombre, teléfono de contacto y color
de la pulsera.
4. Enviar los datos al servidor web.
5. Guardar los datos en la base de datos.
6. Mostrar mensaje de confirmación y llevar al
usuario a la activity home donde podrá ver la pulsera
añadida.
TABLA 12. CASO DE USO EXTENDIDO – AÑADIR PULSERA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
30 Claudia Aura Plesa
Curso alternativo de eventos, punto 4 del curso típico añadir pulsera Usuario App Fiband Servidor WEB
1. Mostrar mensaje de error
si no se han introducido todos los datos.
2. Volver al paso 2 del curso típico de eventos.
TABLA 13. CASO DE USO ALTERNATIVO1 – AÑADIR PULSERA
Nombre Editar datos pulsera Actores Usuario y Servidor Web Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Seleccionar la pulsera que
quiere editar.
2. Pulsar el botón de editar pulsera.
3. Llevar al usuario a la activity pulsera donde se visualizan los datos de la
pulsera.
4. Modificar los datos que se quiera y pulsar el botón
‘actualizar’.
5. Enviar los nuevos datos al servidor web.
6. Guardar los datos en la base de datos.
7. Mostrar mensaje de confirmación y llevar al
usuario a la activity home donde podrá ver la pulsera
editada.
TABLA 14. CASO DE USO EXTENDIDO – EDITAR DATOS PULSERA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 31
Curso alternativo de eventos, punto 4 del curso típico editar datos pulsera
Usuario App Fiband Servidor WEB
1. Mostrar mensaje de que no se ha realizado ningún
cambio.
2. Volver a la activity home.
TABLA 15. CASO DE USO ALTERNATIVO1 – EDITAR DATOS PULSERA
Nombre Eliminar pulsera Actores Usuario y Servidor Web Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Seleccionar la pulsera que
se quiere eliminar.
2. Pulsar el botón de eliminar pulsera.
3. Mostrar mensaje de confirmación de si se quiere
eliminar la pulsera.
4. Pulsar el botón ‘sí’.
5. Enviar solicitud al servidor web.
6. Eliminar dicha pulsera
de la base de datos. 5. Finalizar la eliminación
actualizando la activity Home donde se puede ver que la
pulsera ya no está en la lista de pulseras.
TABLA 16. CASO DE USO EXTENDIDO – ELIMINAR PULSERA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
32 Claudia Aura Plesa
Curso alternativo de eventos, punto 3 del curso típico eliminar pulsera
Usuario App Fiband Servidor WEB 1. Pulsar el botón ‘no’.
2. Volver a la activity home. TABLA 17. CASO DE USO ALTERNATIVO1 – ELIMINAR PULSERA
Nombre Ver pulsera en el mapa Actores Usuario y Servidor Web Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Pulsar el botón de menú.
2. Pulsar la opción ‘ver mis pulseras’.
3. Llevar al usuario a la activity mapa pulseras.
4. Solicitar constantemente al servidor web la ubicación de
las pulseras.
5. Enviar información de la
ubicación de las pulseras. 6. Visualizar la ubicación de
las pulseras en el mapa.
4. Seleccionar la pulsera que se quiera ver en el mapa.
5. Mostrar la pulsera seleccionada en el mapa usando el icono de una estrella para que se vea
mejor.
TABLA 18. CASO DE USO EXTENDIDO – VER PULSERA EN EL MAPA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 33
Nombre Configurar cuenta Actores Usuario y Servidor Web Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband Servidor WEB 1. Pulsar el botón de menú.
2. Pulsar la opción ‘configurar cuenta’.
3. Llevar al usuario a la activity registro donde se mostrarán los datos del
usuario.
4. Modificar los datos que se quiera y pulsar el botón
‘actualizar’.
5. Enviar los nuevos datos al servidor web.
6. Recibir los datos y comprobar si el usuario
introducido ya existe en la base de datos.
7. Guardar los datos en la
base de datos. 8. Mostrar mensaje de
confirmación y llevar al usuario a la activity home donde podrá ver los datos
actualizados.
TABLA 19. CASO DE USO EXTENDIDO – CONFIGURAR CUENTA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
34 Claudia Aura Plesa
Curso alternativo de eventos, punto 6 del curso típico editar datos pulsera
Usuario App Fiband Servidor WEB
1. Si ya existe un usuario devolver código de error.
2. Mostrar mensaje de que ya existe un usuario con
esos datos.
3. Volver al paso 3 del curso típico de eventos.
TABLA 20. CASO DE USO ALTERNATIVO1 – CONFIGURAR CUENTA
Nombre Ver información sobre Fiband Actores Usuario Tipo Primario
Precondiciones Estar en la activity Home Curso típico de eventos
Usuario App Fiband 1. Pulsar el botón de menú.
2. Pulsar la opción ‘sobre nosotros’.
3. Llevar al usuario a la activity sobre nosotros donde se visualiza la información
sobre Fiband. TABLA 21. CASO DE USO EXTENDIDO – VER INFORMACIÓN SOBRE FIBAND
Nombre Cerrar sesión Actores Usuario Tipo Primario
Precondiciones Estar en la activity Home
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 35
Curso típico de eventos Usuario App Fiband
1. Pulsar el botón de menú. 2. Pulsar la opción ‘cerrar sesión’.
3. Llevar al usuario a la activity inicial. TABLA 22. CASO DE USO EXTENDIDO – CERRAR SESIÓN
Nombre Enviar datos de ubicación Actores Pulsera y Servidor Web Tipo Primario
Precondiciones La pulsera tiene que estar añadida en la base de datos por el usuario.
Curso típico de eventos Pulsera Servidor WEB
1. Enviar constantemente datos de ubicación. 2. Recibir los datos.
3. Guardar los datos recibidos en la base de datos.
TABLA 23. CASO DE USO EXTENDIDO – ENVIAR DATOS DE UBICACIÓN
3.3.3 Día de prueba En esta etapa se ha revisado y validado toda la documentación desarrollada para la realización del proyecto. También se han revisado los requisitos planteados, comprobando que coinciden con los establecidos inicialmente además de comprobar que el entorno de desarrollo y la gestión de requisitos se han establecido de forma adecuada. Por otro lado, se han revisado y preparado las herramientas necesarias para el desarrollo de Fiband, comprobando su instalación y correcto funcionamiento. 3.3.4 Día de lanzamiento
Finalmente, en esta última etapa de la fase de inicialización es opcional dentro la metodología Mobile-D y por tanto no está expresamente definida. Para su desarrollo se ha decidido preparar el lanzamiento del sistema de versiones para comenzar el desarrollo de este producto:
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
36 Claudia Aura Plesa
Release Objetivo
Versión 0 Activity Inicial, registrar usuarios y control de accesos.
Versión 1 Activity Home, registro de pulseras y geolocalización.
Versión 2 Personalizar entorno.
Versión 3 Cierre de sesión, información acerca de Fiband e icono de la App.
TABLA 24. ORGANIZACIÓN DE VERSIONES DE FIBAND
3.4 Fase de producto
Nos encontramos en la tercera fase de este proyecto. El trabajo que se realizará será el de diseñar, desarrollar e implementar iterativamente todas las funciones necesarias utilizando el desarrollo dirigido por pruebas hasta llevar a cabo toda la implementación del proyecto. Dicha fase se divide en tres etapas, primero se planifica el trabajo a realizar en términos de requisitos y tareas a tareas a realizar. Posteriormente se preparan las pruebas pertinentes y finalmente se lleva a cabo la integración del sistema. El desarrollo de esta fase en nuestro proyecto se divide en cuatro versiones, las cuales quedan reflejadas en la ‘Tabla 24 – Organización de versiones de Fiband’ expuesta en el punto anterior. A continuación, desarrollamos las tres etapas para cada versión:
3.4.1 Versión 0 3.4.1.1 Día de la planificación
Comenzamos realizando el análisis de las funciones que forman parte del objetivo de esta versión inicial. Las tareas que se van a realizar son: el desarrollo de la activity Inicial, la activity de Registro y la activity de Login. A continuación, se describen los requisitos de cada una de estas junto con sus respectivos wareframes donde se reflejarán los componentes de dichas interfaces junto con las transiciones a las que se ha de reaccionar.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 37
1. Los elementos gráficos que va a tener esta activity son: el background, dos imágenes (los niños y el localizador en forma de corazón), un text view para el logo y dos botones. 2. El botón ‘Registrar’ es un enlace ‘go to screen’ para ir a la activity Registro. Se activa con el gesto ‘Tap33’. 3. El botón ‘Entrar’ es un enlace ‘go to screen’ para ir a la activity Login. Igual que con el botón de registro, se activa con el gesto ‘Tap’.
1. Los elementos gráficos son: el background, cuatro text view para mostrar los textos nombre, email, usuario y contraseña, cuatro edit text para completar los datos del usuario correspondientes, un rounded image view para la foto de perfil y un botón ‘Insertar’ para entrar en la aplicación y terminar de completar el registro. 2. El rounded image view tiene un método ‘onclicklistener’ cuya acción es servir como enlace para poder abrir la cámara y permitir al usuario añadir una foto a su perfil. 3. El botón ‘Insertar’ permite finalizar el registro ya que al pulsarlo se envían los datos introducidos al servidor web y se almacenan en la base de datos si son correctos, además, es un enlace go to Screen a la activity Home, igual que en el caso anterior, se activa con el gesto ‘Tap’. Cabe destacar que el registro se completará sólo si el usuario acepta los términos legales que se le muestren.
ILUSTRACION 18. INTERFAZ ACTIVITY REGISTRO
ILUSTRACION 17. INTERFAZ ACTIVITY INICIAL
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
38 Claudia Aura Plesa
ILUSTRACION 19. INTERFACES ACTIVITY LOGIN
1. Los elementos gráficos son: el background, tres text view para mostrar los textos de usuario y contraseña además del texto si ha olvidado la contraseña, dos edit text para completar los datos del usuario correspondientes y un botón ‘Aceptar’ para entrar en la aplicación y terminar de completar el login. 2. Los edit text han de completarse con los datos del usuario y la contraseña para poder iniciar sesión. 3. El botón ‘Aceptar’ se activa con el gesto ‘Tap’. Contiene un método ‘onclicklistener’ que envía los datos al servidor web donde se verifican. En caso de ser correctos se produce la acción go to Screen a la activity Home. 4. Si el usuario ha olvidado la contraseña, el text view ‘¿Has olvidado la contraseña?’ tiene un método ‘onclicklistener’ de tal forma que al pulsarlo con el gesto ‘Tap’ se abre un cuadro de diálogo donde el usuario introduce el email al que quiere que se le envíe la contraseña. Además, tiene dos botones con las opciones de ‘cancelar’ si quiere cerrar el diálogo o ‘aceptar’ que lo pulsará después de haber completado el campo con su correo electrónico.
En esta versión inicial también se desarrollarán las clases Usuario, Rounded Image View, Útil, Sesión y JSONRequest. La clase usuario es necesaria para definir los atributos que éste poseerá y poder, de esta manera, realizar las acciones de Registro y Login. La clase Rounded Image View nos permitirá poder dar forma circular a la foto de perfil que añada el usuario al registrarse. La clase Útil es creada para la implementación de métodos que ayuden al desarrollo de las funcionalidades de Fiband. La clase Sesión se trata de una clase ‘singleton’, lo que quiere decir que se puede acceder a su contenido desde cualquier lugar de la aplicación. Se realiza para que a la hora de iniciar sesión el usuario, se cree una sesión y poder, de esta manera, tener acceso a los atributos de éste independientemente de en qué activity nos encontremos.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 39
La clase JSONRequest tendrá desarrollados los métodos necesarios para realizar las peticiones JSON al servidor y clasificar los códigos devueltos. Para ello se necesita la librería Volley. Finalmente, tanto la acción de registro como la de inicio de sesión necesitan hacer consultas al servidor web donde estará la base de datos. Dichas consultas al servidor se realizarán pasando los parámetros del usuario al servidor en formato JSON. Para ello, se ha creado la clase abstracta IFibandActivity, de la cual las clases hijas ActivityInicial ActivityRegistro y ActivityLogin heredarán el método que realiza la comunicación.
3.4.1.2 Día de trabajo
El propósito de esta segunda etapa es la implementación de la funcionalidad del sistema. Para ello se seguirá la documentación establecida durante el día de planificación. El código desarrollado para llevar a cabo dicha funcionalidad se encuentra adjunto en el Apartado I del Anexo 2.
3.4.1.3 Día de lanzamiento
El objetivo durante esta última etapa de la Versión 0 es finalizarla obteniendo una versión totalmente funcional. Para ello, se desarrolla una demo mediante la cual se comprueba que se ha cumplido dicho objetivo.
Activity Inicial Registrar Usuarios
Control de Accesos
¿Funcionalidad validada?
TABLA 25. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 0
3.4.2 Versión 1 3.4.2.1 Día de la planificación
Para la planificación de esta versión se seguirá el mismo planteamiento que para la versión anterior. Las tareas que se van a realizar son: el desarrollo de la activity Home, la activity que permita añadir las pulseras y la activity que muestre el mapa con la localización de estas:
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
40 Claudia Aura Plesa
1. Los elementos gráficos que tiene la activity home son: el background, ocho text view por medio de los cuales se expresarán los datos del usuario, un list view donde se mostrarán las pulseras, un rounded image view para la foto de perfil, un menú y finalmente un image view con un el método ‘onclicklistener’ para hacer función de botón. 2. Al realizar el gesto ‘Tap’ sobre la imagen de la pulsera, situada abajo a la derecha, se realizará una acción ‘go to screen’ para ir a la activity Pulsera, donde se podrán añadir estas. 3. Al realizar una pulsación prolongada sobre una pulsera del list view, se abrirá un cuadro de diálogo en el cual se mostrarán dos opciones, la opción ‘Editar’ y la opción ‘Eliminar’. La primera permite cambiar el nombre, color o teléfono de contacto de la pulsera seleccionada. Dicho cambio se realizará en la activity Pulsera, luego dicho botón también sirve de enlace ‘go to screen’ con la activity Pulsera. La segunda opción permite al usuario eliminar dicha pulsera de su cuenta y por tanto dejará de mostrarse en el list view. 4. Al pulsar sobre el icono del menú haciendo el gesto ‘Tap’, éste se desplegará ofreciéndonos 4 opciones:
- Al pulsar en la primera opción, ‘Ver mis pulseras’, servirá de enlace ‘go to screen’ para llevarnos a la activity Mapa Pulseras donde podremos geolocalizar nuestras pulseras.
- Al pulsar en la segunda opción, ‘Configurar cuenta’, nos llevará a la activity Registro donde podremos cambiar nuestros datos o eliminar la cuenta. Se ha decidido reutilizar la activity Registro para optimizar el sistema, de esta forma, dependiendo si accedes a dicha activity con un modo de registro o con un modo de edición se podrán realizar unas funciones u otras.
ILUSTRACION 20. INTERFACES ACTIVITY HOME
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 41
- Al pulsar en la tercera opción, ‘Sobre nosotros’, servirá de enlace para la activity Sobre Nosotros.
- Finalmente, al hacer clic en la última opción, ‘Cerrar sesión’, se cerrará la sesión y hará de enlace ‘go to screen’ para llevarnos a la activity Inicial.
1. Los elementos gráficos que tiene la activity pulsera son: el background, cuatro text view por medio de los cuales se expresarán los datos que hay que completar en cada campo o las acciones a realizar en la activity, dos edit text para completar los datos del nombre y teléfono de contacto de la pulsera correspondientes y finalmente dos botones, uno para seleccionar el color de la pulsera y otro para finalizar el registro de la pulsera. 2. Al realizar el gesto ‘Tap’ sobre el botón ‘Seleccionar’, se abrirá un cuadro de diálogo en el cual se mostrará una paleta de colores. El usuario puede crear su propio color, para ello deberá pulsar el círculo inferior derecho, el cual tiene una metáfora que ayudará al usuario a saber que en esa opción puede personalizar su color. Al pulsar dicho elemento, el cuadro de diálogo mostrara una paleta de colores donde el usuario puede deslizar el dedo para elegir el color que prefiera. Finalmente, el usuario pulsará en ‘Aceptar’ y el diálogo desaparecerá, quedando seleccionado el color. 3. Al pulsar sobre el botón ‘Insertar’ haciendo el gesto ‘Tap’, los datos de la pulsera serán enviados al servidor para ser guardados en la base de datos, además, y el botón servirá como enlace ‘go to Screen’ para volver a la activity Home, donde podrá visualizar en el list view la pulsera que acaba de añadir.
ILUSTRACION 21. INTERFACES ACTIVITY PULSERA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
42 Claudia Aura Plesa
1. Los elementos gráficos que va a tener la activity mapa pulseras son: un mapa y un list view donde se mostrarán las pulseras del usuario. 2. Al pulsar sobre alguna pulsera del list vew, realizando el gesto ‘Tap’, el icono de dicha pulsera cambiará en el mapa y será sustituido por un icono con forma de estrella, de esta forma, será más fácil para el usuario poder localizar la pulsera deseada. 3. Al realizar el gesto ‘Tap’ sobre el icono de alguna pulsera dentro del mapa, se mostrarán los datos de esta. 4. Para volver a la activity Home, el usuario deberá pulsar el botón de retroceso de su móvil.
Para el desarrollo de esta versión también será necesario implementar dos clases ‘.java’ nuevas y dos archivos ‘.xml’:
• La clase ‘Pulsera.java’ será donde se definan los atributos de las pulseras y los correspondientes métodos ‘get’ y ‘set’.
• La clase ‘PulseraAdapter.java’ es necesaria para la creación de un objeto Adapter, dicho objeto permitirá el acceso a los datos de la pulsera y creará una vista para poder mostrarlos. Dicha vista será incluida en un list view donde se podrán visualizar todas las pulseras que tiene un usuario.
▪ El archivo ‘menu.xml’ nos permitirá definir la interfaz que poseerá el menú. ▪ El archivo ‘item_lista_pulsera.xml’ definirá la interfaz que poseerá cada
adapter que posteriormente será incluido en el list view.
Por otro lado, como se ha explicado en el Capítulo 1, punto 3 ‘Limitaciones del proyecto’, el movimiento de las pulseras será simulado para este proyecto, es por ello que se añadirá un método que se encargue de dicha tarea en la clase ‘Util.java’ además de los métodos necesarios para llevar a cabo la funcionalidad del sistema. También se hará uso en esta versión de las clases JSONRequest, RoundedImageView y la clase Sesion.
ILUSTRACION 22. INTERFAZ ACTIVITY MAPA PULSERAS
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 43
Finalmente, se volverán a realizar consultas al servidor web donde estará la base de datos. Dichas consultas al servidor se realizarán pasando la información necesaria en formato JSON. Por ello, las clases hijas ActivityHome, ActivityPulsera y ActivityMapaPulseras también heredarán el método que realiza la comunicación de la clase abstracta IFibandActivity.
3.4.2.2 Día de trabajo
La fase de trabajo de esta versión seguirá el mismo planteamiento que el especificado en la versión anterior. Se implementarán las funcionalidades del sistema siguiendo la documentación realizada durante la planificación. El código desarrollado en esta versión se encuentra adjunto en el Apartado II del Anexo 2. En este caso, encontraremos únicamente el código nuevo, es decir, aquellas clases que son utilizadas pero su código no ha sido modificado, no se volverán a adjuntar ya que dicho código lo podemos ver en la versión anterior.
3.4.2.3 Día de lanzamiento
Durante esta etapa, al igual que en la versión anterior, el objetivo será finalizarla obteniendo una versión totalmente funcional, para ello, se seguirá el mismo procedimiento de desarrollo de una demo.
Activity Home Registrar Pulsera Geolocalización
¿Funcionalidad validada?
TABLA 26. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 1
3.4.3 Versión 2 3.4.3.1 Día de la planificación
En esta versión las tareas a realizar serán el desarrollo de los métodos que permitan la personalización de la cuenta, es decir que permitan configurar o eliminar la cuenta del usuario o la pulsera. Para ello, se reutilizarán las activitys Registro y Pulsera.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
44 Claudia Aura Plesa
1. Los elementos de esta activity son los mismos que los de la activity Registro más el botón de ‘eliminar cuenta’. 2. El usuario puede cambiar su imagen pulsando mediante el gesto ‘Tap’ sobre el rounded image view. 3. El usuario puede modificar cualquiera de sus datos en los edit text. 4. Para finalizar el usuario deberá pulsar el botón ‘Actualizar’ de esta forma, se guardarán los cambios editados. Concurrentemente, servirá de enlace ‘Go to screen’ para volver a la activity Home. 5. En el botón ‘Eliminar Cuenta’ el usuario podrá eliminar su cuenta. Al pulsar dicho botón se abrirá un cuadro de diálogo donde se preguntará al usuario si está seguro que desea eliminar la cuenta, si el usuario pulsa ‘Sí’ servirá como enlace a la activity Inicial y se eliminará la cuenta, si el usuario pulsa ‘No’ se cerrará dicho diálogo. 6. Para volver a la activity Home sin realizar cambios el usuario puede pulsar el botón ‘Actualizar’ aunque no haya hecho modificaciones o pulsar el botón de retroceso de su móvil. 7. Finalmente destacar que se reutiliza la activity Registro con el objetivo de optimizar la aplicación reutilizando los recursos. Para ello se configurará dicha activity según dos modos, modo ‘Edición’ y modo ‘Registro’.
ILUSTRACION 23. INTERFAZ ACTIVITY CONFIGURAR CUENTA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 45
1. Los elementos de esta activity son los mismos que los de la PulseraActivity. 2. El usuario puede modificar sus datos pulsando sobre los edit text para cambiar el nombre o el télefono. También puede cambiar el color realizando el gesto ‘Tap’ sobre el botón ‘Seleccionar’. 3. Para finalizar, el usuario deberá pulsar el botón ‘Actualizar’, de esta forma se guardarán los cambios editados. Concurrentemente, servirá de enlace ‘Go to screen’ para volver a la activity Home. 4. Para volver a la activity Home sin realizar cambios, el usuario puede pulsar el botón ‘Actualizar’ aunque no haya hecho modificaciones o pulsar el botón de retroceso de su móvil. 5. Finalmente, dicha activity también poseerá dos modos, de ‘Edición’ y de ‘Añadir pulsera’.
Para el correcto funcionamiento de las funcionalidades implementadas en esta versión, se hará uso de las clases Usuario, Pulsera, Util, Sesion, RoundedImageView y JSONRequest. También se creará el acceso a dichas activitys desde la Activity Home. Finalmente, se volverán a realizar consultas al servidor web donde estará la base de datos.
3.4.3.2 Día de trabajo
La fase de trabajo seguirá el mismo planteamiento que el especificado en las versiones anteriores. El código nuevo desarrollado se puede encontrar en el Apartado III del Anexo 2. Cabe destacar que en la ActivityHome sólo se modifica el acceso desde el menú y se añade el código necesario para eliminar la pulsera, por ello se va a adjuntar sólo el desarrollo de esa parte modificada.
3.4.3.3 Día de lanzamiento
El objetivo volverá a ser finalizar la versión obteniendo un resultado totalmente funcional. La comprobación se realizará mediante el desarrollo de la demo.
ILUSTRACION 24. INTERFAZ ACTIVITY CONFIGURAR PULSERA
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
46 Claudia Aura Plesa
Personalizar Cuenta Personalizar Pulsera
¿Funcionalidad validada?
TABLA 27. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 2
3.4.4 Versión 3 3.4.4.1 Día de la planificación
Para la planificación de ésta última versión se seguirá el mismo planteamiento que el de las versiones anteriores. Las tareas a realizar son: el desarrollo de la activity que muestre información acerca de Fiband, permitir al usuario cerrar la sesión y el diseño del icono de la aplicación:
1. Los elementos de esta activity son un image view para mostrar el logo y un text view para mostrar el texto. 2. Dicha activity no tiene ninguna funcionalidad y sólo sirve para aportar información y un medio de contacto con el usuario. 3. El usuario deberá pulsar el botón de retroceso de su móvil para volver a la activity Home.
Para el icono de la aplicación se ha decidido utilizar una imagen circular dentro de la cual podemos encontrar el icono de un puntero de geolocalización. Dentro de dicho puntero se ha decidido introducir un corazón y la inicial del nombre del producto, es decir, la letra F. Por otro lado, destacar que el nombre de Fiband se ha formado utilizando el juego de palabras inglesas Find (encontrar) + Band (pulsera).
ILUSTRACION 25. INTERFAZ ACTIVITY SOBRE NOSOTROS
ILUSTRACION 26. ICONO FIBAND
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 47
Finalmente, en esta versión, dentro del menú de la activity Home se ha introducido una opción que permite al usuario cerrar su sesión, permitiendo de esta forma que el usuario pueda acceder a varias sesiones desde un mismo dispositivo móvil.
3.4.4.2 Día de trabajo
La fase de trabajo seguirá el mismo planteamiento que el especificado en las versiones anteriores. En la ActivityHome sólo se modifica parte del menú por ello se añadirá únicamente dicha modificación. El código nuevo desarrollado se puede encontrar en el Apartado IV del Anexo 2 de este documento.
3.4.4.3 Día de lanzamiento
En este útimo paso de esta etapa, al igual que en las versiones anteriores, se buscará finalizarla obteniendo una versión totalmente funcional, para ello, se seguirá el mismo procedimiento de desarrollo de una demo.
Cerrar sesión Información sobre FiBand Icono FiBand
¿Funcionalidad validada?
TABLA 28. ESTADO DE LA FUNCIONALIDAD - VERSIÓN 3
3.5 Fase de estabilización
Durante esta fase se llevarán a cabo dos tareas:
− Se realizarán las acciones necesarias para garantizar la integración del sistema y asegurar su correcto funcionamiento.
− Se desarrollará la actividad de “Documentation wrap-up”, es decir, la producción del documento dónde se detallará todo el trabajo realizado.
Como se puede observar en la ‘Ilustración 4’, las tareas a realizar en esta fase son similares a las de la fase de producción, aunque en este caso con el objetivo de que los distintos equipos que han trabajado en el proyecto realicen la integración del sistema. Cabe destacar que, para este proyecto, al tratarse de un trabajo de fin de grado, el desarrollo de la aplicación ha sido llevado acabo por una sola persona, por ello la integración del sistema se ha realizado paralelamente durante el desarrollo del producto en la fase de producción. A continuación, se adjunta un diagrama donde se puede ver la integración y relación de las fases desarrolladas:
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
48 Claudia Aura Plesa
ILUSTRACION 27. INTEGRACIÓN FASES FIBAND
3.6 Fase de pruebas
En esta última fase del proyecto se procederá a realizar las pruebas pertinentes para garantizar el correcto funcionamiento del producto antes de lanzarlo al mercado. En caso de encontrar errores deberán de solucionarse y cerciorarse de que se cumple correctamente la funcionalidad establecida. Finalmente se conseguirá un producto completo, estable y prefesional. Para la comprobación de la funcionalidad del producto, se llevarán a cabo pruebas de caja negra. El objetivo de este tipo de pruebas, es analizar el comportamiento de la aplicación desde el punto de vista de las entradas que recibe y las respuestas o salidas obtenidas. Cabe destacar que en este tipo de pruebas no se tendrá en consideración el funcionamiento interno del código analizado.
Versión 0
Versión 1
Versión 2 y 3
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 49
Por otro lado, se utilizarán particiones de equivalencia, es decir, se identificarán las clases de equivalencia y se definirán los casos de prueba a aplicar.
3.6.1 Identificación de clases de equivalencia
Definiremos las clases de equivalencia según las activitys que forman la aplicación. Estas a su vez, serán evaluadas según ciertos parámetros de entrada, para ello, comprobaremos la salida que produce una acción dentro de una activity en función de dichos parámetros de entrada que se procederán a catalogar a continuación.
➢ Clase de equivalencia Activity Inicio Dentro de esta activity identificamos dos botones, el botón Registrar nos llevará a la activity Registro(C1) y el botón Entrar, nos llevará a la activity Login(C2).
Condición Clases Válidas
C1 L1 = El botón Registro ha sido pulsado
C2 L2 = El botón Entrar ha sido pulsado
TABLA 29. CLASE DE EQUIVALENCIA - ACTIVITY INICIO
➢ Clase de equivalencia Ativity Login
Dentro de esta activity identificamos dos campos que han de ser rellenados, el Usuario(C1) y la Contraseña(C2).
Condición Clases Válidas Clases Inválidas
C1 L1 = Varchar de longitud entre 1 y
255 caracteres
L2 = Ningún carácter L3 = El usuario no
existe
C2 L4 = Varchar de longitud entre 1 y
255 caracteres L5 = Ningún caracter
TABLA 30. CLASE DE EQUIVALENCIA - ACTIVITY LOGIN
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
50 Claudia Aura Plesa
➢ Clase de equivalencia Ativity Registro Dentro de esta activity nos encontramos con 4 campos: Nombre (C1), e-mail (C2), usuario (C3) y contraseña (C4). Por otro lado, en la parte superior si se pulsa sobre la imagen de la cámara el usuario podrá añadir una foto a su cuenta (C5). Para completar el registro, el usuario habrá de pulsar el botón Insertar (C6). Finalmente, el usuario tendrá que aceptar las condiciones de uso y la normativa LOPD (C7). Cabe destacar que, si el usuario desea modificar los datos de su cuenta, se le redirigirá a la misma activity, mostrando el botón de Actualizar (C8) y el botón de Eliminar la cuenta (C9).
Condición Clases Válidas Clases Inválidas
C1 L1 = Varchar de longitud entre 1 y
255 caracteres
L2 = Tamaño superior a 225
caracteres L3 = Ningún caracter
C2 L4 = Varchar de longitud entre 1 y
255 caracteres
L5 = Tamaño superior a 225
caracteres L6 = Ningún caracter
C3 L7 = Varchar de longitud entre 1 y
255 caracteres
L8 = Tamaño superior a 225
caracteres L9 = Ningún carácter
L10 = Usuario ya existente
C4 L11 = Varchar de longitud entre 1 y
255 caracteres
L12 = Tamaño superior a 225
caracteres L13 = Ningún
caracter
C5 L14 = Se añade foto
C6 L15 = El botón Insertar ha sido
pulsado
C7
L16 = el botón de Aceptar la normativa
ha sido pulsado L17 = el botón de No Aceptar la normativa
ha sido pulsado
C8 L18 = El botón de Actualizar datos ha
sido pulsado
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 51
C9 L19 = El botón de
Eliminar la cuenta ha sido pulsado
TABLA 31. CLASE DE EQUIVALENCIA - ACTIVITY REGISTRO
➢ Clase de equivalencia Ativity Home Dentro de esta activity identificamos 3 elementos con los que se puede interactuar: el menú (C1), el botón de añadir pulsera (C2) y finalmente el botón Pulsera (C3), el cual se activa al mantener pulsada una pulsera de la lista de pulseras, permitiéndonos editar o eliminar dicha pulsera. Además, se establecen las clases de equivalencia pertenecientes al menú (C1):
- C11 corresponde a la opción Ver mis pulseras - C12 corresponde a la opción Configurar Cuenta - C13 corresponde a la opción Sobre Nosotros - C14 corresponde a la opción Cerrar Sesión
Finalmente se establecen las clases de equivalencia pertenecientes al cuadro de diálogo que se abre al mantener pulsada una pulsera de la lista de pulseras (C3):
- C31 corresponde a la opción de Editar Pulsera - C32 corresponde a la opción de Eliminar Pulsera
Condición Clases Válidas Clases Inválidas
C1 L1 = El botón Menú ha sido pulsado
C11 L2 = La opción
VerMisPulseras ha sido pulsada
C12 L3 = La opción
ConfigurarCuenta ha sido pulsada
C13 L4 = La opción
SobreNosotros ha sido pulsada
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
52 Claudia Aura Plesa
C14 L5 = La opción
CerrarSesión ha sido pulsada
C2 L6 = El botón
AñadirPulsera ha sido pulsado
C3 L7 = Una pulsera de la lista de pulseras ha sido
seleccionada
C31 L8 = La opción Editar ha sido pulsada
C32 L9 = La opción Eliminar ha sido pulsada
TABLA 32. CLASE DE EQUIVALENCIA - ACTIVITY HOME
➢ Clase de equivalencia Ativity Pulsera
Dentro de esta activity identificamos dos campos a completar, el nombre de la pulsera (C1) y el teléfono de contacto (C2). Por otro lado, a la pulsera se le puede atribuir un color (C3). Finalmente, el botón de Insertar en caso de añadir una pulsera (C4) o el botón de Actualizar en caso de estar modificando los datos de una pulsera (C5).
Condición Clases Válidas Clases Inválidas
C1 L1 = Varchar de longitud entre 1 y
255 caracteres
L2 = Tamaño superior a 225
caracteres L3 = Ningún caracter
C2 L4 = Longitud de 9 caracteres numéricos
L5 = Longitud distinta de 9
caracteres numéricos
C3 L6 = Se ha elegido un color
L7 = No se ha elegido color
C4 L8 = El botón de Insertar ha sido
pulsado
C5 L9 = El botón de Actualizar ha sido
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 53
pulsado
TABLA 33. CLASE DE EQUIVALENCIA - ACTIVITY PULSERA
➢ Clase de equivalencia Ativity Mapa
Dentro de esta activity identificamos dos acciones: pulsar una pulsera de la lista de pulseras que hay debajo del mapa (C1) y pulsar el puntero de la pulsera que hay dentro del mapa (C2).
Condición Clases Válidas Clases Inválidas
C1 L1 = Pulsar una
pulsera de la lista de pulseras
C2
L4 = Pulsar un puntero perteneciente a una pulsera dentro
del mapa
TABLA 34. CLASE DE EQUIVALENCIA - ACTIVITY MAPA
3.6.2 Definición de los casos de prueba
En este apartado se procederá a realizar las pruebas de las clases de equivalencia que hemos definido en el punto anterior. Para ello se insertarán unos valores de entrada y se analizarán los valores de salida que se obtengan.
➢ Pruebas para la clase Inicio
Pruebas C1 C2 Clases Válidas Clases Inválidas Resultado esperado
Resultado obtenido
P1
L1 - Transición a la activityRegistro
P2
L2 - Transición a la activityLogin
TABLA 35. PRUEBAS DE LA ACTIVITY INICIO
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
54 Claudia Aura Plesa
➢ Pruebas para la clase Login
Pruebas C1 C2 Clases Válidas
Clases Inválidas
Resultado esperado
Resultado obtenido
P1 Agustín Yague L1, L4 - Inicio de sesión
en la activityHome
P2 Agustín L1 L5
Mensaje de error: “Datos de
acceso incorrectos”
P3 Yague L4 L2
Mensaje de error: “Datos de
acceso incorrectos”
P4 Pepe
(usuario que no existe)
123 L3
Mensaje de error: “Datos de
acceso incorrectos”
TABLA 36. PRUEBAS DE LA ACTIVITY LOGIN
➢ Pruebas para la clase Registro
Pruebas C1 C2 C
3 C4 C5 C6 C7 C8 C9
Clases
Válidas
Clases Inváli
das
Result esperad
o
Result obteni
do
P1 A [email protected] A A
L1, L4, L7, L11, L14, L15, L16
-
Salto a la
activity Home
P2 [email protected] A A
L4, L7, L11, L14, L15
L3
Mensaje de error: Campos de texto vacios.
P3
(+ de
225 carac.)
L4, L7, L11, L14, L15
L2
Mensaje de error informando que uno de
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 55
los campos se sale
de rango
P4 A [email protected] A A
L1, L4, L7, L11, L15, L16
-
Salto a la
activity Home
P5 A [email protected] A A
L1, L4, L7, L11, L15, L17
Se vuelve a
la activity Registro
P6 A [email protected] A A
L1, L4, L7, L11, L14, L15
L6
Mensaje de error informando que
el usuario
ya existe
P7
L18
Se actualiz
a la info. y
se vuelve a
la activity Home
P8
L19
Se elimina
la cuenta y
se vuelve a
la activity Inicio
TABLA 37. PRUEBAS DE LA ACTIVITY REGISTRO
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
56 Claudia Aura Plesa
➢ Pruebas para la clase Home
Pruebas C11 C12 C13 C14 C2 C31 C32 Clases Válidas
Clases Inválidas
Resultado esperado
Resultado obtenido
P1
L1 - Salto a la
activityMapa
P2
L2 - Salto a la activity Registro
P3
L3 - Salto a la
activitySobreNosotros
P4
L4 -
Cierre de sesión y salto
a la activityInicio
P5
L5 - Salto a la activity Pulsera
P6
L6 - Salto a la activity Pulsera
P7
L7 - Se elimina la pulsera
TABLA 38. PRUEBAS DE LA ACTIVITY HOME
➢ Pruebas para la clase Pulsera
Pruebas C1 C2 C3 C4 C5 Clases Válidas
Clases Inválidas
Resultado esperado
Resultado obtenido
P1 A 600000000
Gris
L1, L4, L6, L8 -
Salto a la activityHome
donde se puede ver la
pulsera insertada
P2 A 700000000
Gris
L1, L4, L6, L9 -
Salto a la activity
Home donde se puede ver
la pulsera actualizada
P3 B 30 Gris
L1, L6, L8 L5
Mensaje de error
informando que el
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 57
número introducido
es incorrecto
P4
(+ de
225carac.)
600000000
Gris
L4, L6, L8 L2
Mensaje de error
informando que el
nombre es demasiado
largo
P5 600000000
Gris
L4, L6, L9 L3
Mensaje de error
informando que todos los campos han
de ser completados
P6 A 600000000
L1, L4, L8 L7
Mensaje de error
informando que todos los campos han
de ser completados
TABLA 39. PRUEBAS DE LA ACTIVITY PULSERA
➢ Pruebas para la clase Mapa
Pruebas C1 C2 Clases Válidas
Clases Inválidas
Resultado esperado
Resultado obtenido
P1
L1 -
Se remarca con una estrella la
pulsera pulsada dentro del mapa
P2
L2 -
Se muestra un cuadro de diálogo con los datos de
la pulsera pulsada
TABLA 40. PRUEBAS DE LA ACTIVITY MAPA
Finalizamos esta última fase de la metodología Mobile-D destacando que todas las pruebas se han llevado a cabo con éxito y por tanto se ha completado la producción de la aplicación móvil FiBand cumpliendo con todos los requisitos establecidos inicialmente.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
58 Claudia Aura Plesa
Capítulo 4. Conclusiones y vías de ampliación
En este capítulo se procederán a exponer las vías de ampliación del producto además de las conclusiones y resultados finales extraídos tras el desarrollo de éste trabajo de final de grado.
4.1 Vías de ampliación
Tal y como se ha explicado en este documento, este proyecto trata sobre una primera versión de FiBand en la cual se han desarrollado los elementos básicos del sistema. Para garantizar el factor de diferenciación con respecto a los demás dispositivos que se encuentran en el mercado, FiBand deberá implementar más funcionalidades, las cuales se entregarán en versiones futuras. Muchas de dichas funcionalidades han sido expuestas en el apartado 2.1.Estado del arte, de este documento, de las cuales destacaremos que las principales a tener en cuenta para la próxima versión serán la incroporación de una pantalla en la pulsera donde se puedan visualizar los datos de la persona que lleva la pulsera y la posibilidad de guardar la última posición en caso de que se pierda la señal. Por otro lado, para poder llevar a cabo el desarrollo de dicho progreso se necesitará buscar un apoyo financiero, es por ello, que como acción de futuro se tiene en cuenta el presentar FiBand dentro de la competición de creación de empresas ActúaUPM.
4.2 Conclusiones generales
FiBand nació con el objetivo de crear un producto de geolocalización útil para el día a día de las personas, para ello, inicialmente se plantearon los requisitos de la aplicación y cómo hacer posible su desarrollo. Tras un mes de estudio junto con el apoyo del tutor de este proyecto, se logró encaminar el comienzo del proyecto y poder dar vida a esta idea mediante la aplicación de herramientas y conocimientos software.
4.3 Conclusiones personales
El desarrollo de este producto ha sido una oportunidad para poder poner en práctica todos los conceptos y conocimientos adquiridos durante el Grado de Ingeniería del Software. Por otro lado, también ha supuesto un reto respecto a la producción de un producto nuevo, a la realización de un proyecto de principio a fin y finalmente respecto al uso de una metodología, Mobile-D, de la cual apenas existen trabajos realizados en España. Por otro lado, la construcción de aplicaciones móvil es un área que se está expandiendo a pasos vertiginosos hoy en día, es por ello que el haber realizado Fiband ha sido una experiencia muy productiva y con un gran valor de futuro. Finalmente, destacar el valor personal y social que proporciona el utilizar las nuevas tecnologías y los conocimientos adquiridos para desarrollar productos sociales que mejoren la calidad de vida de las personas y ayuden, como es en este caso, en situaciones críticas.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 59
Capítulo 5. Bibliografía y glosario
5.1 Bibliografía
1. Mobile – D: http://agile.vtt.fi/mobiled.html [Consulta 13/03/2018]
2. BOE: https://www.boe.es/buscar/act.php?id=BOE-A-2011-8382 [Consulta 27/02/2018]
3. Android: https://es.wikipedia.org/wiki/Android [Consulta 6/03/2018]
4. Estadísticas de uso de las versiones de Android: https://developer.android.com/about/dashboards/index.html?hl=es-419 [Consulta 20/03/2018]
5. Diagrama de Gantt: https://es.wikipedia.org/wiki/Diagrama_de_Gantt [Consulta 16/02/2018]
6. Android Studio: https://es.wikipedia.org/wiki/Android_Studio [Consulta 16/02/2018]
7. Modelo Entidad Relación (MER): https://es.wikipedia.org/wiki/Modelo_entidad-relaci%C3%B3n [Consulta 20/02/2018]
8. Modelo de vistas 4+1 Kruchten: https://es.wikipedia.org/wiki/Modelo_de_Vistas_de_Arquitectura_4%2B1 [Consulta 20/02/2018]
9. JSON: https://es.wikipedia.org/wiki/JSON [Consulta 20/02/2018] 10. Patrón arquitectónico Cliente Servidor: https://es.wikipedia.org/wiki/Cliente-
servidor [Consulta 21/02/2018] 11. Patrón arquitectónico Layern Pattern (Capas):
https://arevalomaria.wordpress.com/2010/12/02/introduccion-al-patron-de-arquitectura-por-capas/ [Consulta 21/02/2018]
12. Edit Text: http://www.hermosaprogramacion.com/2016/03/edittext-android/ [Consulta 01/03/2018]
13. Rounded Image View: https://android.jlelse.eu/circular-imageview-nightmare-for-beginners-822c4137e629 [Consulta 01/03/2018]
14. List View: https://developer.android.com/guide/topics/ui/layout/listview.html?hl=es-419 [Consulta 05/03/2018]
15. Objeto Adapter: https://elbauldelprogramador.com/programacion-android-interfaz-grafica_28/ [Consulta 05/03/2018]
16. Pruebas de caja Negra: https://es.wikipedia.org/wiki/Caja_negra_(sistemas) [Consulta 10/04/2018]
17. Particiones de Equivalencia: https://www.fing.edu.uy/inco/cursos/ingsoft/pis/memoria/dvd01/experiencia2005/MUM/protest/guias/guias/particionE.htm [Consulta 13/04/2018]
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
60 Claudia Aura Plesa
5.2 Glosario
1. Smartphone: Teléfono celular con pantalla táctil, que permite al usuario conectarse a internet, gestionar cuentas de correo electrónico e instalar otras aplicaciones y recursos a modo de pequeño computador.
2. Access token: Objeto que contiene las credenciales de seguridad para un inicio de sesión e identifica al usuario.
3. Opensource: Aquellos programas que permiten el acceso a su código de programación.
4. Tracking: Seguimiento o rastreo. 5. Spoofing: Técnicas de suplantación de identidad generalmente para usos maliciosos. 6. eXtreme Programming (XP): Metodología de desarrollo ágil de la ingeniería de
software formulada por Kent Beck. 7. Crystal Methodologies: Las metodologías Crystal son una familia de metodologías
ágiles, donde cada una de ellas está adecuada para un tipo de proyecto. Su creador es Cockburn, uno de los firmantes del manifiesto ágil.
8. Rational Unified: RUP es un proceso de desarrollo de software que, junto con el UML, constituye la metodología estándar más utilizada para el análisis, diseño, implementación y documentación de sistemas orientados a objetos.
9. JSON (JavaScript Object Notation): es un formato de texto ligero para el intercambio de datos.
10. Api REST: sss
11. Wareframes: Se trata de un guía visual que representa el esquema o plano de una pantalla.
12. Background: Fondo de pantalla. 13. Text View: Etiquetas de texto como medio de salida, es decir, para mostrar un
determinado texto al usuario. 14. Go to Screen: Dicha acción refleja el salto de una activity a otra como
desencadenante de una acción, en este caso, pulsar un botón. 15. Gesto Tap: Dicho gesto representa el tocar o accionar la pantalla. 16. Edit Text: Un Edit Text es un TextView cuya apariencia ha sido modificada para
actuar como campo de texto, donde el usuario puede editar su contenido para especificar datos en una aplicación Android.
17. Onclicklistener: Evento para escuchar eventos de click realizados sobre un botón. 18. Demo: Demostración didáctica de funcionamiento de una cosa, generalmente en el
ámbito científico o técnico. 19. Varchar: Tipo de datos que almacena series de caracteres de hasta 255 bytes en un
campo de longitud variable. Los datos pueden ser letras, números y símbolos. 20. Wireframe: Representación o boceto visual de la estructura y contenido de la
interfaz de la aplicación. Se trata de una representación muy sencilla y esquemática.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 61
Anexo 1. Diagrama de Gantt
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
62 Claudia Aura Plesa
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 63
Anexo 2. Software adjunto
I. Código implementado en la Versión 0
IFibandActivity.java package com.claudia.fiband.activity;
import android.content.Context;
import org.json.JSONObject;
/**
* Created by Claudia Plesa.
*/
public interface IFibandActivity {
public static int RESULT_CODE_OK = 0;
public static int RESULT_CODE_ERR = -1;
public static int RESULT_CODE_NONE = 99;
public void onJSONResult(int requestCode, int resultCode, JSONObject
data); // es un método obligatorio
public Context getApplicationContext();
}
Usuario.java package com.claudia.fiband.modelo;
import java.io.Serializable;
/**
* Created by Claudia Plesa.
*/
public class Usuario implements Serializable{
private int id;
private String nombre;
private String email;
private String usuario;
private String foto;
private String contrasena;
private String token;
public Usuario(int id, String nombre, String email, String usuario,
String foto, String contrasena, String token) {
this.id = id;
this.nombre = nombre;
this.email = email;
this.usuario = usuario;
this.foto = foto;
this.contrasena = contrasena;
this.token = token;
}
public int getId() {
return id;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
64 Claudia Aura Plesa
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
public String getContrasena() {
return contrasena;
}
public void setContrasena(String contrasena) {
this.contrasena = contrasena;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
public String toString() {
return nombre;
}
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 65
RoundedImageView.java
package com.claudia.fiband.activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.support.v7.widget.AppCompatImageView;
/**
* Created by Claudia Plesa.
*/
public class RoundedImageView extends AppCompatImageView {
public RoundedImageView(Context context) {
super(context);
}
public RoundedImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RoundedImageView(Context context, AttributeSet attrs, int
defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
int w = getWidth();
@SuppressWarnings("unused")
int h = getHeight();
Bitmap roundBitmap = getCroppedBitmap(bitmap, w < h ? w : h);//if
canvas.drawBitmap(roundBitmap, 0, 0, null);
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
66 Claudia Aura Plesa
}
public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
Bitmap sbmp;
if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
float factor = smallest / radius;
sbmp = Bitmap.createScaledBitmap(bmp,
(int) (bmp.getWidth() / factor),
(int) (bmp.getHeight() / factor), false);
} else {
sbmp = bmp;
}
Bitmap output = Bitmap.createBitmap(radius, radius,
Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final String color = "#BAB399";
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, radius, radius);
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor(color));
canvas.drawCircle(radius / 2 + 0.7f, radius / 2 + 0.7f,
radius / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(sbmp, rect, rect, paint);
return output;
}
}
Util.java
package com.claudia.fiband.modelo;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by Claudia Plesa.
*/
public class Util {
public static void mensaje(Context context, String titulo, String
mensaje)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(titulo);
builder.setMessage(mensaje);
builder.setPositiveButton("ACEPTAR",
new DialogInterface.OnClickListener() {
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 67
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
public static Usuario obtenerUsuarioJSON(Context context, JSONObject
datosUsuario)
{
Usuario u = null;
try {
int id = datosUsuario.getInt("id");
String nombre = datosUsuario.getString("nombre");
String email = datosUsuario.getString("email");
String usuario = datosUsuario.getString("usuario");
String foto = datosUsuario.getString("foto");
String contrasena = datosUsuario.getString("contrasena");
String token = datosUsuario.getString("token");
u = new
Usuario(id,nombre,email,usuario,foto,contrasena,token);
} catch (JSONException e) {
Util.mensaje(context,"Atencion!",e.getMessage());
}
return u;
}
}
Sesion.java package com.claudia.fiband.modelo;
/**
* Created by Claudia Plesa.
*/
public class Sesion {
private static Sesion instance = null;
private Usuario usuario = null;
private Sesion() {}
public static Sesion getInstance(){
if(instance==null)
instance = new Sesion();
return instance;
}
public Usuario getUsuario() {
return this.usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
}
JSONRequest.java
package com.claudia.fiband.net;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
68 Claudia Aura Plesa
import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.claudia.fiband.R;
import com.claudia.fiband.activity.IFibandActivity;
import com.claudia.fiband.modelo.Usuario;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import static
android.provider.ContactsContract.CommonDataKinds.Website.URL;
/**
* Created by Claudia Plesa.
*/
public class JSONRequest {
private IFibandActivity activity;
private int requestCode;
public JSONRequest(IFibandActivity activity, int requestCode) {
this.activity = activity;
this.requestCode = requestCode;
}
public void request(String url, JSONObject params) throws
JSONException {
JsonObjectRequest jsObjRequest = new
JsonObjectRequest(Request.Method.POST, url, params, new
Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Log.e("Fiband",response.toString());
if(response.getString("code").equals("OK"))
{
activity.onJSONResult(requestCode,
IFibandActivity.RESULT_CODE_OK,response.getJSONObject("data"));
}
else
{
activity.onJSONResult(requestCode,
IFibandActivity.RESULT_CODE_ERR,response.getJSONObject("data"));
}
} catch (JSONException e) {
Log.e("Fiband",e.toString());
activity.onJSONResult(requestCode,
IFibandActivity.RESULT_CODE_ERR,null);
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 69
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Fiband",error.toString());
activity.onJSONResult(requestCode,
IFibandActivity.RESULT_CODE_ERR,null);
}
})
{
@Override
public Map<String, String> getHeaders() throws
AuthFailureError {
HashMap<String, String> headers = new HashMap<String,
String>();
headers.put("Content-Type", "application/json;
charset=utf-8");
return headers;
}
};
RequestQueue requestQueue =
Volley.newRequestQueue(activity.getApplicationContext());
requestQueue.add(jsObjRequest);
}
}
Activity Inicial Inicial.java
package com.claudia.fiband.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import com.claudia.fiband.R;
public class Inicial extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide(); //ocultar action bar con titulo
setContentView(R.layout.activity_inicial);
}
public void metodoRegistrar(View v){
Intent i = new Intent(this,RegistroActivity.class);
i.putExtra("modo","nuevo");
startActivity(i);
}
public void metodoEntrar(View v){
Intent i = new Intent(this,LoginActivity.class);
startActivity(i);
}
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
70 Claudia Aura Plesa
activity_inicial.xml <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fondopaisaje"
tools:context="com.claudia.fiband.activity.Inicial"
tools:layout_editor_absoluteY="81dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="206dp"
android:layout_height="0dp"
android:layout_marginBottom="17dp"
android:layout_marginEnd="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/imageView3"
app:layout_constraintTop_toBottomOf="@+id/button3"
app:srcCompat="@drawable/niniosfondo"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1" />
<Button
android:id="@+id/button3"
style="@style/Widget.AppCompat.Button"
android:layout_width="0dp"
android:layout_height="53dp"
android:layout_marginBottom="200dp"
android:layout_marginEnd="27dp"
android:background="@android:drawable/dialog_holo_light_frame"
android:elevation="0dp"
android:fontFamily="sans-serif"
android:lineSpacingExtra="8sp"
android:onClick="metodoEntrar"
android:text="ENTRAR"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Button"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button4"
app:layout_constraintTop_toBottomOf="@+id/textView9"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1" />
<Button
android:id="@+id/button4"
android:layout_width="160dp"
android:layout_height="53dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="27dp"
android:background="@android:drawable/dialog_holo_light_frame"
android:fontFamily="sans-serif"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 71
android:lineSpacingExtra="8sp"
android:onClick="metodoRegistrar"
android:text="REGISTRAR"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold|italic"
app:layout_constraintBaseline_toBaselineOf="@+id/button3"
app:layout_constraintEnd_toStartOf="@+id/button3"
app:layout_constraintStart_toStartOf="parent"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textView9"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="194dp"
android:layout_marginEnd="27dp"
android:layout_marginStart="27dp"
android:layout_marginTop="28dp"
android:fontFamily="cursive"
android:text="No pierdas tu tranquilidad"
android:textAlignment="center"
android:textColor="@android:color/black"
android:textSize="30sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/imageView3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="115dp"
android:layout_height="0dp"
android:layout_marginBottom="167dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9"
app:srcCompat="@drawable/mapointer"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
</android.support.constraint.ConstraintLayout>
Activity Registro RegistroActivity.java
package com.claudia.fiband.activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
72 Claudia Aura Plesa
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Usuario;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class RegistroActivity extends AppCompatActivity implements
IFibandActivity {
static final int REQUEST_IMAGE_CAPTURE = 1;
static final int REQUEST_CODE_REGISTER = 2;
private EditText etNombre, etEmail, etUsuario, etContrasena;
private RoundedImageView imgFoto;
private Bitmap imageBitmap = null;
private String modo;
private ProgressDialog dialog;
private boolean haceFoto = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registro);
imageBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.cameraicon);
//si vengo de una rotacion
if (savedInstanceState != null) {
modo = savedInstanceState.getString("modo");
imageBitmap = (Bitmap)
savedInstanceState.getParcelable("foto");
}
else //si vengo de un intent normal
{
modo = (String) getIntent().getExtras().get("modo");
}
etNombre = (EditText) findViewById(R.id.txtNombre);
etEmail = (EditText) findViewById(R.id.txtEmail);
etUsuario = (EditText) findViewById(R.id.txtUsuario);
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 73
etContrasena = (EditText) findViewById(R.id.txtContrasena);
imgFoto = (RoundedImageView) findViewById(R.id.hacerFoto);
imgFoto.setImageBitmap(imageBitmap);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("modo", modo);
outState.putParcelable("foto",imageBitmap);
super.onSaveInstanceState(outState);
}
@Override
public void onBackPressed() {
Intent resultIntent = new Intent();
setResult(IFibandActivity.RESULT_CODE_NONE, resultIntent);
finish();
}
public void insertar()
{
if(!validarCampos())
return;
String ruta = "";
if(imageBitmap!=null)
ruta = guardarFoto();
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("nombre", etNombre.getText().toString());
jsonParams.put("email", etEmail.getText().toString());
jsonParams.put("usuario", etUsuario.getText().toString());
jsonParams.put("foto", ruta);
jsonParams.put("contrasena",
etContrasena.getText().toString());
dialog = ProgressDialog.show(this, "", "Espere, por favor.",
true);
new JSONRequest(this,
REQUEST_CODE_REGISTER).request(getString(R.string.url_register),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
public void tomarFoto(View v) {
Intent takePictureIntent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) !=
null) {
startActivityForResult(takePictureIntent,
REQUEST_IMAGE_CAPTURE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
74 Claudia Aura Plesa
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode ==
RESULT_OK) {
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
imgFoto.setImageBitmap(imageBitmap);
haceFoto = true;
}
}
private String guardarFoto(){
ContextWrapper cw = new ContextWrapper(getApplicationContext());
// dirección del fichero /data/data/yourapp/app_data/fotos
File directory = cw.getDir("fotos", Context.MODE_PRIVATE);
// Creamos la ruta imageDir
String timeStamp = new
SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + ".jpg";
File mypath=new File(directory,imageFileName);
FileOutputStream fos = null;//objeto que se encarga de crear un
flujo de salida que escribe bytes en un archivo
try {
fos = new FileOutputStream(mypath);
//con el método compress, elegimos formato de compresión,
calidad de la imagen mediante un int y el objeto que hemos creado de la
clase FileOutputStream.
imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (Exception e) {
Util.mensaje(this,"Atención!",e.getMessage());
} finally {
try {
fos.close();
} catch (IOException e) {
Util.mensaje(this,"Atención!",e.getMessage());
}
}
return mypath.getAbsolutePath();//se devuelve la ruta de la imagen
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
if(requestCode==REQUEST_CODE_REGISTER) {
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
//la foto no se guarda en el servidor
Usuario u = Util.obtenerUsuarioJSON(this,data);
Sesion.getInstance().setUsuario(u); //meto el usuario en
la sesion
Intent i = new
Intent(RegistroActivity.this,HomeActivity.class);
startActivity(i);
}
else
{
try {
String texto = data.getString("mensaje");
Util.mensaje(this,"Atención!",texto);
} catch (JSONException e) {
Util.mensaje(this,"Atención!",e.getMessage());
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 75
}
}
}
}
private boolean validarCampos()
{
boolean estado = true;
if(etNombre.getText().toString().isEmpty() ||
etEmail.getText().toString().isEmpty()
|| etUsuario.getText().toString().isEmpty() ||
etContrasena.getText().toString().isEmpty())
{
Util.mensaje(this,"Acción necesaria!","No se pueden dejar
campos de texto vacíos.");
estado = false;
}
else if(etNombre.getText().toString().isEmpty() ||
etEmail.getText().toString().isEmpty()
|| etUsuario.getText().toString().isEmpty() ||
etContrasena.getText().toString().isEmpty())
{
Util.mensaje(this,"Acción necesaria!","No se pueden dejar
campos de texto vacíos.");
estado = false;
}
else if(etNombre.getText().toString().length() > 255 ||
etEmail.getText().toString().length() > 255
|| etUsuario.getText().toString().length() > 255 ||
etContrasena.getText().toString().length() > 255)
{
Util.mensaje(this,"Error!","La longitude de los campos ha de
ser inferior a 255 caracteres");
estado = false;
}
return estado;
}
public void confirmacionRegistro(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Solicitud de consentimiento");
String mensaje = "Al registrate, aceptas:\n" +
"\nNuestros Términos de Servicio:\n" + "Los siguientes
términos y condiciones rigen el uso de la aplicación Fiband. Dicha
aplicación está sujeta a su aceptación sin modificación de los términos y
condiciones aquí contenidos, además de las reglas y políticas operativas
(incluidas, entre otras, las Políticas de privacidad de Fiband).\n" +
" Lea este Acuerdo detenidamente antes de acceder o
usar la Aplicación. Al acceder o utilizar Fiband, usted acepta estar
sujeto a los términos y condiciones de este acuerdo. Si no acepta todos
los términos y condiciones de este acuerdo, entonces no podrá acceder ni
usar Fiband.\n" +
" 1. Uso de nuestro servicio: Fiband es una
aplicación de ubicación y comunicación gratuita para teléfonos
inteligentes. Con Fiband, puede ver a toda su familia en un mapa privado,
mantenerse en contacto las 24 horas, todos los días, y proteger a sus
seres queridos de cualquier daño.\n" +
" Puede usar el Servicio solo si puede establecer
un contrato vinculante con Fiband, y solo de conformidad con este Acuerdo
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
76 Claudia Aura Plesa
y todas las leyes, normas y reglamentaciones locales, estatales,
nacionales e internacionales aplicables. Cualquier persona menor de 13
años tiene estrictamente prohibido crear una cuenta para el Servicio.
Además, cualquier persona menor de 13 años solo puede aceptar invitaciones
de padres / tutores legales para unirse a su cuenta.\n" +
" 2. Su cuenta Fiband: Si crea una cuenta de
Fiband, usted es responsable de mantener la seguridad de su cuenta, y
usted es totalmente responsable de todas las actividades que ocurran en la
cuenta y de cualquier otra acción que se tome en relación con la cuenta.
Debe notificar inmediatamente a Fiband sobre cualquier uso no autorizado
de su cuenta o cualquier otra violación de la seguridad. Fiband no será
responsable de ningún acto u omisión por su parte, incluidos los daños y
perjuicios de cualquier tipo incurridos como resultado de dichos actos u
omisiones.\n" +
" 3. Responsabilidad de los contribuyentes: Si crea
o envía contenido de cualquier tipo (Contenido), o permite que un tercero
cree o envíe Contenido, usted es totalmente responsable del contenido y de
cualquier daño resultante de ese contenido. Ese es el caso
independientemente de si el Contenido en cuestión constituye texto,
gráficos, datos de ubicación o un registro de voz tomado de un monitor de
bebé. Al enviar Contenido, usted declara y garantiza que: la descarga,
copia y uso del Contenido no violará los derechos de propiedad, incluidos,
entre otros, los derechos de autor, patentes, marcas comerciales o
secretos comerciales de terceros;\n" +
" si su empleador tiene derechos de propiedad
intelectual que usted crea, usted (i) ha recibido permiso de su empleador
para publicar o poner a disposición el Contenido, incluidos, entre otros,
cualquier software, o (ii) obtener una exención de su empleador todos los
derechos en o hacia el Contenido; usted ha cumplido totalmente con las
licencias de terceros relacionadas con el Contenido, y ha hecho todo lo
necesario para transmitir con éxito a los usuarios finales los términos
requeridos; el Contenido no es pornográfico, no contiene amenazas ni
incita a la violencia hacia individuos o entidades, y no viola los
derechos de privacidad o publicidad de ningún tercero.\n" +
" 4. Presentación de contenido: Al enviar Contenido
a Fiband para su inclusión en la aplicación, otorga a Fiband una licencia
mundial, libre de regalías y no exclusiva para reproducir, modificar,
adaptar y publicar el Contenido con el único fin de mostrarlo en la cuenta
con la que usted vinculó la pulsera. Si elimina el Contenido, Fiband hará
todos los esfuerzos razonables para eliminarlo de la base de datos, pero
usted acepta que el almacenamiento en caché o las referencias al Contenido
no pueden eliminarse inmediatamente.\n" +
" Sin limitar ninguna de esas representaciones o
garantías, Fiband tiene el derecho (aunque no la obligación) de, a
exclusiva discreción de Fiband (i) rechazar o eliminar cualquier contenido
que, en la opinión razonable de Fiband, viole cualquier política de Fiband
o sea perjudicial en modo alguno, o (ii) dar por terminado o denegar el
acceso y el uso de la aplicación a cualquier individuo o entidad por
cualquier motivo, a exclusivo criterio de Fiband. Fiband no tendrá la
obligación de proporcionar un reembolso de los montos pagados
previamente.\n" +
" 5. Responsabilidad de los usuarios de la
aplicación: Fiband no ha revisado, y no puede revisar, el Contenido
enviado a la aplicación, y no puede ser responsable por el contenido, uso
o efectos de ese Contenido. Al operar la aplicación, Fiband no representa
ni implica que respalda el material allí publicado, o que considera que
dicho material es preciso, útil o no dañino. La aplicación puede contener
contenido ofensivo, indecente u objetable, así como contenido que contenga
inexactitudes técnicas, errores tipográficos y otros errores. La
aplicación también puede contener material que viole los derechos de
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 77
privacidad o publicidad, o infrinja la propiedad intelectual y otros
derechos de propiedad de terceros, o cuya descarga, copia o uso esté
sujeto a términos y condiciones adicionales, establecidos o no. Fiband
declina toda responsabilidad por cualquier daño que resulte del uso por
parte de los usuarios de la aplicación, o de cualquier descarga por parte
de los usuarios del contenido allí publicado.\n" +
" 6. Contenido publicado en otros sitios web: No
hemos revisado, y no podemos revisar, todo el material disponible a través
de los sitios web y páginas web a los que se conecta y que se vincula la
aplicación. Fiband no tiene ningún control sobre esos sitios web, y no es
responsable de sus contenidos o su uso. Al vincular a dicho sitio web o
página web, Fiband no representa ni implica que respalda dicho sitio web o
página web. Fiband declina cualquier responsabilidad por cualquier daño
que resulte de su uso de estos sitios web y páginas web.\n" +
" 7. Propiedad intelectual: Este Acuerdo no
transfiere de Fiband a usted ninguna propiedad intelectual de Fiband o de
terceros, y todos los derechos, títulos e intereses sobre dichos bienes
permanecerán (entre las partes) exclusivamente con Fiband. Otras marcas
comerciales, marcas de servicio, gráficos y logotipos utilizados en
relación con la aplicación pueden ser marcas comerciales de otros
terceros.\n" +
" 8. Anuncios: Fiband se reserva el derecho de
mostrar anuncios en las Aplicaciones.\n" +
" 9. Cambios: Fiband se reserva el derecho, a su
entera discreción, de modificar o reemplazar cualquier parte de este
Acuerdo. Es su responsabilidad verificar este Acuerdo periódicamente para
ver los cambios. El uso continuado o el acceso a la aplicación después de
la publicación de cualquier cambio en este Acuerdo constituye la
aceptación de dichos cambios. Fiband también puede, en el futuro, ofrecer
nuevos servicios y / o características a través de las Aplicaciones
(incluido el lanzamiento de nuevas herramientas y recursos). Tales nuevas
características y / o servicios estarán sujetos a los términos y
condiciones de este Acuerdo.\n" +
" 10. Terminación: Fiband puede rescindir su acceso
a la totalidad o parte de la aplicación en cualquier momento, con o sin
causa, con o sin aviso, con efecto inmediato. Si desea rescindir este
Acuerdo, simplemente puede dejar de usar la aplicación, o puede solicitar
la eliminación de la cuenta enviando un correo electrónico a
[email protected]. Todas las disposiciones de este Acuerdo que por
su naturaleza deben seguir vigentes después de la terminación seguirán
vigentes después de la terminación, incluidas, entre otras, las
disposiciones de propiedad, los descargos de garantía, la indemnización y
las limitaciones de responsabilidad.\n" +
" 11. Descargo de garantías: Las aplicaciones se
proporcionan tal cual. Fiband y sus proveedores y licenciantes renuncian a
todas las garantías de cualquier tipo, expresas o implícitas, incluidas,
entre otras, las garantías de comerciabilidad, idoneidad para un propósito
particular y no infracción. Ni Fiband ni sus proveedores y licenciantes
hacen ninguna garantía de que las Aplicaciones estén libres de errores o
que el acceso a ellas sea continuo o ininterrumpido. Usted comprende que
descarga de, u obtiene contenido o servicios a través de, las Aplicaciones
bajo su propio criterio y riesgo.\n" +
" 12. Limitación de responsabilidad: En ningún caso
Fiband, o sus proveedores o licenciantes, serán responsables con respecto
a cualquier tema de este acuerdo bajo ningún contrato, negligencia,
responsabilidad estricta u otra teoría legal o equitativa para: (i)
cualquier daño especial, incidental o consecuente; (ii) el costo de
adquisición de productos o servicios sustitutos; (iii) por interrupción de
uso o pérdida o corrupción de datos. Fiband no tendrá responsabilidad por
cualquier falla o retraso debido a asuntos fuera de su control razonable.
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
78 Claudia Aura Plesa
Lo anterior no se aplicará en la medida en que lo prohíba la ley
aplicable.\n" +
" 13. Representación general y garantía: Usted
declara y garantiza que (i) su uso de la aplicación estará estrictamente
de acuerdo con la Política de privacidad de Fiband, con este Acuerdo y con
todas las leyes y regulaciones aplicables (incluidas, entre otras, las
leyes o reglamentaciones locales de su país, estado, ciudad, u otra área
gubernamental, con respecto a la conducta en línea y contenido aceptable,
e incluyendo todas las leyes aplicables con respecto a la transmisión de
datos técnicos exportados del país en el que usted reside) y (ii) su uso
de la aplicación no infringirá o mal apropiará los derechos de propiedad
intelectual de cualquier tercero.\n" +
" 14. Indemnización: Usted acepta indemnizar y
eximir de responsabilidad a Fiband, sus contratistas y sus licenciantes, y
sus respectivos directores, funcionarios, empleados y agentes de y contra
todos los reclamos y gastos, incluidos los honorarios de abogados, que
surjan de su uso de la aplicación, incluyendo pero no limitado a su
violación de este Acuerdo.\n" +
" 15. Varios: Este Acuerdo constituye el acuerdo
completo entre Fiband y usted con respecto al tema del presente documento,
y solo se puede modificar mediante una enmienda escrita firmada por un
ejecutivo autorizado de Fiband, o mediante la publicación por parte de
Fiband de una versión revisada. Excepto en la medida en que la ley
aplicable, de existir alguna, establezca lo contrario, este Acuerdo,
cualquier acceso o uso de la aplicación se regirá por las leyes de España,
excluyendo las disposiciones sobre conflictos de leyes y el lugar adecuado
para cualquier disputa que surja.. Excepto por reclamos por desagravio por
mandato judicial o equitativo o reclamaciones con respecto a derechos de
propiedad intelectual (que pueden presentarse en cualquier tribunal
competente sin la publicación de un bono), cualquier disputa que surja en
virtud de este Acuerdo se resolverá finalmente de conformidad con las
reglas de arbitraje. El arbitraje se llevará a cabo en Madrid, España, en
idioma español y la decisión arbitral podrá ser ejecutada en cualquier
tribunal. La parte que prevalezca en cualquier acción o procedimiento para
hacer cumplir este Acuerdo tendrá derecho a los costos y honorarios de
abogados. Si alguna parte de este Acuerdo se considera inválida o no
exigible, se interpretará que esa parte refleja la intención original de
las partes, y las partes restantes permanecerán en pleno vigor y efecto.
Una renuncia por cualquiera de las partes de cualquier término o condición
de este Acuerdo o cualquier incumplimiento del mismo, en cualquier
instancia, no renunciará a dicho término o condición o cualquier
incumplimiento posterior de los mismos. Puede ceder sus derechos bajo este
Acuerdo a cualquier parte que consienta y acuerde estar sujeto a sus
términos y condiciones; Fiband puede asignar sus derechos bajo este
Acuerdo sin condición. Este Acuerdo será vinculante y redundará en
beneficio de las partes, sus sucesores y cesionarios permitidos.\n" +
" 16. Responsabilidad de las partes: Usted es el
único responsable de su interacción con otros usuarios de la aplicación
Fiband. Usted acepta que Fiband no es responsable del comportamiento de
ningún usuario ni del uso de ninguna función de la aplicación. Confíe en
el sentido común y la razón cuando interactúa con otras personas, incluso
cuando utiliza información personal u otra información.\n" +
" 17. Contacto: Contáctenos en
[email protected] si tiene alguna pregunta sobre este Acuerdo.\n" +
"\nNuestra Política de Privacidad:\n" + "Su privacidad es
de importancia crítica para nosotros. Nuestra política de privacidad
explicará cómo la información y los datos de Fiband se recopilan, utilizan
y divulgan. Si tiene preguntas o quejas sobre nuestra política o prácticas
de privacidad, contáctenos a [email protected]. Nuestra política de
privacidad puede ser modificada de vez en cuando. Le avisaremos que se han
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 79
realizado cambios al indicar en nuestra política de privacidad la fecha de
su última actualización. Si hacemos algún cambio importante, le
notificaremos por correo electrónico o por medio de un aviso en este sitio
web antes de que el cambio entre en vigencia. Le recomendamos que revise
periódicamente esta página para obtener la información más reciente sobre
nuestras prácticas de privacidad.\n" +
"1. ¿Qué es información personal?\n" +
"La \"información personal\" es información de
identificación personal como su nombre, número de teléfono,
geolocalización y cualquier otra información no pública sobre usted que
esté asociada o vinculada a la información anterior. Nuestra política de
privacidad no restringe ni limita nuestra recopilación y uso de
información agregada.\n" +
"2. ¿Qué información personal recopila Fiband?\n" +
" - Información de registro y perfil. Cuando crea una
cuenta, podemos recopilar su información personal, como su nombre, nombre
de usuario, número de teléfono móvil, una foto si elige tener una foto
asociada a su cuenta, un email y una contraseña. Si desea agregar el
nombre de un niño o un miembro de su familia a su cuenta, recogemos el
nombre y el número de teléfono móvil del niño o familiar.\n" +
" - Geolocalización. Recopilamos su identificador de
usuario único y su ubicación a través de GPS, WiFi o triangulación de red
inalámbrica para obtener su ubicación con el fin de proporcionar nuestro
Servicio. Recopilamos la ubicación de las Alertas de ubicación designadas
para proporcionar notificaciones cuando llegan y salen de un Lugar
especial.\n" +
" - Mensajes y contenido del usuario. Recopilamos
información cuando envía mensajes a otros miembros de su familia mediante
el uso del servicio. También podemos retener cualquier mensaje que nos
envíe.\n" +
"Información recopilada automáticamente mediante el uso de
la tecnología: cuando utiliza nuestra aplicación móvil, nosotros y
nuestros socios comerciales podemos recopilar cierta información sobre su
dispositivo a través de tecnología como cookies, balizas web, archivos de
registro u otro seguimiento / herramientas de grabación. La información
que recopilamos mediante el uso de tecnologías de seguimiento incluye,
entre otras, direcciones IP, la aplicación móvil o el servicio, nombres de
dominio, páginas de destino, vistas de página, datos de cookies que nos
permiten identificar de manera única su navegador, comportamiento de
navegación en nuestro sitio, tipo de dispositivo móvil, ID de dispositivos
móviles u otros identificadores persistentes, y datos de ubicación
recopilados desde su dispositivo móvil. Algunos o todos estos datos pueden
combinarse con otra información de identificación personal descrita
anteriormente. Utilizamos esta información para: Recordar información para
que no tenga que volver a ingresarla durante su visita o la próxima vez
que visite el sitio o la aplicación móvil; Proporcionar contenido
personalizado e información personalizada; Monitorear la efectividad de
nuestro Servicio y nuestras campañas de mercadeo; Supervise las métricas
agregadas, como la cantidad total de visitantes, usuarios, tráfico y
patrones demográficos; Diagnosticar o solucionar problemas de tecnología
informados por nuestros Usuarios o ingenieros que están asociados con
ciertas direcciones IP o ID de usuario; Actualice automáticamente nuestra
aplicación móvil en su sistema y dispositivos relacionados.\n" +
"3. ¿Cómo Fiband usa la información personal?\n" +
"Generalmente, Fiband recopila, almacena, usa y divulga
información para permitirnos:\n" +
" - proporcionar el servicio Fiband;\n" +
" - Crea tu cuenta;\n" +
" - identificarlo como usuario;\n" +
" - responder a sus consultas y correos electrónicos;\n"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
80 Claudia Aura Plesa
+ " - mejorar la aplicación.\n" +
"Actualmente, todas sus notificaciones, mensajes y
ubicación aproximada se guardan en la nube. Encriptaremos y eliminaremos
los informes de ubicación en futuras versiones.\n" +
"A excepción de lo establecido en esta Política de
Privacidad, su Información personal no será utilizada para ningún otro
propósito sin informarlo primero mediante la actualización de esta
Política de Privacidad. No vendemos listas de clientes ni ninguna
información personal a terceros. Las estadísticas agregadas anónimas que
no identifican personalmente al usuario de Fiband serán guardadas y
utilizadas por nosotros para diversos fines, incluido el análisis y la
generación de informes de patrones de uso.\n" +
"4. Seguridad: Sus datos personales están almacenados y
protegidos por Google Inc. Para más información, lea la Política de
privacidad de Google\n" +
"5. Acceso y elección del usuario: Si su información
personal cambia, o si ya no desea nuestro servicio, puede enviarnos un
correo electrónico a [email protected] para desactivar su cuenta.
También puede corregir, actualizar o modificar su información personal en
la configuración de su perfil dentro de la aplicación Fiband o enviándonos
un correo electrónico. La eliminación de Fiband de su dispositivo móvil no
eliminará la información personal retenida sobre usted. Si deja la
familia, retendremos su contenido de usuario en caso de que desee acceder
en el futuro. Su contenido de usuario puede eliminarse permanentemente
enviando una solicitud por correo electrónico a
[email protected].\n" +
"6. Responsabilidad de las partes:Usted es el único
responsable de su interacción con otros usuarios de la aplicación Fiband.
Usted acepta que Fiband no es responsable del comportamiento de ningún
usuario ni del uso de ninguna función de la aplicación. Confíe en el
sentido común y la razón cuando interactúa con otras personas, incluso
cuando utiliza información personal u otra información.\n" +
"7. ¿Preguntas?\n" +
"Póngase en contacto con nosotros en
[email protected] si tiene alguna pregunta sobre nuestra política de
privacidad. \nGracias.\n";
builder.setMessage(mensaje);
builder.setPositiveButton("ACEPTO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
insertar();
}
});
builder.setNegativeButton("NO ACEPTO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
}
activity_registro.xml <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 81
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fondopaisaje"
tools:context="com.claudia.fiband.activity.RegistroActivity"
tools:layout_editor_absoluteY="81dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="47dp"
android:layout_marginStart="36dp"
android:fontFamily="serif"
android:text="Nombre:"
android:textAlignment="textStart"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBaseline_toBaselineOf="@+id/txtNombre"
app:layout_constraintEnd_toStartOf="@+id/txtNombre"
app:layout_constraintStart_toStartOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:layout_marginEnd="69dp"
android:layout_marginStart="36dp"
android:fontFamily="serif"
android:text="eMail:"
android:textAlignment="textStart"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/textView3"
app:layout_constraintEnd_toStartOf="@+id/txtEmail"
app:layout_constraintStart_toStartOf="parent"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:layout_marginEnd="46dp"
android:layout_marginStart="36dp"
android:fontFamily="serif"
android:text="Usuario:"
android:textAlignment="textStart"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/textView4"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
82 Claudia Aura Plesa
app:layout_constraintEnd_toStartOf="@+id/txtUsuario"
app:layout_constraintStart_toStartOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="7dp"
android:layout_marginEnd="2dp"
android:layout_marginStart="2dp"
android:fontFamily="serif"
android:text="Contraseña:"
android:textAlignment="textStart"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toBottomOf="@+id/txtContrasena"
app:layout_constraintEnd_toStartOf="@+id/txtContrasena"
app:layout_constraintHorizontal_bias="0.43"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
tools:layout_constraintBaseline_creator="1"
tools:layout_constraintLeft_creator="1" />
<Button
android:id="@+id/btnInsertar"
android:layout_width="114dp"
android:layout_height="43dp"
android:layout_marginBottom="180dp"
android:background="@android:drawable/editbox_dropdown_light_frame"
android:fontFamily="sans-serif"
android:onClick="confirmacionRegistro"
android:text="Insertar"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtContrasena"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1" />
<EditText
android:id="@+id/txtNombre"
android:layout_width="211dp"
android:layout_height="44dp"
android:layout_marginEnd="38dp"
android:background="@android:drawable/editbox_background_normal"
android:ems="10"
android:inputType="textPersonName"
android:textColorHighlight="@color/colorAccent"
app:layout_constraintBottom_toTopOf="@+id/txtEmail"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 83
app:layout_constraintTop_toBottomOf="@+id/hacerFoto"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<EditText
android:id="@+id/txtEmail"
android:layout_width="211dp"
android:layout_height="44dp"
android:layout_marginEnd="38dp"
android:background="@android:drawable/editbox_background_normal"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/txtUsuario"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView2"
app:layout_constraintTop_toBottomOf="@+id/txtNombre"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<EditText
android:id="@+id/txtUsuario"
android:layout_width="211dp"
android:layout_height="44dp"
android:layout_marginBottom="150dp"
android:layout_marginEnd="36dp"
android:layout_marginTop="245dp"
android:background="@android:drawable/editbox_background_normal"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/btnEliminar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView3"
app:layout_constraintTop_toTopOf="parent"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<EditText
android:id="@+id/txtContrasena"
android:layout_width="211dp"
android:layout_height="44dp"
android:layout_marginBottom="24dp"
android:background="@android:drawable/editbox_background_normal"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/btnInsertar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textView4"
app:layout_constraintTop_toBottomOf="@+id/txtUsuario"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<com.claudia.fiband.activity.RoundedImageView
android:id="@+id/hacerFoto"
android:layout_width="67dp"
android:layout_height="67dp"
android:layout_marginBottom="35dp"
android:layout_marginTop="40dp"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
84 Claudia Aura Plesa
android:adjustViewBounds="true"
android:cropToPadding="false"
android:onClick="tomarFoto"
app:layout_constraintBottom_toTopOf="@+id/txtNombre"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.32999998"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1" />
</android.support.constraint.ConstraintLayout>
Activity Login LoginActivity.java
package com.claudia.fiband.activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.EditText;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Usuario;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity implements
IFibandActivity{
static final int REQUEST_CODE_LOGIN = 1;
static final int REQUEST_CODE_PASSWORD = 2;
private EditText etUsuario, etContrasenia;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etUsuario = (EditText) findViewById(R.id.Usuario);
etContrasenia = (EditText) findViewById(R.id.Contrasenia);
}
public void metodoIniciarSesion(View v){
try {
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("usuario", etUsuario.getText().toString());
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 85
jsonParams.put("contrasena", etContrasenia.getText().toString());
dialog = ProgressDialog.show(this, "", "Espere por favor", true);
new JSONRequest(this,
REQUEST_CODE_LOGIN).request(getString(R.string.url_login),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(LoginActivity.this,"Error en peticion
JSON",e.getMessage());
}
}
public void mostrarDialogEmail(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Introduce email");
// Crear el control de entrada
final EditText input = new EditText(this);
// Especificar de qué tipo es el control de entrada
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
//Botones de 'Aceptar' o 'Cancelar'
builder.setPositiveButton("Aceptar", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String destino = input.getText().toString();
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("email", destino);
LoginActivity.this.dialog =
ProgressDialog.show(LoginActivity.this, "", "Solicitando password...", true);
new JSONRequest(LoginActivity.this,
REQUEST_CODE_PASSWORD).request(getString(R.string.url_getpassword),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(LoginActivity.this,"Error en peticion
JSON",e.getMessage());
}
}
});
builder.setNegativeButton("Cancelar", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject data)
{
dialog.dismiss();
if(requestCode==REQUEST_CODE_LOGIN)
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
86 Claudia Aura Plesa
{
if(resultCode==IFibandActivity.RESULT_CODE_OK)
{
Usuario u = Util.obtenerUsuarioJSON(this,data);
Sesion.getInstance().setUsuario(u); //meto el usuario en la
sesion
Intent i = new Intent(LoginActivity.this,HomeActivity.class);
startActivity(i);
}
else
{
Util.mensaje(this,"Atencion!","Datos de acceso incorrectos");
}
}
else if(requestCode==REQUEST_CODE_PASSWORD)
{
if(resultCode==IFibandActivity.RESULT_CODE_OK)
{
String texto = "Error genera en el servidor";
try {
texto = data.getString("mensaje");
} catch (JSONException e) {
}
Util.mensaje(this,"Informacion",texto);
}
else
{
String texto = "Error al recuperar password";
try {
texto = data.getString("mensaje");
} catch (JSONException e) {
}
Util.mensaje(this,"Atencion!",texto);
}
}
}
}
activity_login.xml <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fondopaisaje"
tools:context="com.claudia.fiband.activity.LoginActivity">
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Usuario:"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="normal|bold|italic"
android:typeface="serif"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 87
app:layout_constraintBottom_toTopOf="@+id/Usuario"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1" />
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Contraseña:"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
android:typeface="serif"
app:layout_constraintBottom_toTopOf="@+id/Contrasenia"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1" />
<EditText
android:id="@+id/Usuario"
android:layout_width="207dp"
android:layout_height="0dp"
android:ems="10"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="@+id/imageView2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/imageView2"
app:layout_constraintVertical_bias="1.0"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<EditText
android:id="@+id/Contrasenia"
android:layout_width="212dp"
android:layout_height="44dp"
android:layout_marginBottom="103dp"
android:layout_marginTop="104dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintBottom_toBottomOf="@+id/IniciarSesion"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/imageView2"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<Button
android:id="@+id/IniciarSesion"
android:layout_width="107dp"
android:layout_height="61dp"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
88 Claudia Aura Plesa
android:background="@android:drawable/dialog_holo_light_frame"
android:fontFamily="sans-serif"
android:onClick="metodoIniciarSesion"
android:text="Aceptar"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@+id/Contrasenia"
app:layout_constraintRight_toRightOf="@+id/textView10"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.498"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:fontFamily="sans-serif"
android:onClick="mostrarDialogEmail"
android:text="@string/olvidar"
android:textAlignment="center"
android:textAllCaps="false"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/IniciarSesion"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="47dp"
android:layout_height="52dp"
android:layout_marginTop="56dp"
app:layout_constraintRight_toLeftOf="@+id/Usuario"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_person_black_48dp"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1" />
<ImageView
android:id="@+id/imageView4"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="3dp"
app:layout_constraintBottom_toBottomOf="@+id/Contrasenia"
app:layout_constraintLeft_toLeftOf="@+id/imageView2"
app:layout_constraintRight_toLeftOf="@+id/Contrasenia"
app:layout_constraintTop_toTopOf="@+id/Contrasenia"
app:srcCompat="@drawable/ic_lock_black_48dp"
tools:layout_constraintBottom_creator="1"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 89
tools:layout_constraintTop_creator="1" />
</android.support.constraint.ConstraintLayout>
II. Código implementado en la Versión 1
Pulsera.java package com.claudia.fiband.modelo;
import com.google.android.gms.maps.model.LatLng;
import java.io.Serializable;
/**
* Created by Claudia Plesa.
*/
public class Pulsera implements Serializable {
private int id;
private String nombre;
private String telefono;
private String color;
private int usuarioId;
private LatLng ubicacion;
private int gradosDireccion;
public Pulsera(int id, String nombre, String telefono, String color,
int usuarioId) {
this.id = id;
this.nombre = nombre;
this.telefono = telefono;
this.color = color;
this.usuarioId = usuarioId;
this.ubicacion = null;
this.gradosDireccion = -1;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getTelefono() {
return telefono;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
90 Claudia Aura Plesa
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getUsuarioId() {
return usuarioId;
}
public void setUsuarioId(int usuarioId) {
this.usuarioId = usuarioId;
}
public LatLng getUbicacion() {
return ubicacion;
}
public void setUbicacion(LatLng ubicacion) {
this.ubicacion = ubicacion;
}
public int getGradosDireccion() {
return gradosDireccion;
}
public void setGradosDireccion(int gradosDireccion) {
this.gradosDireccion = gradosDireccion;
}
}
PulseraAdapter.java package com.claudia.fiband.adaptador;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Pulsera;
import java.util.List;
/**
* Created by Claudia Plesa.
*/
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 91
public class PulseraAdapter extends ArrayAdapter<Pulsera> {
public PulseraAdapter(Context context, int resource, List<Pulsera>
objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater Inflater = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = convertView;
if (view == null) {
view = Inflater.inflate(R.layout.item_lista_pulseras, parent,
false);
}
Pulsera pulsera = getItem(position);
TextView tvNombre = (TextView)view.findViewById(R.id.txtNombre);
LinearLayout ll =
(LinearLayout)view.findViewById(R.id.layoutColor);
tvNombre.setText(pulsera.getNombre());
ll.setBackgroundColor(Color.parseColor(pulsera.getColor()));
return view;
}
}
ítem_lista_pulseras.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="50dp" android:weightSum="1">
<LinearLayout
android:id="@+id/layoutColor"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="0.05"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="0.95"
android:orientation="vertical">
<TextView
android:id="@+id/txtNombre"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="0.5"
android:gravity="left|center_vertical"
android:paddingLeft="5dp"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
92 Claudia Aura Plesa
android:text="Texto"/>
</LinearLayout>
</LinearLayout>
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/opc_ver_pulseras"
android:title="Ver mis pulseras"
app:showAsAction="never" />
<item
android:id="@+id/opc_config_cuenta"
android:title="Configurar Cuenta"
app:showAsAction="never" />
<item
android:id="@+id/opc_sobre_nosotros"
android:title="Sobre Nosotros"
app:showAsAction="never" />
<item
android:id="@+id/opc_salir_cuenta"
android:title="Cerrar Sesión"
app:showAsAction="never" />
</menu>
Activity Home
HomeActivity.java package com.claudia.fiband.activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.claudia.fiband.R;
import com.claudia.fiband.adaptador.PulseraAdapter;
import com.claudia.fiband.modelo.Pulsera;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 93
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Usuario;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HomeActivity extends AppCompatActivity implements
IFibandActivity {
static final int REQUEST_CODE_GETPULSERAS = 1;
static final int REQUEST_CODE_INSERTAR_PULSERA = 2;
private TextView tvNombre, tvUsuario, tvEmail;
private RoundedImageView imgFoto;
private ImageView btnAnadir;
private Usuario usuario;
private ListView listaPulseras;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(getIntent().getExtras() != null &&
getIntent().getExtras().getBoolean("CloseApp", false)) {
finish();
return;
}
setContentView(R.layout.activity_home);
usuario = Sesion.getInstance().getUsuario();
tvNombre = (TextView) findViewById(R.id.tvNombre);
tvUsuario = (TextView) findViewById(R.id.tvUsuario);
tvEmail = (TextView) findViewById(R.id.tvEmail);
btnAnadir = (ImageView) findViewById(R.id.btnAnadir);
imgFoto = (RoundedImageView) findViewById(R.id.imgFoto);
listaPulseras = (ListView) findViewById(R.id.listaPulseras);
actualizarDatosUsuario();
actualizarPulserasUsuario();
}
public void actualizarDatosUsuario() {
this.usuario = Sesion.getInstance().getUsuario();
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.perfil);
imgFoto.setImageBitmap(icon);
tvNombre.setText(usuario.getNombre());
tvUsuario.setText(usuario.getUsuario());
tvEmail.setText(usuario.getEmail());
if(!usuario.getFoto().equals("")) {
File mypath = new File(usuario.getFoto());
if(mypath.exists()) { //si existe el fichero en este telefono
try {
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
94 Claudia Aura Plesa
BitmapFactory.Options options = new
BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap =
BitmapFactory.decodeFile(mypath.getAbsolutePath());
imgFoto.setImageBitmap(bitmap);
} catch (Exception e) {
Log.d("XXX", "Error: " + e.getMessage());
}
}
}
}
public void actualizarPulserasUsuario()
{
this.usuario = Sesion.getInstance().getUsuario();
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("token", usuario.getToken());
jsonParams.put("usuario_id", String.valueOf(usuario.getId()));
dialog = ProgressDialog.show(this, "", "Espere por favor",
true);
new JSONRequest(this,
REQUEST_CODE_GETPULSERAS).request(getString(R.string.url_getpulseras),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atención!",e.getMessage());
}
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Selecciona");
menu.add(0, v.getId(), 0, "Editar");
menu.add(0, v.getId(), 0, "Eliminar");
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.opc_ver_pulseras:
{
Intent i = new Intent(this, MapaPulserasActivity.class);
startActivity(i);
break;
}
case R.id.opc_config_cuenta:
{
//Versión 2
break;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 95
}
case R.id.opc_sobre_nosotros:
{
//Versión 3
break;
}
case R.id.opc_salir_cuenta:
{
//Versión 3
break;
}
}
return true;
}
public void anadirPulsera(View v)
{
Intent i = new Intent(this,PulseraActivity.class);
i.putExtra("modo","nuevo");
startActivityForResult(i,REQUEST_CODE_INSERTAR_PULSERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if(requestCode==REQUEST_CODE_INSERTAR_PULSERA)
{
if(resultCode==IFibandActivity.RESULT_CODE_OK) {
Util.mensaje(this, "Confirmacion",
data.getStringExtra("mensaje"));
actualizarPulserasUsuario();
}
else if (resultCode==IFibandActivity.RESULT_CODE_ERR)
{
Util.mensaje(this, "Error",
data.getStringExtra("mensaje"));
}
}
}
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirmación");
builder.setMessage("Desea salir de Fiband?");
builder.setPositiveButton("SI",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
Intent intent = new Intent(HomeActivity.this,
HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("CloseApp", true);
startActivity(intent);
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
96 Claudia Aura Plesa
});
builder.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
if(requestCode==REQUEST_CODE_GETPULSERAS) {
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
List<Pulsera> pulseras =
Util.obtenerListaPulserasJSON(this, data);
PulseraAdapter adapter = new
PulseraAdapter(HomeActivity.this, R.layout.item_lista_pulseras, pulseras);
listaPulseras.setAdapter(adapter);
registerForContextMenu(listaPulseras); //para menu
contextual
}
else
{
try {
String texto = "Error general del servidor";
if(data!=null) {
JSONObject mensaje =
data.getJSONObject("mensaje");
texto = mensaje.getString("mensaje");
}
Util.mensaje(this,"Atencion!",texto);
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
}
}
}
activity_home.xml <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/fondopaisaje"
android:weightSum="100">
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="30"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:orientation="horizontal"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 97
android:weightSum="100">
<LinearLayout
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_gravity="center|center_horizontal"
android:layout_weight="28"
android:gravity="center"
android:orientation="vertical"
android:weightSum="100">
<com.claudia.fiband.activity.RoundedImageView
android:id="@+id/imgFoto"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_gravity="center|center_vertical"
android:adjustViewBounds="true"
android:cropToPadding="false"
android:gravity="center|center_horizontal" />
</LinearLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_weight="72"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:layout_weight="34"
android:gravity="bottom|left"
android:orientation="horizontal"
android:weightSum="100">
<TextView
android:id="@+id/textView12"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="40"
android:fontFamily="cursive"
android:gravity="center|center_vertical"
android:text="Tus Datos:"
android:textAlignment="center"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="24sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="22"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
98 Claudia Aura Plesa
android:orientation="horizontal"
android:weightSum="100">
<LinearLayout
android:layout_width="0dip"
android:layout_weight="28"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/textView7"
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:fontFamily="serif"
android:text="Usuario:"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="14sp"
android:textStyle="bold"
android:gravity="left|center_vertical" />
</LinearLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_weight="72"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/tvUsuario"
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:text="TextView"
android:gravity="left|center_vertical"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="22"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:orientation="horizontal"
android:weightSum="100">
<LinearLayout
android:layout_width="0dip"
android:layout_weight="28"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/textView8"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 99
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:fontFamily="serif"
android:text="Nombre:"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="14sp"
android:textStyle="bold"
android:gravity="left|center_vertical" />
</LinearLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_weight="72"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/tvNombre"
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:text="TextView"
android:gravity="left|center_vertical"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="22"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:orientation="horizontal"
android:weightSum="100">
<LinearLayout
android:layout_width="0dip"
android:layout_weight="28"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/textView11"
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:fontFamily="serif"
android:text="Email:"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="14sp"
android:textStyle="bold"
android:gravity="left|center_vertical" />
</LinearLayout>
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
100 Claudia Aura Plesa
<LinearLayout
android:layout_width="0dip"
android:layout_weight="72"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center|center_horizontal"
android:weightSum="100">
<TextView
android:id="@+id/tvEmail"
android:layout_width="match_parent"
android:layout_weight="40"
android:layout_height="match_parent"
android:text="TextView"
android:gravity="left|center_vertical"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:layout_weight="10"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:weightSum="100">
<TextView
android:id="@+id/textView14"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="40"
android:fontFamily="cursive"
android:gravity="center|center_vertical"
android:text="Tus Pulseras:"
android:textAlignment="center"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="24sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_gravity="center|center_horizontal"
android:layout_weight="46"
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal"
android:weightSum="100">
<ListView
android:id="@+id/listaPulseras"
android:layout_width="0dip"
android:layout_height="match_parent"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 101
android:layout_weight="80" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="14"
android:gravity="center_vertical|end"
android:weightSum="100">
<ImageView
android:id="@+id/btnAnadir"
android:layout_width="60dp"
android:layout_height="51dp"
android:layout_weight="10"
android:onClick="anadirPulsera"
app:srcCompat="@drawable/iconaniadirpulserazul" />
</LinearLayout>
</LinearLayout>
Activity Pulsera
PulseraActivity.java package com.claudia.fiband.activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Pulsera;
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import eltos.simpledialogfragment.SimpleDialog;
import eltos.simpledialogfragment.color.SimpleColorDialog;
public class PulseraActivity extends AppCompatActivity implements
SimpleDialog.OnDialogResultListener, IFibandActivity {
static final int REQUEST_CODE_REGISTER = 1;
private EditText txtNombre, txtTelefono;
private TextView tvColor;
private String COLOR_DIALOG = "color";
private ProgressDialog dialog;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
102 Claudia Aura Plesa
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pulsera);
tvColor = (TextView) findViewById(R.id.tvColor);
txtNombre = (EditText) findViewById(R.id.txtNombre);
txtTelefono = (EditText) findViewById(R.id.txtTelefono);
}
@Override
public void onBackPressed() {
Intent resultIntent = new Intent();
setResult(IFibandActivity.RESULT_CODE_NONE, resultIntent);
finish();
}
public void seleccionarColor(View v)
{
SimpleColorDialog.build()
.title("Elige color")
.colorPreset(Color.RED)
.allowCustom(true)
.show(this, COLOR_DIALOG);
}
@Override
public boolean onResult(String dialogTag, int which, Bundle extras) {
if (which == BUTTON_POSITIVE){
int color = extras.getInt(SimpleColorDialog.COLOR);
tvColor.setBackgroundColor(color);
return true;
}
return false;
}
public void insertar(View v){
//si no pasa la validacion, se sale
if(!validarCampos()) return;
String token = Sesion.getInstance().getUsuario().getToken();
//recupero el id de usuario de la sesion
int idusuario = Sesion.getInstance().getUsuario().getId();
String nombre = txtNombre.getText().toString();
String telefono = txtTelefono.getText().toString();
//coger color de fondo de un textview
ColorDrawable cd = (ColorDrawable) tvColor.getBackground();
int color = cd.getColor();
//convertir de un color en int a uno tipo #AABBCC
String strColor = String.format("#%06X", 0xFFFFFF & color);
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("token", token);
jsonParams.put("nombre", nombre);
jsonParams.put("telefono", telefono);
jsonParams.put("color", strColor);
jsonParams.put("usuario_id", String.valueOf(idusuario));
dialog = ProgressDialog.show(this, "", "Espere por favor",
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 103
true);
new JSONRequest(this,
REQUEST_CODE_REGISTER).request(getString(R.string.url_addpulsera),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atención!",e.getMessage());
}
}
private int parse(String input)
{
String str_r = input.substring(1,3);
String str_g = input.substring(3,5);
String str_b = input.substring(5);
int r = Integer.parseInt(str_r,16);
int g = Integer.parseInt(str_g,16);
int b = Integer.parseInt(str_b,16);
return Color.argb(127,r,g,b);
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
String texto = "Error!";
try {
texto = data.getString("mensaje");
} catch (JSONException e) {
}
Intent resultIntent = new Intent();
resultIntent.putExtra("mensaje",texto);
setResult(resultCode, resultIntent);
finish();
}
private boolean validarCampos()
{
boolean estado = true;
if(txtNombre.getText().toString().isEmpty() ||
txtTelefono.getText().toString().isEmpty() ||
tvColor.getBackground()==null)
{
Util.mensaje(this,"Acción necesaria","No puedes dejar campos
de texto vacios o color sin elegir");
estado = false;
}
return estado;
}
}
activity_pulsera.xml <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
104 Claudia Aura Plesa
android:layout_height="match_parent"
android:background="@drawable/fondopaisaje"
tools:context="com.claudia.fiband.activity.PulseraActivity"
tools:layout_editor_absoluteY="81dp">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginStart="29dp"
android:layout_marginTop="37dp"
android:fontFamily="serif"
android:text="Nombre Pulsera:"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/txtNombre"
app:layout_constraintStart_toStartOf="@+id/txtNombre"
app:layout_constraintTop_toTopOf="parent"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/txtNombre" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="11dp"
android:layout_marginStart="6dp"
android:fontFamily="serif"
android:text="Telefono de Contacto:"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/txtTelefono"
app:layout_constraintStart_toStartOf="@+id/txtTelefono"
app:layout_constraintTop_toBottomOf="@+id/txtNombre"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/txtTelefono" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:fontFamily="serif"
android:text="Color:"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold|italic"
app:layout_constraintBottom_toTopOf="@+id/btnElegirColor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtTelefono"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="@+id/txtTelefono"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 105
app:layout_constraintLeft_toLeftOf="@+id/txtTelefono" />
<Button
android:id="@+id/boton"
android:layout_width="148dp"
android:layout_height="48dp"
android:layout_marginBottom="74dp"
android:background="@android:drawable/editbox_dropdown_light_frame"
android:fontFamily="serif"
android:onClick="insertar"
android:text="Insertar"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvColor"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<EditText
android:id="@+id/txtNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="27dp"
android:ems="10"
android:inputType="textPersonName"
android:textAlignment="center"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="18sp"
app:layout_constraintBottom_toTopOf="@+id/textView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintRight_creator="1"
tools:layout_constraintTop_creator="1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<EditText
android:id="@+id/txtTelefono"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="35dp"
android:ems="10"
android:inputType="textPersonName"
android:textAlignment="center"
android:textColor="@color/cast_expanded_controller_background_color"
app:layout_constraintBottom_toTopOf="@+id/textView3"
app:layout_constraintStart_toStartOf="@+id/txtNombre"
app:layout_constraintTop_toBottomOf="@+id/textView2"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
106 Claudia Aura Plesa
tools:layout_constraintTop_creator="1"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="@+id/txtNombre" />
<Button
android:id="@+id/btnElegirColor"
android:layout_width="158dp"
android:layout_height="75dp"
android:layout_marginBottom="36dp"
android:background="@drawable/botoncolor"
android:fontFamily="serif"
android:onClick="seleccionarColor"
android:text="Seleccionar"
app:layout_constraintBottom_toTopOf="@+id/tvColor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3"
tools:layout_constraintLeft_creator="1"
tools:layout_constraintTop_creator="1"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<TextView
android:id="@+id/tvColor"
android:layout_width="50dp"
android:layout_height="20dp"
android:layout_marginBottom="53dp"
app:layout_constraintBottom_toTopOf="@+id/boton"
app:layout_constraintEnd_toEndOf="@+id/btnElegirColor"
app:layout_constraintStart_toStartOf="@+id/btnElegirColor"
app:layout_constraintTop_toBottomOf="@+id/btnElegirColor"
tools:layout_constraintRight_creator="1"
app:layout_constraintRight_toRightOf="parent"
tools:layout_constraintLeft_creator="1"
app:layout_constraintLeft_toLeftOf="parent" />
</android.support.constraint.ConstraintLayout>
Activity Mapa Pulseras
MapaPulserasActivity.java package com.claudia.fiband.activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.claudia.fiband.R;
import com.claudia.fiband.adaptador.PulseraAdapter;
import com.claudia.fiband.modelo.Pulsera;
import com.claudia.fiband.modelo.Sesion;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 107
import com.claudia.fiband.modelo.Usuario;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MapaPulserasActivity extends AppCompatActivity implements
OnMapReadyCallback,IFibandActivity {
private static final LatLng MADRID = new LatLng(40.415363, -3.707398);
private static int DELAY = 1500;
static final int REQUEST_CODE_GETPULSERAS = 1;
private MapFragment mapFragment;
private GoogleMap mapa;
private ListView listaPulseras;
private Usuario usuario;
private ProgressDialog dialog;
private List<Pulsera> pulseras;
private List<Marker> markers;
private Marker currentMarker;
private Pulsera currentPulsera;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mapa_pulseras);
listaPulseras = (ListView) findViewById(R.id.listaPulseras);
mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mapa = googleMap;
mapa.animateCamera(CameraUpdateFactory.newLatLngZoom(MADRID, 14.0f));
actualizarPulserasUsuario();
handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
actualizarPulserasMapa();
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
108 Claudia Aura Plesa
handler.postDelayed(this, DELAY);
}
}, DELAY);
}
public void actualizarPulserasUsuario()
{
this.usuario = Sesion.getInstance().getUsuario();
try {
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("token", usuario.getToken());
jsonParams.put("usuario_id", String.valueOf(usuario.getId()));
dialog = ProgressDialog.show(this, "", "Espere por favor", true);
new JSONRequest(this,
REQUEST_CODE_GETPULSERAS).request(getString(R.string.url_getpulseras),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
if(requestCode==REQUEST_CODE_GETPULSERAS) {
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
mostrarPulserasMapa(Util.obtenerListaPulserasJSON(this,
data));
}
else
{
try {
String texto = "Error general del servidor";
if(data!=null) {
JSONObject mensaje = data.getJSONObject("mensaje");
texto = mensaje.getString("mensaje");
}
Util.mensaje(this,"Atención!",texto);
} catch (JSONException e) {
Util.mensaje(this,"Atención!",e.getMessage());
}
}
}
}
public void mostrarPulserasMapa(final List<Pulsera> pulseras) {
PulseraAdapter adapter = new PulseraAdapter(MapaPulserasActivity.this,
R.layout.item_lista_pulseras, pulseras);
listaPulseras.setAdapter(adapter);
listaPulseras.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int
position, long id) {
Marker m = markers.get(position);
Pulsera p = pulseras.get(position);
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 109
if(currentMarker!=null)
{
currentMarker.setIcon(BitmapDescriptorFactory.defaultMarker(
Util.getHue(currentPulsera.getColor())));
}
Bitmap bm = BitmapFactory.decodeResource(getResources(),
R.drawable.estrella);
m.setIcon(BitmapDescriptorFactory.fromBitmap(bm));
currentPulsera = p;
currentMarker = m;
}
});
//quitar marcadores
mapa.clear();
markers = new ArrayList<>();
for(Pulsera p : pulseras) {
p.setUbicacion(new LatLng(MADRID.latitude,MADRID.longitude));
Marker marker = mapa.addMarker(new MarkerOptions()
.position(p.getUbicacion())
.title(p.getNombre())
.snippet(p.getTelefono())
.icon(BitmapDescriptorFactory.defaultMarker(Util.getHue(p.getColor()))));
marker.setTag(p); //a cada marcador le meto su pulsera
asociada
markers.add(marker);
}
}
public void actualizarPulserasMapa() {
for(Marker m : markers) {
Pulsera p = (Pulsera) m.getTag();
Util.randomizarPosicion(p);
m.setPosition(p.getUbicacion());
}
}
}
activity_mapa_pulseras.xml <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1"
tools:context="com.claudia.fiband.activity.MapaPulserasActivity">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="0.6"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
110 Claudia Aura Plesa
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="0.05" />
<ListView
android:id="@+id/listaPulseras"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="0.3"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"/>
</LinearLayout>
Util.java
package com.claudia.fiband.modelo;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import com.google.android.gms.maps.model.LatLng;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by Claudia Plesa.
*/
public class Util {
public static void mensaje(Context context, String titulo, String
mensaje)
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(titulo);
builder.setMessage(mensaje);
builder.setPositiveButton("ACEPTAR",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
public static Usuario obtenerUsuarioJSON(Context context, JSONObject
datosUsuario)
{
Usuario u = null;
try {
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 111
int id = datosUsuario.getInt("id");
String nombre = datosUsuario.getString("nombre");
String email = datosUsuario.getString("email");
String usuario = datosUsuario.getString("usuario");
String foto = datosUsuario.getString("foto");
String contrasena = datosUsuario.getString("contrasena");
String token = datosUsuario.getString("token");
u = new
Usuario(id,nombre,email,usuario,foto,contrasena,token);
} catch (JSONException e) {
Util.mensaje(context,"Atencion!",e.getMessage());
}
return u;
}
public static Pulsera obtenerPulseraJSON(Context context, JSONObject
datosPulsera)
{
Pulsera p = null;
try {
int id = datosPulsera.getInt("id");
String nombre = datosPulsera.getString("nombre");
String telefono = datosPulsera.getString("telefono");
String color = datosPulsera.getString("color");
int usuario_id = datosPulsera.getInt("usuario_id");
p = new Pulsera(id,nombre,telefono,color,usuario_id);
} catch (JSONException e) {
Util.mensaje(context,"Atencion!",e.getMessage());
}
return p;
}
public static List<Pulsera> obtenerListaPulserasJSON(Context context,
JSONObject data) {
List<Pulsera> pulseras = new ArrayList<>();
try {
JSONArray array = data.getJSONArray("mensaje");
for(int i=0;i<array.length();i++)
{
pulseras.add(Util.obtenerPulseraJSON(context,array.getJSONObject(i)));
}
} catch (JSONException e) {
Util.mensaje(context,"Atencion!",e.getMessage());
}
return pulseras;
}
public static LatLng posicionAleatoria(LatLng referencia) {
double lat = referencia.latitude;
double lng = referencia.longitude;
lng += 0.0001;
LatLng nueva = new LatLng(lat,lng);
return nueva;
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
112 Claudia Aura Plesa
//método que devuelve el color para el icono de geolocalización en
mapaPulseras
public static int getHue(String input) {
String str_r = input.substring(1,3);
String str_g = input.substring(3,5);
String str_b = input.substring(5);
int red = Integer.parseInt(str_r,16);
int green = Integer.parseInt(str_g,16);
int blue = Integer.parseInt(str_b,16);
float min = Math.min(Math.min(red, green), blue);
float max = Math.max(Math.max(red, green), blue);
if (min == max) {
return 0;
}
float hue = 0f;
if (max == red) {
hue = (green - blue) / (max - min);
} else if (max == green) {
hue = 2f + (blue - red) / (max - min);
} else {
hue = 4f + (red - green) / (max - min);
}
hue = hue * 60;
if (hue < 0) hue = hue + 360;
return Math.round(hue);
}
public static void randomizarPosicion(Pulsera p)
{
double minLat = 0.0003;
double minLng = 0.0003;
int gradosDesvioMax = 1;
if(p.getGradosDireccion()==-1) //es la 1a vez que se mueve,
aleatorio
{
int grados = new Random().nextInt(360);
double nuevaLat = p.getUbicacion().latitude +
Math.sin(grados)*minLat;
double nuevaLng = p.getUbicacion().longitude +
Math.cos(grados)*minLng;
LatLng nueva = new LatLng(nuevaLat,nuevaLng);
p.setUbicacion(nueva);
p.setGradosDireccion(grados);
}
else
{
int umbralMovimiento = 98;
int numero = new Random().nextInt(101);
if(numero<umbralMovimiento) //sigo en esa direccion
{
int gradosMargen = new Random().nextInt(gradosDesvioMax);
boolean negativo = new Random().nextBoolean();
if(negativo)
gradosMargen = -gradosMargen;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 113
int grados = p.getGradosDireccion()+gradosMargen;
double nuevaLat = p.getUbicacion().latitude +
Math.sin(grados)*minLat;
double nuevaLng = p.getUbicacion().longitude +
Math.cos(grados)*minLng;
LatLng nueva = new LatLng(nuevaLat,nuevaLng);
p.setUbicacion(nueva);
p.setGradosDireccion(grados);
}
else //direccion libre
{
int grados = new Random().nextInt(360);
double nuevaLat = p.getUbicacion().latitude +
Math.sin(grados)*minLat;
double nuevaLng = p.getUbicacion().longitude +
Math.cos(grados)*minLng;
LatLng nueva = new LatLng(nuevaLat,nuevaLng);
p.setUbicacion(nueva);
p.setGradosDireccion(grados);
}
}
}
}
III. Código impementado en la Versión 2
Activity Home HomeActivity.java
public boolean onContextItemSelected(MenuItem ítem
{
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
// info.position proporciona el index del item seleccionado
final Pulsera p = (Pulsera)
listaPulseras.getItemAtPosition(info.position);
if(item.getTitle()=="Editar")
{
Intent i = new Intent(this, PulseraActivity.class);
i.putExtra("pulsera",p);
i.putExtra("modo","editar");
startActivityForResult(i,REQUEST_CODE_EDITAR_PULSERA);
}
else if(item.getTitle()=="Eliminar")
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirmacion");
builder.setMessage("Confirma la eliminacion");
builder.setPositiveButton("SI",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
114 Claudia Aura Plesa
try {
Map<String, String> jsonParams = new
HashMap<String, String>();
jsonParams.put("token",
Sesion.getInstance().getUsuario().getToken());
jsonParams.put("id",
String.valueOf(p.getId()));
HomeActivity.this.dialog =
ProgressDialog.show(HomeActivity.this, "", "Espere por favor", true);
new JSONRequest(HomeActivity.this,
REQUEST_CODE_ELIMINAR_PULSERA).request(getString(R.string.url_deletepulsera
),new JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(HomeActivity.this,"Atencion!",e.getMessage());
}
}
});
builder.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
else
{
return false;
}
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.opc_ver_pulseras:
{
Intent i = new Intent(this, MapaPulserasActivity.class);
startActivity(i);
break;
}
case R.id.opc_config_cuenta:
{
Intent i = new Intent(this, RegistroActivity.class);
i.putExtra("datosUsuario",usuario);
i.putExtra("modo","editar");
startActivityForResult(i, REQUEST_CODE_EDITAR_USUARIO);
break;
}
case R.id.opc_sobre_nosotros:
{
//Versión 3
break;
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 115
case R.id.opc_salir_cuenta:
{
//Versión 3
break;
}
}
return true;
}
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if(requestCode==REQUEST_CODE_INSERTAR_PULSERA ||
requestCode==REQUEST_CODE_EDITAR_PULSERA)
{
if(resultCode==IFibandActivity.RESULT_CODE_OK) {
Util.mensaje(this, "Confirmacion",
data.getStringExtra("mensaje"));
actualizarPulserasUsuario();
}
else if (resultCode==IFibandActivity.RESULT_CODE_ERR)
{
Util.mensaje(this, "Error", data.getStringExtra("mensaje"));
}
}
else if(requestCode==REQUEST_CODE_EDITAR_USUARIO) {
if(resultCode==IFibandActivity.RESULT_CODE_OK) {
Util.mensaje(this, "Confirmacion",
data.getStringExtra("mensaje"));
actualizarDatosUsuario();
}
else if (resultCode==IFibandActivity.RESULT_CODE_ERR)
{
Util.mensaje(this, "Error", data.getStringExtra("mensaje"));
}
}
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject data)
{
dialog.dismiss();
if(requestCode==REQUEST_CODE_GETPULSERAS ||
requestCode==REQUEST_CODE_ELIMINAR_PULSERA) {
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
List<Pulsera> pulseras = Util.obtenerListaPulserasJSON(this,
data);
PulseraAdapter adapter = new PulseraAdapter(HomeActivity.this,
R.layout.item_lista_pulseras, pulseras);
listaPulseras.setAdapter(adapter);
registerForContextMenu(listaPulseras); //para menu contextual
}
else
{
try {
String texto = "Error general del servidor";
if(data!=null) {
JSONObject mensaje = data.getJSONObject("mensaje");
texto = mensaje.getString("mensaje");
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
116 Claudia Aura Plesa
}
Util.mensaje(this,"Atencion!",texto);
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
}
}
Activity Registro
RegistroActivity.java package com.claudia.fiband.activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.PersistableBundle;
import android.provider.MediaStore;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Usuario;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class RegistroActivity extends AppCompatActivity implements
IFibandActivity {
static final int REQUEST_IMAGE_CAPTURE = 1;
static final int REQUEST_CODE_REGISTER = 2;
static final int REQUEST_CODE_EDIT = 3;
static final int REQUEST_CODE_ELIMINAR_USUARIO = 5;
private EditText etNombre, etEmail, etUsuario, etContrasena;
private RoundedImageView imgFoto;
private Bitmap imageBitmap = null;
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 117
private Usuario usuarioActual = null;
private String modo;
private ProgressDialog dialog;
private Button btnEliminar;
private boolean haceFoto = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registro);
imageBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.cameraicon);
//si vengo de una rotacion
if (savedInstanceState != null) {
modo = savedInstanceState.getString("modo");
imageBitmap = (Bitmap)
savedInstanceState.getParcelable("foto");
}
else //si vengo de un intent normal
{
modo = (String) getIntent().getExtras().get("modo");
}
btnEliminar = (Button) findViewById(R.id.btnEliminar);
etNombre = (EditText) findViewById(R.id.txtNombre);
etEmail = (EditText) findViewById(R.id.txtEmail);
etUsuario = (EditText) findViewById(R.id.txtUsuario);
etContrasena = (EditText) findViewById(R.id.txtContrasena);
imgFoto = (RoundedImageView) findViewById(R.id.hacerFoto);
imgFoto.setImageBitmap(imageBitmap);
btnEliminar.setVisibility(View.INVISIBLE);
if(modo.equals("editar"))
{
setTitle("FiBand - Configurar cuenta");
usuarioActual = (Usuario)
getIntent().getExtras().get("datosUsuario");
etNombre.setText(usuarioActual.getNombre());
etEmail.setText(usuarioActual.getEmail());
etUsuario.setText(usuarioActual.getUsuario());
etContrasena.setText(usuarioActual.getContrasena());
if(!usuarioActual.getFoto().equals("")) {
File mypath = new File(usuarioActual.getFoto());
if(mypath.exists()) {
try {
BitmapFactory.Options options = new
BitmapFactory.Options();
options.inPreferredConfig =
Bitmap.Config.ARGB_8888;
imageBitmap =
BitmapFactory.decodeFile(mypath.getAbsolutePath());
imgFoto.setImageBitmap(imageBitmap);
} catch (Exception e) {
Log.d("XXX", "Error: " + e.getMessage());
}
}
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
118 Claudia Aura Plesa
//opción de editar los datos
Button btnInsertar = (Button) findViewById(R.id.btnInsertar);
btnInsertar.setText("ACTUALIZAR");
btnInsertar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editar(v);
}
});
//opción de eliminar la cuenta
btnEliminar.setVisibility(View.VISIBLE);
btnEliminar.setText("ELIMINAR CUENTA");
btnEliminar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
eliminarCuenta(v);
}
});
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("modo", modo);
outState.putParcelable("foto",imageBitmap);
super.onSaveInstanceState(outState);
}
@Override
public void onBackPressed() {
dicho método es el mismo que en la versión 1
}
public void insertar()
{
//si no pasa la validacion, se sale
if(!validarCampos())
return;
String ruta = "";
if(imageBitmap!=null)
ruta = guardarFoto();
try {
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("nombre", etNombre.getText().toString());
jsonParams.put("email", etEmail.getText().toString());
jsonParams.put("usuario", etUsuario.getText().toString());
jsonParams.put("foto", ruta);
jsonParams.put("contrasena",
etContrasena.getText().toString());
dialog = ProgressDialog.show(this, "", "Espere, por favor.",
true);
new JSONRequest(this,
REQUEST_CODE_REGISTER).request(getString(R.string.url_register),new
JSONObject(jsonParams));
} catch (JSONException e) {
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 119
Util.mensaje(this,"Atención!",e.getMessage());
}
}
public void editar(View v)
{
//si no pasa la validacion, se sale
if(!validarCampos())
return;
String ruta = "";
if(haceFoto==true)
ruta = guardarFoto();
else if(!usuarioActual.getFoto().equals(""))
ruta = usuarioActual.getFoto();
try {
Map<String, String> jsonParams = new HashMap<String, String>();
jsonParams.put("id", String.valueOf(usuarioActual.getId()));
jsonParams.put("nombre", etNombre.getText().toString());
jsonParams.put("email", etEmail.getText().toString());
jsonParams.put("usuario", etUsuario.getText().toString());
jsonParams.put("foto", ruta);
jsonParams.put("contrasena",
etContrasena.getText().toString());
jsonParams.put("token", usuarioActual.getToken());
dialog = ProgressDialog.show(this, "", "Espere por favor",
true);
Log.e("Fiband",jsonParams.toString());
new JSONRequest(this,
REQUEST_CODE_EDIT).request(getString(R.string.url_edit),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
public void tomarFoto(View v) {
dicho método es el mismo que en la versión 1
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode ==
RESULT_OK) {
Bundle extras = data.getExtras();
imageBitmap = (Bitmap) extras.get("data");
imgFoto.setImageBitmap(imageBitmap);
haceFoto = true;
}
}
private String guardarFoto(){
dicho método es el mismo que en la versión 1
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
120 Claudia Aura Plesa
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
if(requestCode==REQUEST_CODE_REGISTER) {
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
Usuario u = Util.obtenerUsuarioJSON(this,data);
Sesion.getInstance().setUsuario(u); //meto el usuario en la
sesion
Intent i = new
Intent(RegistroActivity.this,HomeActivity.class);
startActivity(i);
}
else
{
try {
String texto = data.getString("mensaje");
Util.mensaje(this,"Atención!",texto);
} catch (JSONException e) {
Util.mensaje(this,"Atención!",e.getMessage());
}
}
}
else if(requestCode==REQUEST_CODE_EDIT) {
Intent resultIntent = new Intent();
setResult(resultCode, resultIntent);
if (resultCode == IFibandActivity.RESULT_CODE_OK) {
Usuario resultado = Util.obtenerUsuarioJSON(this,data);
Sesion.getInstance().setUsuario(resultado); //meto el
usuario en la sesion
resultIntent.putExtra("mensaje",getString(R.string.datos_modificados));
}
else
{
resultIntent.putExtra("mensaje",getString(R.string.error_modificando));
}
finish();
}
else if(requestCode==REQUEST_CODE_ELIMINAR_USUARIO)
{
String texto = "";
try {
if(data!=null) {
JSONObject mensaje = data.getJSONObject("mensaje");
texto = mensaje.getString("mensaje");
}
} catch (JSONException e) {
}
if(resultCode==IFibandActivity.RESULT_CODE_OK) {
Intent i = new Intent(this,LoginActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
}
else
{
Util.mensaje(this, "Error", texto);
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 121
}
}
private boolean validarCampos()
{
dicho método es el mismo que en la versión 1
}
public void eliminarCuenta(View v)
{
//si no pasa la validacion, se sale
if(!validarCampos())
return;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Confirmación");
builder.setMessage("Deseas eliminar tu cuenta?");
builder.setPositiveButton("SI",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
try {
Map<String, String> jsonParams = new
HashMap<String, String>();
jsonParams.put("token",
Sesion.getInstance().getUsuario().getToken());
jsonParams.put("id",
String.valueOf(Sesion.getInstance().getUsuario().getId()));
RegistroActivity.this.dialog =
ProgressDialog.show(RegistroActivity.this, "", "Espere, por favor.", true);
new JSONRequest(RegistroActivity.this,
REQUEST_CODE_ELIMINAR_USUARIO).request(getString(R.string.url_deleteusuario
),new JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(RegistroActivity.this,"Atención!",e.getMessage());
}
}
});
builder.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
builder.show();
}
public void confirmacionRegistro(View v)
{
//dicho método es el mismo que en la versión 1
}
}
activity_registro.xml <!—Dicho documento sólo se modifica con una acción respecto al de la
versión 1. En este caso se añadirá el siguiente código:-->
<Button
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
122 Claudia Aura Plesa
android:id="@+id/btnEliminar"
android:layout_width="114dp"
android:layout_height="55dp"
android:layout_marginBottom="100dp"
android:background="@android:drawable/editbox_dropdown_light_frame"
android:fontFamily="sans-serif"
android:text="ELIMINAR CUENTA"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtUsuario" />
Activity Pulsera PulseraActivity.java
package com.claudia.fiband.activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.claudia.fiband.R;
import com.claudia.fiband.modelo.Pulsera;
import com.claudia.fiband.modelo.Sesion;
import com.claudia.fiband.modelo.Util;
import com.claudia.fiband.net.JSONRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import eltos.simpledialogfragment.SimpleDialog;
import eltos.simpledialogfragment.color.SimpleColorDialog;
public class PulseraActivity extends AppCompatActivity implements
SimpleDialog.OnDialogResultListener, IFibandActivity {
static final int REQUEST_CODE_REGISTER = 1;
static final int REQUEST_CODE_EDIT = 2;
private EditText txtNombre, txtTelefono;
private TextView tvColor;
private String COLOR_DIALOG = "color";
private Pulsera pulseraActual;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pulsera);
tvColor = (TextView) findViewById(R.id.tvColor);
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 123
txtNombre = (EditText) findViewById(R.id.txtNombre);
txtTelefono = (EditText) findViewById(R.id.txtTelefono);
String modo = (String) getIntent().getExtras().get("modo");
if(modo.equals("editar")) {
setTitle("FiBand - Editar pulsera");
pulseraActual = (Pulsera)
getIntent().getSerializableExtra("pulsera");
int color = parse(pulseraActual.getColor());
tvColor.setBackgroundColor(color);
txtNombre.setText(pulseraActual.getNombre());
txtTelefono.setText(pulseraActual.getTelefono());
Button boton = (Button) findViewById(R.id.boton);
boton.setText("ACTUALIZAR");
boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editar(v);
}
});
}
}
@Override
public void onBackPressed() {
Intent resultIntent = new Intent();
setResult(IFibandActivity.RESULT_CODE_NONE, resultIntent);
finish();
}
public void seleccionarColor(View v)
{
SimpleColorDialog.build()
.title("Elige color")
.colorPreset(Color.RED)
.allowCustom(true)
.show(this, COLOR_DIALOG);
}
@Override
public boolean onResult(String dialogTag, int which, Bundle extras) {
if (which == BUTTON_POSITIVE){
int color = extras.getInt(SimpleColorDialog.COLOR);
tvColor.setBackgroundColor(color);
return true;
}
return false;
}
public void editar(View v){
//si no pasa la validacion, se sale
if(!validarCampos())
return;
String token = Sesion.getInstance().getUsuario().getToken();
String nombre = txtNombre.getText().toString();
String telefono = txtTelefono.getText().toString();
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
124 Claudia Aura Plesa
//coger color de fondo de un textview
ColorDrawable cd = (ColorDrawable) tvColor.getBackground();
int color = cd.getColor();
//convertir de un color en int a uno tipo #AABBCC
String strColor = String.format("#%06X", 0xFFFFFF & color);
strColor.replace("#","%23");
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("token", token);
jsonParams.put("id", String.valueOf(pulseraActual.getId()));
jsonParams.put("nombre", nombre);
jsonParams.put("telefono", telefono);
jsonParams.put("color", strColor);
dialog = ProgressDialog.show(this, "", "Espere por favor",
true);
new JSONRequest(this,
REQUEST_CODE_EDIT).request(getString(R.string.url_editpulsera),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
public void insertar(View v){
//si no pasa la validacion, se sale
if(!validarCampos())
return;
String token = Sesion.getInstance().getUsuario().getToken();
//recupero el id de usuario de la sesion
int idusuario = Sesion.getInstance().getUsuario().getId();
String nombre = txtNombre.getText().toString();
String telefono = txtTelefono.getText().toString();
//coger color de fondo de un textview
ColorDrawable cd = (ColorDrawable) tvColor.getBackground();
int color = cd.getColor();
//convertir de un color en int a uno tipo #AABBCC
String strColor = String.format("#%06X", 0xFFFFFF & color);
try {
Map<String, String> jsonParams = new HashMap<String,
String>();
jsonParams.put("token", token);
jsonParams.put("nombre", nombre);
jsonParams.put("telefono", telefono);
jsonParams.put("color", strColor);
jsonParams.put("usuario_id", String.valueOf(idusuario));
dialog = ProgressDialog.show(this, "", "Espere por favor",
true);
new JSONRequest(this,
REQUEST_CODE_REGISTER).request(getString(R.string.url_addpulsera),new
JSONObject(jsonParams));
} catch (JSONException e) {
Util.mensaje(this,"Atencion!",e.getMessage());
}
}
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 125
private int parse(String input)
{
String str_r = input.substring(1,3);
String str_g = input.substring(3,5);
String str_b = input.substring(5);
int r = Integer.parseInt(str_r,16);
int g = Integer.parseInt(str_g,16);
int b = Integer.parseInt(str_b,16);
return Color.argb(127,r,g,b);
}
@Override
public void onJSONResult(int requestCode, int resultCode, JSONObject
data) {
dialog.dismiss();
String texto = "Error!";
try {
texto = data.getString("mensaje");
} catch (JSONException e) {
}
Intent resultIntent = new Intent();
resultIntent.putExtra("mensaje",texto);
setResult(resultCode, resultIntent);
finish();
}
private boolean validarCampos()
{
boolean estado = true;
if(txtNombre.getText().toString().isEmpty() ||
txtTelefono.getText().toString().isEmpty() ||
tvColor.getBackground()==null)
{
Util.mensaje(this,"Acción necesaria","No puedes dejar campos
de texto vacios o color sin elegir");
estado = false;
}
else if(txtNombre.getText().toString().length() > 255)
{
Util.mensaje(this,"Error","La longitud de los campos ha de ser inferior
a 255 caracteres");
estado = false;
}
else if(txtTelefono.getText().toString().length() > 9)
{
Util.mensaje(this,"Error","El teléfono introducido no es correcto");
estado = false;
}
return estado;
}
}
activity_pulsera.xml <!—Dicho documento no se modifica respecto al de la versión anterior.-->
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
126 Claudia Aura Plesa
IV. Código implementado en la Versión 3
Activity Sobre Nosotros
SobreNosotrosActivity.java package com.claudia.fiband.activity;
import android.app.Activity;
import android.os.Bundle;
import com.claudia.fiband.R;
public class SobreNosotrosActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sobre_nosotros);
}
}
activity_sobre_nosotros.xml <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.claudia.fiband.activity.SobreNosotrosActivity"
tools:layout_editor_absoluteY="81dp">
<ImageView
android:id="@+id/imageView5"
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_marginBottom="8dp"
android:src="@drawable/logo"
app:layout_constraintBottom_toTopOf="@+id/textView13"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView13"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="16dp"
android:fontFamily="sans-serif"
android:text="FiBand se trata de una aplicación social cuyo
propósito es ayudarte a estar en contacto con tus seres más queridos.
\nSe caracteriza por un diseño sencillo e intuitivo para hacer que su uso
sea lo más fácil posible.\n
\nPor otro lado, nos encontramos realizando mejoras orientadas a la
diversidad funcional y poder así garantizar su uso para todo el mundo.\n
\nSi tienes alguna duda o sugerencia no dudes en ponerte en contacto con
nosotros en:\[email protected].\n
\nMuchas gracias por formar parte de la familia FiBand."
android:textAlignment="center"
android:textColor="@color/cast_expanded_controller_background_color"
android:textSize="14sp"
Universidad Politécnica de Madrid ETS de Ingeniería de Sistemas Informáticos
Trabajo Fin de Carrera FIBAND
Claudia Aura Plesa 127
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView5" />
</android.support.constraint.ConstraintLayout>
Activity Home
HomeActivity.java public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.opc_ver_pulseras:
{
Intent i = new Intent(this, MapaPulserasActivity.class);
startActivity(i);
break;
}
case R.id.opc_config_cuenta:
{
Intent i = new Intent(this, RegistroActivity.class);
i.putExtra("datosUsuario",usuario);
i.putExtra("modo","editar");
startActivityForResult(i, REQUEST_CODE_EDITAR_USUARIO);
break;
}
case R.id.opc_sobre_nosotros:
{
Intent i = new Intent(this, SobreNosotrosActivity.class);
startActivity(i);
break;
}
case R.id.opc_salir_cuenta:
{
Intent i = new Intent(this, Inicial.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Sesion.getInstance().setUsuario(null); //cerramos sesion
startActivity(i);
break;
}
}
return true;
}
activity_home.xml <!—Dicho documento no se modifica respecto al de la versión anterior.-->