Proyecto para Programación Multimedia y Dispositivos Móviles 2020-2021 por Carlos Víllora Tercero.
Quería hacer algún proyecto con APIs y buscando por internet me tope con este. Luego concretando intentaré hacer una aplicación que maneje datos de comida y nutrición.
Clona el proyecto en android studio y copia o crea el fichero Secrets.properties en la raiz del proyecto. Este fichero no lo subiré a github porque contiene mi clave privada, esta clase tiene una variable llamada SPOONACULAR_KEY
con la clave de la página de la API
Estoy muy acostumbrado al inglés y empecé haciendo las cosas en inglés, pero lo que planeo al final es tener el código principalmente en español sin cambiar el idioma a todo lo que ya tenía hecho y la interfaz en español menos los elementos de la api que estarán en inglés.
La aplicación se ha hecho con un nivel mínimo de API 24 (Nougat) simplemente porque quería utilizar streams en el código de Java. Se utilizarán algunas dependencias del SDK, dependiendo de esta API que me permite 150 llamadas al dia y alguna dependecia más poco importante, eso se puede ver en el gradle.
En la pantalla principal se mostrará un EditText
pidiendo el nombre (en inglés) del ingrediente que busca, se comprobará que el dispositivo está conectadoa internet y se pasará a la siguiente actividad pasando en el intent
un string con el ingrediente a buscar.
Se intentará cargar los primeros ingredientes de la API, en esta pantalla se mostrarán los errores e información relevante para poner en marcha el sistema. Una vez cargados, se mostrarán mediante un RecylerView
la lista de ingredientes. Además contará menús en el actionbar
que te dejará opciones de cambiar la dirección de los elementos mostrados (ascendente descendente), otra para ir a la pantalla de filtrado, otra para ir una pantalla de ordenado para cambiar la petición de la API al volver y por último una opción para cambiar la resolución en los SharedPreferences
en el dialogo de resolución. Además cada ingrediente se debe poder pulsar y entrar en una ventana con información adicional del ingrediente.
Así se está viendo
Se cargará lo que encuentre en está llamada a la API y recibirá el id del producto a través del Intent
, de aquí solo se podrá volver a la actividad lista de ingredientes.
En esta ventana emergente habrán varios RangeSlider
para filtrar por el mínimo y máximo de proteínas, grasas y carbohidratos, de aquí solo se podrá volver a la lista de ingredientes .
Se mostrará algunos RadioButton
con las opciones de ordenador que aparecen en esta página de aquí solo se podrá volver a la lista de ingredientes.
En esta venta, se guardará la resolución que querrá el usuario siendo la pequeña 100x100, la mediana 250x250 y la grande 500x500 en los SharedPreferences
mediante la clase ConversorImagen que administrá las peticiones de imagenes para que se devuelvan con la resolución establecida, además de poder establecer nuevas resoluciones.
La aplicación se dividirá en 4 capas que serán las siguientes:
Aquí estarán todas las clases de datos con las que se trabajará y las que devolverá el api, también otras utilidades no ligadas a la presentación y una clase por cada llamada a la api para manejar los datos necesarios para su llamada y la adaptación de estos
Aquí están varias clases modificadas a partir del SDK de la aplicación para android, desde aquí se podrán hacer las peticiones a la API
Todas las clases que gestionan la UI, activities, etc. desde Java
Los ficheros en res son la parte de la interfaz gráfica
Eso está explicado en la parte de pantallas, los 3 primeros son los activities busqueda, listado y detalles.
La actividad busqueda pasá un string a la petición de la actividad listado y la actividad listado pasa el id del producto a la actividad detalles.
La actividad listado contiene un RecyclerView
con cada ingrediente y al pulsarlo se va a la actividad detalles, está a su vez tiene otro RecyclerView
para mostrar sus nutrientes, pero no lleva a ningún sitio al pulsarlo.
En el dialogo de resolución se ajustan en las preferencias la resolución a la cual se quieren mostrar las imágenes para disminuir el consumo de datos de internet.
Contiene 4 menus, 3 con dialogos: dialogo de filtrado, dialogo de ordenado y dialogo de resolución. El último es el de cambiar el orden de mostrar los productos, aunque estoy pensando en mejorar el dialogo de ordenado para que se pueda elegir el orden allí, no sé si llegaré a implementar eso. Los iconos son estándares de android para mostrar filtrado y ordenado, aquí una imagen.
6) Todos los recursos deben estar correctamente organizados (por ejemplo las cadenas y mensajes deben declararse en string.xml y no en los layouts, las imágenes deben ir en su carpeta correspondiente.. etc)
No hay muchas imágenes porque las descargo de Internet, pero tengo todos los strings importantes están en string.xml, pensaba en dividir los strings para poder implementar varios idiomas en la aplicación, pero supongo que lo probarás con el emulador en inglés y no quiero que te asustes al leer todos los textos en inglés.
7) Presentación gráfica y el uso de elementos no vistos en clase (menús, pestañas, controles personalizados, etc)
No me he molestado mucho en los elementos usados, simplemente me he basado en LinearLayout
, AlertDialog
y por ejemplo, he utilizado el RangeSlider
de Material personalizado para mostrar el mínimo y máximo del filtrado.
Diría que ya he mencionado la mayor parte de cosas y las preguntas anteriores preguntan acerca de cada tema que hemos estudiado, se puede ir comprobando como he utilizado elementos básicos como Button
en la búsqueda habilitándolo y deshabilitandolo según haya texto en el EditText
, es un ejemplo de algo que hemos dado en clase aunque puedes ir viendo como está hecha cada pantalla.
He utilizado una API de comida que aumenta el nivel de complejidad de la aplicación junto código asíncrono hecho en java porque AsyncTask
se quedo obsoleto en la api 30 de Android, es mejorable ya que no muestra ningún indicador de carga, pero personalmente en código asíncrono Java se queda detrás de lenguajes más modernos como Kotlin y hacen más dificil su implementación.
Me he complicado la vida, convirtiendo datos que conseguía en json a una base de datos SQLite con Room manteniendo orden en listas y otras cosas díficiles de hacer. Debería haberlo guardado en un fichero json por ejemplo, pero queria aprender y mejorar mi conocimiento en Room
Al tener api y persistencia local, he utilizado un patrón repositorio para cachear los datos de los detalles, así ahorro consumo de la API
También he añadido unos pocos tests unitarios para ir desarrollando cosas específicas como guardar imágenes en SharedPreferences
o para aplicar cierta lógica al cambiar el mínimo y máximo del filtrado o para comprobar que deserializa correctamente los jsons.
También tengo tests instrumentados para comprobar el funcionamiento real de la API y del manejo de la aplicación navegando por ella con la librería de Espresso.
Estos tests no se esperán que estén completos para todas las partes de la aplicación, simplemente he hecho allí dónde consideraba que hiciera más falta.
He utilizado git con github para el control de versiones, llegando a introducir un kanban con el proyecto para ir haciendo algunas tareas actividades y dejando la oportunidad a otros de ver y modificar mi código, también he participado en dos proyectos de mis compañeros SimpleAndroidRPG y proyectobd
He puesto una accion de git que genera apks cada vez que se haga un push o pull request para automatizar los lanzamientos de apks