-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.tex
635 lines (421 loc) · 45.3 KB
/
main.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
\documentclass{article}
\usepackage{graphicx} % Required for inserting images
\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{url} % Required for inserting URLs
\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{DEIN UT4}
\fancyhead[R]{Adrian García DAM 2B}
\rfoot{\thepage}
\title{Filmosis}
\author{Proyecto Intermodular DAM, Maria Ana Sanz}
\date{Curso 2023-2024}
\begin{document}
\begin{titlepage}
\centering
\maketitle
\includegraphics[width=0.8\textwidth]{images/logo_ci_mas.jpg}
\vspace{1cm}
\includegraphics[width=0.8\textwidth]{images/logoFilmosisPremium.png}
\vspace{1cm}
\textbf{Integrantes}
\vspace{0.5cm}
\begin{minipage}{0.5\textwidth}
\centering
Jiménez Aldasoro, Kaiet \\
Arrondo Villaplana, Aritz \\
García Galera, Adrián
\end{minipage}
\end{titlepage}
\renewcommand{\contentsname}{Índice}
\tableofcontents
\newpage
\section{Introducción}
\subsection{Breve descripción}
Filmosis es una aplicación dedicada a los amantes del cine que buscan una experiencia completa para descubrir, explorar y valorar películas. Esta plataforma combina la riqueza de información de IMDb con una función de valoración integrada, permitiendo a los usuarios sumergirse en el vasto mundo del cine de una manera interactiva y social.
\subsection{Objetivos}
\begin{itemize}
\item Exploración de Películas: Filmosis ofrece una amplia base de datos de películas donde los usuarios pueden explorar información detallada sobre películas, desde el elenco hasta las críticas.
\item Listas Personalizadas: Los usuarios pueden crear listas personalizadas de películas, como "Mis Favoritas", "Por Ver", o cualquier categoría que deseen. Esta función ayuda a organizar y compartir preferencias cinematográficas.
\item Noticias y Actualizaciones: Filmosis mantiene a los usuarios actualizados sobre las últimas noticias y eventos en la industria cinematográfica, asegurándose de que estén informados sobre estrenos, premios y más.
\item Perfil de Usuario: Cada usuario tiene su propio perfil personalizado, donde pueden ver sus valoraciones, listas y contribuciones. También pueden conectarse con amigos y descubrir lo que están viendo y valorando.
\end{itemize}
Filmosis se esfuerza por crear una comunidad vibrante de cinéfilos, proporcionando una plataforma interactiva y social para explorar y disfrutar del mundo del cine.
\vspace{1cm}
\begin{minipage}{1\textwidth}
\centering
\includegraphics[width=0.6\textwidth]{images/logoFilmosis.png}
\end{minipage}
\section{Tecnologías empleadas}
\subsection{Kotlin}
\begin{itemize}
\item Retrofit: Retrofit es una biblioteca popular para Android que simplifica el consumo de servicios web RESTful. Ofrece una forma declarativa y eficiente de definir y realizar solicitudes HTTP, así como de procesar las respuestas.
\item Gson: Biblioteca de Java / Kotlin desarrollada por Google que facilita el análisis y la serialización de objetos Java en formato JSON y viceversa. Es ampliamente utilizada en aplicaciones Android para el intercambio de datos entre el cliente y el servidor, así como para el almacenamiento de datos en archivos JSON.
\item CarouselRecyclerView: Libearía de Android que permite crear y mostrar carruseles de elementos dentro de un RecyclerView. Esta biblioteca simplifica la implementación de carousels horizontales o verticales en aplicaciones Android, lo que proporciona una experiencia de usuario más atractiva y dinámica.
\item CircleImageView: CircleImageView es una biblioteca de Android que proporciona una vista personalizada para mostrar imágenes redondeadas en aplicaciones Android. Esta biblioteca simplifica la implementación de imágenes circulares en las interfaces de usuario de las aplicaciones, lo que mejora la estética y la coherencia visual.
\item Dokka: Herramienta de generación de documentación para proyectos Kotlin y Java. Esta herramienta, desarrollada por JetBrains, permite generar documentación de manera automática a partir del código fuente, facilitando la creación y mantenimiento de documentación técnica para proyectos de software.
\item Glide: Glide es una biblioteca de gestión de imágenes para Android que facilita la carga, la visualización y el almacenamiento en caché de imágenes de forma eficiente en aplicaciones Android. Desarrollado por Bumptech, Glide se ha convertido en una de las bibliotecas más populares para el manejo de imágenes en el ecosistema Android.
\end{itemize}
\subsection{Bibliotecas adicionales}
\begin{itemize}
\item Firebase: Firebase es una plataforma de desarrollo de aplicaciones móviles y web desarrollada por Google. Proporciona una variedad de servicios en la nube que ayudan a los desarrolladores a crear, mejorar y hacer crecer sus aplicaciones de manera rápida y efectiva. Estos servicios incluyen desde herramientas para el desarrollo de aplicaciones hasta análisis de usuarios y monetización. Las herramientas de Firebase que hemos utilizado son las siguientes:
\begin{itemize}
\item Firebase Analytics: Servicio de análisis de usuarios que permite a los desarrolladores comprender el comportamiento de los usuarios en sus aplicaciones, lo que les ayuda a tomar decisiones informadas para mejorar la experiencia del usuario y el rendimiento de la aplicación.
\item Firebase Authentication: Servicio de autenticación de usuarios que permite a los desarrolladores autenticar usuarios de forma segura en sus aplicaciones mediante diversos métodos de autenticación, lo que garantiza la seguridad y la privacidad de los datos del usuario.
\item Firebase Firestore: Firestore es un servicio de base de datos en la nube de documentos en tiempo real y escalable que permite a los desarrolladores almacenar, sincronizar y consultar datos de manera flexible y eficiente.
\item Firebase Storage: Servicio de almacenamiento en la nube capaz de almacenar y servir archivos de usuario, como imágenes, videos, archivos de audio y otros archivos multimedia, de forma segura y eficiente.
\end{itemize}
\item TMDB (The Movie Database): Plataforma en línea que proporciona una amplia base de datos de información relacionada con películas, programas de televisión y personas asociadas con la industria del entretenimiento. TMDb ofrece una variedad de datos útiles para cinéfilos, desarrolladores de aplicaciones y profesionales de la industria del entretenimiento.
\end{itemize}
\section{Estructura del proyecto}
\subsection{Organización de directorios y archivos}
La estructura de los diferentes paquetes en la aplicación es la siguiente:
\begin{minipage}{1\textwidth}
\centering
\includegraphics[width=0.5\textwidth]{images/estructuraDirectorios.png}
\end{minipage}
\begin{itemize}
\item \textbf{Adapters:} En este paquete se encuentran principalmente los adaptadores para todos los RecyclerView, necesarios para mostrar la información y enlazar los datos en sus respectivos elementos.
\item \textbf{Config}: Aquí se encuentra solo una clase, \textit{DatosConexion.kt}, con campos estáticos que guardan constantes como las URLs base de la API de TMDB, para poder acceder desde fuera, o la misma API key, para poder usarla en todas las consultas de manera consistente.
\item \textbf{Data:} En data se almacenan otros dos paquetes, \textit{access} y \textit{model}. El primero hace de repositorio de consultas para interactuar con una base de datos o con APIs, en nuestro caso, existen dos clases, \textit{MoviesAccess.kt} y \textit{PersonsAccess.kt}, donde se guardan las distintas funciones para las peticiones a TMDB. En cambio, en \textit{model} se encuentran las clases para mapear las respuestas de las consultas a objetos / estructuras de Kotlin, lo que viene siendo un \textit{Dataclass}. La idea entre los dos paquetes es similar a la arquitectura de DAO (\textit{Data Access Object}) y DTO (\textit{Data Transfer Object}).
\item \textbf{Dataclass}: En este paquete, se almacenan dataclasses similares a las que hay en data.model, pero para uso interno de la aplicación y no para mapear directamente las respuestas de TMDB.
\item \textbf{Fragments}: Aquí simplemente se guardan todos los fragmentos de la aplicación.
\item \textbf{Init}: En init se encuentran clases para inicializar instancias de distintas fuentes. En este caso solo está \textit{FirebaseInitializer.kt}, la cual inicializa todas las intancias necesarias de cada librería de Firebase, como la propia base de datos \textit{Firestore} o el servicio de autenticación de usuarios \textit{FirebaseAuth}. De esta manera, se puede acceder a éstas instancias desde cualquier punto del proyecto sin tener que crear una cada vez que se quiera acceder.
\item \textbf{Network:} En este paquete se almacenan archivos relacionados con la conexión o internet. En el caso de Filmosis, se encuentra el servicio de Retrofit, que permite realizar peticiones HTTP, en nuestro caso a TMDB. También dentro existe el paquete de \textit{interfaces}, que contiene interfaces para declarar los endpoints de las APIs.
\item \textbf{Utilities:} En utilites se guardan distintos archivos, mas generales, de ayuda o simplemente utilidades para la aplicación. Por ejemplo, clases con métodos auxiliares para Firebase, o Mappings de recursos como imágenes con sus correspondientes IDs.
\end{itemize}
Por último, en la raíz del paquete principal, se encuentran las Activities del proyecto, para poder visualizarlas de mejor manera y acceder de manera rápida porque son los componentes mas importantes de la aplicación, junto con los fragmentos.
\section{Configuración del entorno de desarrollo}
\subsection{Herramientas necesarias}
Lo primero obviamente es instalar el IDE de Android Studio desde su página oficial. Este proceso se cubre de manera más extensa en el siguiente apartado \textit{Instrucciones de Instalación}.
No hace falta ningun tipo de herramienta / configuración compleja para ejecutar el proyecto, basta con cumplir los siguientes requerimientos:
\begin{itemize}
\item SDK de Android: El Android Software Development Kit (SDK) contiene las bibliotecas y herramientas necesarias para desarrollar aplicaciones Android. La versión necesaria para ejecutar el proyecto es la 34, por lo que se recomienda descargarla y configurarla en las preferencias.
\item Instalación de Emulador: Con la instalación de Android Studio, viene por defecto un dispositivo instalado, pero si se quiere personalizar o instalar un dispositivo mas potente, debe ser con la versión 9.0 de Android como mínimo. También es posible conectar un dispositivo real via USB o Wi-Fi.
\end{itemize}
\subsection{Instrucciones de instalación}
\begin{itemize}
\item \textbf{Instalación de Android Studio}
\begin{enumerate}
\item Descarga el instalador de Android Studio desde el sitio web oficial: \texttt{https://developer.android.com/studio}.
\item Ejecuta el archivo de instalación descargado.
\item Sigue las instrucciones del instalador para completar la instalación. Asegúrate de seleccionar las opciones de configuración que desees durante el proceso de instalación.
\item Una vez finalizada la instalación, abre Android Studio en tu computadora.
\item Durante la primera ejecución, Android Studio te guiará a través del proceso de configuración inicial, que incluye la instalación de componentes adicionales como el SDK de Android, el emulador y herramientas de desarrollo.
\item Sigue las instrucciones en pantalla para completar la configuración inicial. Puedes elegir las preferencias de usuario y las ubicaciones de instalación según tus necesidades.
\item Una vez finalizada la configuración inicial, Android Studio estará listo para ser utilizado para desarrollar aplicaciones Android.
\end{enumerate}
\item \textbf{Cambiar la versión del SDK a la API 34}
\begin{enumerate}
\item En la barra de menú, selecciona \texttt{Tools} (Herramientas) y luego \texttt{SDK Manager} (Administrador de SDK).
\item En la ventana del Administrador de SDK, selecciona la pestaña \texttt{SDK Platforms} (Plataformas SDK).
\item En la lista de versiones de Android, busca y marca la casilla correspondiente a la API 34 (Android 12). Puedes desmarcar otras versiones si solo deseas trabajar con la versión 34.
\item Haz clic en \texttt{Apply} (Aplicar) para confirmar los cambios y comenzar la descarga e instalación de la API 34.
\item Una vez completada la instalación, cierra la ventana del Administrador de SDK.
\item Asegúrate de que tu proyecto esté configurado para utilizar la API 34. Puedes hacerlo abriendo el archivo \texttt{build.gradle} en la carpeta \texttt{app} de tu proyecto y configurando \texttt{compileSdkVersion} y \texttt{targetSdkVersion} para que coincidan con la API 34.
\item Vuelve a sincronizar tu proyecto con los archivos de compilación haciendo clic en \texttt{Sync Now} (Sincronizar Ahora) si es necesario.
\end{enumerate}
\item \textbf{Instalación de emulador en Android Studio}
\begin{enumerate}
\item En la barra de menú, selecciona \texttt{Tools} (Herramientas) y luego \texttt{AVD Manager} (Administrador de AVD).
\item En la ventana del Administrador de AVD, haz clic en el botón \texttt{Create Virtual Device} (Crear Dispositivo Virtual).
\item Selecciona un dispositivo de la lista (por ejemplo, Pixel 4) y haz clic en \texttt{Next} (Siguiente).
\item Selecciona una imagen del sistema para el dispositivo virtual. Puedes descargar diferentes versiones de Android haciendo clic en \texttt{Download} (Descargar) junto a la versión que desees.
\item Una vez descargada la imagen del sistema, selecciónala y haz clic en \texttt{Next}.
\item Configura las opciones de hardware según tus preferencias y haz clic en \texttt{Finish} (Finalizar) para crear el dispositivo virtual.
\item El dispositivo virtual se agregará a la lista en el Administrador de AVD. Para iniciarlo, haz clic en el botón de reproducción al lado del nombre del dispositivo.
\item Espera a que el emulador se inicie y se cargue completamente. Una vez listo, podrás usarlo para probar y depurar tus aplicaciones.
\end{enumerate}
\end{itemize}
\section{Guía de Uso}
\subsection{Instrucciones para Configurar y Ejecutar el Proyecto}
\subsubsection{Mediante el Código Fuente (src)}
\begin{enumerate}
\item \textbf{Configuración inicial:}
\begin{itemize}
\item Abre Android Studio.
\item Selecciona "Abrir un proyecto existente" y navega hasta el directorio donde se encuentra el código fuente del proyecto.
\item Selecciona el archivo \texttt{build.gradle} en el directorio raíz del proyecto y haz clic en "Abrir".
\end{itemize}
\begin{figure}[h]
\centering
\includegraphics[width=0.8\textwidth]{images/codigo_fuente.jpg}
\caption{Interfaz de Android Studio mostrando el proceso de apertura del proyecto existente.}
\label{fig:codigo_fuente}
\end{figure}
\item \textbf{Espera a que Android Studio sincronice el proyecto:}
\begin{itemize}
\item Android Studio puede necesitar tiempo para descargar e instalar las dependencias del proyecto, así que espera a que la sincronización se complete.
\end{itemize}
\item \textbf{Configuración del dispositivo virtual o dispositivo físico:}
\begin{itemize}
\item Puedes ejecutar tu aplicación en un dispositivo virtual o en un dispositivo físico conectado.
\item Para crear un dispositivo virtual, ve a \texttt{Tools > AVD Manager}, y crea un nuevo dispositivo virtual según tus preferencias.
\item Para ejecutar en un dispositivo físico, asegúrate de tener habilitado el modo de desarrollador y la depuración USB en el dispositivo, y conéctalo a tu computadora.
\end{itemize}
\item \textbf{Ejecución del proyecto:}
\begin{itemize}
\item Selecciona el dispositivo en el que deseas ejecutar la aplicación (dispositivo virtual o físico) en la barra de herramientas.
\item Haz clic en el botón "Run" (el ícono de reproducción) o presiona \texttt{Shift + F10}.
\item Espera a que Android Studio compile el proyecto y lo ejecute en el dispositivo seleccionado.
\end{itemize}
\end{enumerate}
\subsubsection{Mediante la APK Instalándola}
\begin{enumerate}
\item \textbf{Generación de la APK:}
\begin{itemize}
\item En Android Studio, ve a \texttt{Build > Build Bundle(s) / APK(s) > Build APK(s)}.
\item Espera a que Android Studio termine de compilar el proyecto. La APK generada estará disponible en el directorio \texttt{app/build/outputs/apk/debug/}.
\end{itemize}
\begin{figure}[h]
\centering
\includegraphics[width=0.8\textwidth]{images/generacion_xxxxxxxx.jpg}
\caption{Captura de pantalla de Android Studio durante el proceso de generación de la APK.}
\label{fig:generacion_apk}
\end{figure}
\item \textbf{Transferencia de la APK a un Dispositivo:}
\begin{itemize}
\item Conecta tu dispositivo Android a tu computadora mediante un cable USB.
\item Transfiere la APK generada al almacenamiento del dispositivo.
\end{itemize}
\item \textbf{Instalación de la APK:}
\begin{itemize}
\item En tu dispositivo Android, abre un explorador de archivos.
\item Navega hasta donde hayas transferido la APK.
\item Toca la APK para comenzar el proceso de instalación.
\item Sigue las instrucciones en pantalla para completar la instalación.
\end{itemize}
\begin{figure}[h]
\centering
\includegraphics[width=0.3\textwidth]{images/instalacion_xxxxxxxxx.jpg}
\caption{Captura de pantalla del proceso de instalación de la APK en un dispositivo Android.}
\label{fig:instalacion_apk}
\end{figure}
\item \textbf{Ejecución de la Aplicación:}
\begin{itemize}
\item Una vez instalada, puedes encontrar y ejecutar la aplicación como cualquier otra aplicación en tu dispositivo Android.
\end{itemize}
\end{enumerate}
\subsection{Funcionalidades principales y cómo utilizarlas}
\subsubsection{Página de Inicio}
% Adjuntar captura de pantalla
La página de inicio cuenta con tres botones principales:
\begin{itemize}
\item \textbf{Iniciar sesión con Google:} Permite a los usuarios iniciar sesión utilizando sus cuentas de Google.
\item \textbf{Crear una cuenta:} Permite a los nuevos usuarios crear una cuenta en la aplicación.
\item \textbf{Iniciar sesión con usuario y contraseña:} Permite a los usuarios iniciar sesión utilizando sus credenciales de usuario.
\end{itemize}
Además, en la página de inicio se muestran recomendaciones de películas y películas en tendencia, junto con un buscador para encontrar películas, actores y directores.
\subsubsection{Página de Explorar}
% Adjuntar captura de pantalla
En la página de explorar, los usuarios pueden:
\begin{itemize}
\item \textbf{Filtrar por géneros:} Se puede filtrar la lista de películas por género.
\item \textbf{Ver películas recientes, populares, mejor valoradas y próximos estrenos:} Se muestran listas de películas organizadas por diferentes criterios.
\end{itemize}
\subsubsection{Perfil de Usuario}
% Adjuntar captura de pantalla
En el perfil de usuario, los usuarios pueden gestionar su cuenta, cambiar su foto de perfil y contraseña.
\subsubsection{Mis Listas}
% Adjuntar captura de pantalla
En la sección de "Mis Listas", los usuarios pueden ver y gestionar las listas de películas que han creado.
\section{Arquitectura}
El proyecto de Android Studio sigue una arquitectura basada en el patrón Modelo-Vista-ViewModel (MVVM) junto con elementos de la arquitectura limpia (Clean Architecture).
\subsection{Componentes de la Arquitectura}
\begin{itemize}
\item \textbf{Modelo:} Las \emph{data classes} representan el Modelo en la arquitectura MVVM. Estas clases contienen los datos utilizados en la aplicación, así como la lógica relacionada con los datos.
\item \textbf{Vista:} Los layouts XML definidos en el proyecto representan la Vista en la arquitectura MVVM. Estos layouts definen la estructura visual de la interfaz de usuario de la aplicación.
\item \textbf{ViewModel:} Los conectores mencionados probablemente actúan como el ViewModel en la arquitectura MVVM. Estos conectores actúan como intermediarios entre la Vista y el Modelo, proporcionando los datos necesarios para la interfaz de usuario.
\item \textbf{Firebase:} Se utiliza Firebase para la conexión externa, lo que implica que el proyecto también integra una capa de datos remotos. Firebase puede encajar en la arquitectura limpia como un Adaptador de Interfaces o una capa de Infraestructura, proporcionando acceso a los datos externos.
\end{itemize}
\section{Componentes del Proyecto}
\subsection{Layouts}
Los layouts definidos en el proyecto definen la estructura visual de la interfaz de usuario de la aplicación. Están escritos en XML y pueden incluirse tanto en actividades como en fragmentos.
\subsection{Activities y Fragments}
Las actividades y fragmentos representan las diferentes pantallas y componentes de la interfaz de usuario de la aplicación.
\subsection{Adapters}
Los adapters se utilizan para vincular conjuntos de datos a los componentes de la interfaz de usuario, como los RecyclerViews. Estos adapters pueden proporcionar los datos necesarios desde las data classes.
\subsection{Data Classes}
Las data classes representan los modelos de datos utilizados en la aplicación. Contienen la información necesaria para representar los objetos en la interfaz de usuario.
\subsection{Conectores}
Los conectores se utilizan para interactuar con fuentes de datos externas, como Firebase. Actúan como intermediarios entre los datos externos y la lógica de la aplicación.
\section{Base de datos}
Hemos empleado como base de datos Firestore Database, una de las opciones que nos ofrece Firebase. Firestore Database es una base de datos NoSQL, lo que significa que permite consultar datos fuera de las estructuras tradicionales que se encuentran en las bases de datos relacionales. Para almacenar los datos, hemos creado tres colecciones: Favorites, Lists y Users.
\subsection{Users}
En esta colección guardaremos los datos del inicio de sesión. Es decir, guardaremos el correo electrónico, nombre de usuario, fecha de nacimiento y, por último, nombre y apellidos.
\subsection{Lists}
En esta colección guardaremos la información de la lista. Cuando el usuario cree una lista en la base de datos, se guardará la fecha, el ID, nombre de la lista, la descripción y una lista de películas vacía. Cuando el usuario comience a añadir películas, se guardará la información de la película en la lista de películas.
\section{Documentación de código}
Este proyecto ha sido documentado utilizando Dokka, una herramienta de generación de documentación para proyectos Kotlin. Dokka analiza el código fuente y genera documentación en formato HTML, Markdown o Javadoc a partir de los comentarios del código y las anotaciones especiales.
\subsection{Convenciones de nomenclatura:}
Las convenciones de nomenclatura son reglas y estándares utilizados para nombrar variables, funciones, clases y otros elementos dentro del código. Estas convenciones son importantes para mantener la consistencia y la legibilidad en el código base.
En este proyecto, se siguen las siguientes convenciones de nomenclatura:
\begin{itemize}
\item CamelCase para variables y funciones.
\item PascalCase para clases y tipos.
\item snake\textunderscore case para constantes y variables.
\item UPPERCASE para constantes inmutables.
\end{itemize}
Se recomienda seguir estas convenciones de nomenclatura en todo el código para mantener la coherencia y facilitar la comprensión del mismo.
\subsection{Comentarios de código}
\begin{itemize}
\item Para documentar clases, funciones y propiedades, se utilizan comentarios de bloque en formato KDoc, comenzando con /** y terminando con */.
\item Los comentarios KDoc pueden incluir etiquetas especiales como @param para describir los parámetros de una función, @return para describir el valor de retorno, y otras etiquetas como @throws, @see, entre otras.
\begin{figure}[h]
\centering
\includegraphics[width=1\textwidth]{images/ejemploDokka.png}
\caption{Ejemplo de función documentada con dokka}
\label{fig:instalacion_apk}
\end{figure}
\item Además de los comentarios KDoc, Dokka también admite anotaciones especiales dentro del código fuente, como @Deprecated para marcar elementos obsoletos y proporcionar una razón para su deprecación.
\end{itemize}
\section{Pruebas}
Durante el desarrollo de Filmosis, se llevaron a cabo diversas pruebas para garantizar la calidad y el funcionamiento adecuado de la aplicación. A continuación, se describen las principales pruebas realizadas:
\subsection{Pruebas Unitarias}
Las pruebas unitarias se centran en probar unidades individuales de código, como métodos o funciones, de manera aislada del resto del sistema. Estas pruebas se utilizan para verificar que cada unidad de código funcione correctamente según lo esperado. En Filmosis, se escribieron pruebas unitarias para verificar el comportamiento de funciones específicas dentro de los componentes de la aplicación, como la lógica de negocios, el manejo de datos y las interacciones con las API externas.
\subsection{Pruebas de Integración}
Las pruebas de integración evalúan la interacción entre diferentes componentes o módulos de la aplicación para asegurar que funcionen correctamente juntos. Estas pruebas son útiles para identificar problemas de comunicación o interoperabilidad entre los distintos elementos de la aplicación. En el caso de Filmosis, se realizaron pruebas de integración para verificar la comunicación adecuada entre las diferentes capas de la aplicación, como la interfaz de usuario, la lógica de negocios y el acceso a datos.
\subsection{Pruebas de Aceptación del Usuario (UAT)}
Las pruebas de aceptación del usuario implican validar la funcionalidad de la aplicación desde la perspectiva del usuario final. Estas pruebas se centran en asegurar que la aplicación cumpla con los requisitos y expectativas del usuario, así como en identificar posibles áreas de mejora desde una perspectiva de experiencia de usuario. En el caso de Filmosis, se realizaron pruebas de UAT para evaluar la usabilidad, la accesibilidad y la satisfacción general del usuario con la aplicación.
\subsection{Pruebas Unitarias en Fragmentos}
Se llevaron a cabo pruebas unitarias en los fragmentos de la aplicación para garantizar su correcto funcionamiento y comportamiento esperado. A continuación, se describen las pruebas realizadas en los fragmentos `PeliculaSeleccionadaFragment` y `ExploreFragment`:
\subsubsection{PeliculaSeleccionadaFragment}
En el fragmento `PeliculaSeleccionadaFragment`, se realizaron varias pruebas para verificar el correcto funcionamiento del cálculo del rating de la película.
\begin{itemize}
\item \textbf{testCalculoEstrellas\_devuelve\_la\_calificación\_esperada}: Esta prueba se encarga de verificar si el cálculo del rating se realiza correctamente y devuelve la calificación esperada. Para esto, se simulan diferentes escenarios, incluyendo una calificación de cero y la calificación máxima, y se verifica si el rating calculado coincide con el rating esperado.
\item \textbf{testCalculoEstrellas\_puntaje\_cero}: En esta prueba se verifica el comportamiento del cálculo del rating cuando la calificación de la película es cero. Se asegura de que el rating calculado sea igual a cero, como se espera.
\item \textbf{testCalculoEstrellas\_puntaje\_maximo}: Esta prueba evalúa el cálculo del rating cuando la calificación de la película alcanza el valor máximo posible. Se verifica si el rating calculado coincide con el número máximo de estrellas, asegurando que el rating se muestre correctamente en la interfaz de usuario.
\end{itemize}
Estas pruebas aseguran que el cálculo del rating en el fragmento `PeliculaSeleccionadaFragment` funcione correctamente en una variedad de situaciones, garantizando una experiencia consistente para el usuario.
\subsubsection{ExploreFragment}
En el fragmento `ExploreFragment`, se llevaron a cabo pruebas para validar el funcionamiento de la vista de búsqueda y los botones de filtro. En la prueba `testSearchView`, se simula el ingreso de una consulta de búsqueda y se verifica que el resultado de la búsqueda sea visible en el RecyclerView correspondiente. En la prueba `testFilterButtons`, se realiza una acción de clic en un botón de filtro y se asegura que el RecyclerView de películas filtradas se actualice correctamente.
Estas pruebas unitarias en los fragmentos son fundamentales para garantizar un comportamiento consistente y sin errores en la aplicación Filmosis.
\subsubsection{AuthActivityUnitTest}
La clase \texttt{AuthActivityUnitTest} contiene pruebas unitarias para verificar el comportamiento de la sesión de usuario al iniciar la aplicación. A continuación, se describe la prueba realizada en esta clase:
\begin{itemize}
\item \textbf{test session with existing session}: Esta prueba verifica el comportamiento de la sesión cuando ya existe una sesión iniciada al iniciar la aplicación. Se simula una sesión previamente iniciada almacenando un correo electrónico y un proveedor en las preferencias compartidas. Luego, se llama al método \texttt{session()} de la actividad de autenticación para verificar su comportamiento. Finalmente, se verifica que, como resultado de tener una sesión iniciada, la visibilidad del diseño principal (\texttt{mainLayout}) de la actividad sea invisible, indicando que la actividad debería redirigir al usuario automáticamente a la pantalla principal de la aplicación, omitiendo la pantalla de inicio de sesión.
\end{itemize}
Esta prueba unitaria asegura que el comportamiento de la sesión de usuario en la aplicación sea coherente y que se maneje correctamente la existencia de una sesión previamente iniciada al iniciar la aplicación.
\subsubsection{MoviesAccessTest}
La clase \texttt{MoviesAccessTest} contiene pruebas unitarias para verificar el funcionamiento del acceso a películas en la aplicación Filmosis. A continuación, se describen las pruebas realizadas en esta clase:
\begin{itemize}
\item \textbf{listPopularMovies\_success}: Esta prueba verifica el comportamiento de la función \texttt{listPopularMovies()} cuando la solicitud de películas populares tiene éxito. Se simula la respuesta exitosa del servicio de API de TMDb, lo que debería proporcionar una lista de películas. Se espera que la lista de películas devuelta no esté vacía, lo que indica que se recuperaron películas populares correctamente.
\item \textbf{listPopularMovies\_failure}: Esta prueba verifica el comportamiento de la función \texttt{listPopularMovies()} cuando la solicitud de películas populares falla. Se simula una respuesta de error del servicio de API de TMDb con un código de estado 404. Se espera que la lista de películas devuelta sea nula, indicando que no se pudieron recuperar películas populares debido a un error en la solicitud.
\end{itemize}
Estas pruebas unitarias garantizan que el acceso a películas en la aplicación Filmosis se maneje correctamente tanto en casos de éxito como de fallo, proporcionando una experiencia de usuario consistente y confiable.
\subsection{Pruebas de Interfaz de Usuario (UI)}
Para asegurar el correcto funcionamiento de la interfaz de usuario de la aplicación, se realizaron pruebas de UI utilizando Espresso, un framework de pruebas de interfaz de usuario para aplicaciones Android. A continuación, se detallan las pruebas realizadas en la clase \texttt{CrearCuentaGUI}, que se encargan de verificar el proceso de creación de cuenta en la aplicación:
\subsubsection{CrearCuentaGUI}
La clase \texttt{CrearCuentaGUI} contiene pruebas de interfaz de usuario para el proceso de creación de cuenta en la aplicación. Estas pruebas cubren diversos aspectos de la interfaz de usuario, incluyendo la interacción con diferentes elementos de la pantalla y la validación de los datos ingresados. A continuación, se describen las acciones realizadas y las verificaciones realizadas en estas pruebas:
\begin{itemize}
\item \textbf{Crear cuenta con datos válidos:} Se simula el proceso de creación de cuenta ingresando datos válidos en los campos requeridos, como nombre de usuario, correo electrónico y contraseña. Se verifica que al hacer clic en el botón "CREAR CUENTA", se complete el proceso de registro correctamente sin errores.
\item \textbf{Intento de crear cuenta con una cuenta existente:} Se simula un escenario en el que se intenta crear una cuenta con datos que ya están asociados a una cuenta existente en la base de datos. Se espera que al hacer clic en el botón "CREAR CUENTA", se muestre un mensaje de error indicando que la cuenta ya existe y que el proceso de registro no se complete.
\item \textbf{Validación de campos requeridos:} Se realizan pruebas para verificar que los campos obligatorios, como nombre de usuario, correo electrónico y contraseña, deben ser completados antes de poder crear una cuenta. Se verifica que al intentar crear una cuenta con campos vacíos, se muestren mensajes de error indicando que los campos son obligatorios.
\item \textbf{Selección de fecha de nacimiento:} Se simula la interacción del usuario con el campo de fecha de nacimiento, seleccionando una fecha específica. Se verifica que la fecha seleccionada se muestre correctamente y que el usuario pueda confirmar la selección.
\end{itemize}
\subsubsection{AccederCuentaGUIespresso}
La clase \texttt{AccederCuentaGUIespresso} contiene pruebas de interfaz de usuario utilizando Espresso para verificar el proceso de inicio de sesión en la aplicación. A continuación, se detallan las acciones realizadas y las verificaciones realizadas en estas pruebas:
\begin{itemize}
\item \textbf{Acceso a la pantalla de inicio de sesión:} La prueba comienza simulando el clic en el botón "CREAR CUENTA" en la pantalla de inicio. Luego, se hace clic en el botón "VOLVER" en la pantalla de registro para regresar a la pantalla de inicio, y finalmente se hace clic en el botón "ACCEDER" para acceder a la pantalla de inicio de sesión.
\item \textbf{Intento de inicio de sesión con datos de cuenta incorrectos:} Se simula el ingreso de datos de cuenta incorrectos, como una dirección de correo electrónico incompleta y una contraseña incorrecta. Se espera que al hacer clic en el botón "INICIAR SESIÓN", no se complete el inicio de sesión y se muestren mensajes de error indicando los campos incorrectos.
\item \textbf{Intento de inicio de sesión con datos de cuenta válidos:} Se ingresan datos de cuenta válidos, incluida una dirección de correo electrónico válida y la contraseña correspondiente. Luego, se hace clic en el botón "INICIAR SESIÓN" y se verifica que el proceso de inicio de sesión se complete correctamente, permitiendo al usuario acceder al contenido protegido de la aplicación.
\end{itemize}
Estas pruebas de interfaz de usuario garantizan que el proceso de inicio de sesión en la aplicación funcione correctamente y proporcione una experiencia fluida para el usuario.
\section{Análisis de requisitos y especificaciones}
\begin{minipage}{0.4\textwidth}
\includegraphics[width=\textwidth]{images/version.png}
\end{minipage}
\hfill
\begin{minipage}{0.55\textwidth}
Esta aplicación solo está operativa para dispositivos móviles que tengan Android como sistema operativo. Para realizar este proyecto, hemos utilizado la versión de distribución API Pie, API LEVEL 28, con una distribución acumulativa del 86.4\%. Es decir, esta aplicación solo soporta versiones con Android 9.0 como mínimo.
\end{minipage}
\section{Consideraciones de Seguridad y Privacidad}
En nuestro proyecto, nos tomamos muy en serio la seguridad y la privacidad de nuestros usuarios. Implementamos diversas medidas para garantizar la protección de la información confidencial y mantener la integridad de los datos. A continuación, destacamos algunas de estas consideraciones:
\begin{itemize}
\item Almacenamiento Seguro: Todos los datos sensibles se almacenan de forma segura utilizando protocolos de encriptación. Esto garantiza que la información confidencial, como contraseñas o datos personales, esté protegida contra accesos no autorizados.
\item Política de Contraseñas: Aunque mencionamos que no almacenamos contraseñas, es importante destacar que fomentamos prácticas seguras de contraseñas entre nuestros usuarios. Recomendamos el uso de contraseñas únicas y complejas, así como la habilitación de la autenticación de dos factores cuando sea posible.
\item Protección de Datos Personales: Cumplimos con las regulaciones de protección de datos, como el Reglamento General de Protección de Datos (GDPR), para garantizar que los datos personales de nuestros usuarios estén protegidos y se utilicen de manera ética y legal.
\item Auditorías de Seguridad: Realizamos auditorías regulares de seguridad para identificar posibles vulnerabilidades en nuestro sistema y tomar medidas correctivas de manera proactiva. Esto nos ayuda a garantizar la integridad y la confidencialidad de los datos de nuestros usuarios.
\item Transparencia y Comunicación: Mantenemos una comunicación abierta y transparente con nuestros usuarios sobre las medidas de seguridad y privacidad implementadas en nuestro proyecto. Esto les permite estar informados y tomar decisiones fundamentadas sobre su participación en nuestra plataforma.
\end{itemize}
En resumen, nuestra prioridad es garantizar la seguridad y la privacidad de nuestros usuarios en todo momento. Estamos comprometidos a seguir mejorando nuestras prácticas de seguridad y privacidad para mantener la confianza de nuestra comunidad de usuarios.
\section{Publicación y distribución}
\subsection{Instrucciones para compilar y generar versiones de la aplicación}
Para compilar y generar versiones de la aplicación, sigue estos pasos:
\begin{enumerate}
\item Dirígete al repositorio de GitHub de Filmosis: \url{https://github.com/agarciagale/Filmosis.git}.
\item Haz clic en el botón "Code" y copia el enlace proporcionado.
\item Abre tu terminal y ejecuta el siguiente comando para clonar el repositorio:
\begin{verbatim}
git clone <enlace_del_repositorio>
\end{verbatim}
\item Asegúrate de tener instalado un IDE compatible con Kotlin, como Android Studio.
\item Navega hasta el directorio raíz del proyecto clonado en tu terminal.
\item Ejecuta el siguiente comando para compilar la aplicación:
\begin{verbatim}
./gradlew build
\end{verbatim}
Esto generará un archivo .jar en el directorio de salida del proyecto.
\item Para generar una versión lista para distribuir, utiliza Gradle con el siguiente comando:
\begin{verbatim}
./gradlew assembleRelease
\end{verbatim}
Esto generará una versión de la aplicación lista para ser distribuida.
\end{enumerate}
\subsection{Proceso de publicación en tiendas de aplicaciones o distribución interna}
Para publicar la aplicación en tiendas de aplicaciones como Play Store, sigue estos pasos:
\begin{enumerate}
\item Sigue los pasos específicos de cada tienda de aplicaciones. Normalmente, necesitarás crear una cuenta de desarrollador y seguir las pautas de publicación proporcionadas por la tienda.
\item Si deseas distribuir la aplicación internamente, puedes utilizar servicios como Firebase App Distribution o Google Play Console (para distribución cerrada). Configura los ajustes necesarios y sigue las instrucciones proporcionadas por el servicio elegido.
\end{enumerate}
\section{Mantenimiento y contribuciones}
\subsection{Políticas de Ramificación}
En nuestro proyecto, hemos adoptado un enfoque de control de versiones utilizando un modelo de ramificación simple. Hemos mantenido dos ramas principales:
\begin{itemize}
\item \textbf{main}: En esta rama principal, se desarrolla el proyecto de manera activa. Aquí se encuentran las últimas características implementadas y correcciones de errores.
\item \textbf{Release}: Una vez que el proyecto está listo para ser lanzado como producto, lo subimos a la rama Release. Esta rama contiene versiones estables del software que han pasado por pruebas exhaustivas y están listas para su implementación.
\end{itemize}
\subsection{Proceso de Reporte de Fallos y Gestión de Problemas}
\textbf{Reporte de Fallos:}
Si los usuarios encuentran algún fallo o bug, pueden reportarlo de las siguientes maneras:
\begin{enumerate}
\item \textbf{Portal de Problemas en GitHub}: Los usuarios pueden navegar al apartado de "Issues" en nuestro repositorio de GitHub. Allí, podrán ver los problemas reportados por otros usuarios y contribuir a solucionarlos si lo desean.
\item \textbf{Contacto con el Equipo de Desarrollo}: Los usuarios también pueden ponerse en contacto directamente con cualquiera de los desarrolladores para informar sobre un error que hayan encontrado.
\item \textbf{Pull Requests}: Si un usuario identifica un error y puede proporcionar una solución, puede enviar un "pull request" con los cambios propuestos. Esto permite una colaboración directa en la resolución de problemas.
\end{enumerate}
\textbf{Mejoras al Proceso:}
Para mejorar nuestro proceso de gestión de problemas y contribuciones, estamos considerando implementar las siguientes mejoras:
\begin{itemize}
\item \textbf{Portal de Soporte Centralizado}: Estamos trabajando en la creación de un portal de soporte centralizado donde los usuarios puedan registrar sus problemas de manera estructurada, proporcionando información detallada sobre el error encontrado.
\item \textbf{Formulario de Reporte de Errores}: Estamos desarrollando un formulario de reporte de errores que estandarizará la información recopilada y facilitará el seguimiento y la resolución de problemas.
\item \textbf{Automatización de Gestión de Problemas}: Estamos explorando opciones para automatizar la gestión de problemas utilizando herramientas de seguimiento de problemas, lo que nos permitirá asignar responsabilidades y realizar un seguimiento más eficiente del progreso de cada problema reportado.
\end{itemize}
Estas mejoras están destinadas a hacer que nuestro proceso de reporte de fallos y gestión de problemas sea más eficiente y transparente, garantizando una mejor experiencia para nuestros usuarios y una colaboración más efectiva dentro de nuestro equipo de desarrollo.
\section{Recursos adicionales}
\textbf{Documentación oficial de Kotlin}: \\
\url{https://kotlinlang.org/docs/home.html} \\
\\
\textbf{Tutoriales en YouTube}: \\
\url{https://youtu.be/dpURgJ4HkMk?si=k95-dp7pOh9wQ-0w} \\
\url{https://www.youtube.com/watch?v=KYPc7CAYJOw} \\
\url{https://youtu.be/jjzQvNRVhx8?si=NMKF_urWQw9Lp668} \\
\url{https://youtu.be/vJapzH_46a8?si=2y6kzU5f11wO4W0g} \\
\url{https://youtube.com/playlist?list=PL_QrnahGtqYAtYIoGod00kutYTvhq4HMU&si=bJn_PD4a1aPIUULR} \\
\\
\textbf{Comunidades y foros}: \\
\url{https://es.stackoverflow.com/} \\
\\
\textbf{Documentación TMDB}: \\
\url{https://developer.themoviedb.org/reference/intro/getting-started} \\
\\
\textbf{ChatGPT}: \\
\url{https://chat.openai.com/}
\section{Contacto}
Nos podéis contactar de la siguiente manera:
\\
\\
Adrián García Galera: \texttt{[email protected]} \\
Aritz Arrondo Villaplana: \texttt{[email protected]} \\
Kaiet Jiménez Aldasoro: \texttt{[email protected]}
\end{document}