diff --git a/README.md b/README.md index da32bae..4b2a780 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,81 @@ # Linaris_MAUI_SAE_201 -Linaris est disponible sur Windows et Android via Visual Studio. +[![Build Status](https://codefirst.iut.uca.fr/api/badges/corentin.lemaire/Linaris_MAUI_SAE_201/status.svg)](https://codefirst.iut.uca.fr/corentin.lemaire/Linaris_MAUI_SAE_201) +[![Code Smells](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=Linaris_LEMAIRE_LABORIE&metric=code_smells&token=11b49481ce480d3422347a93fb591c5604680414)](https://codefirst.iut.uca.fr/sonar/dashboard?id=Linaris_LEMAIRE_LABORIE) -#### Description de l'architecture + +## Overview + +Linaris is a music and playlist management application, as well as a source of information about various popular albums and tracks. Our app is available on Windows and Android platforms through Visual Studio. + +## Documentation + +You can find all the documentation [here](https://codefirst.iut.uca.fr/git/corentin.lemaire/Linaris_MAUI_SAE_201#Documentatiob) + +### Prerequisites + +- Visual Studio 2022 +- Git +- .NET 7.0 SDKFramework +- Android SDK + +## Getting Started + +1. Clone the repository +2. Open **'Linaris.sln'** in Visual Studio 2022 +3. Start the application on the platform you want (for Android, you must use an Emulator) +5. Build and run the Linaris + +## Features + +- Manage your own titles +- Manage playlists +- Listen to your titles +- Get informed on famous albums and titles + +## Not available features yet + +- Customize listening of your music (balance, pitch...) +- Login system +- Listening mode systems (nightcore, vynile, cinema...) + +## Known issues + +### Cross-platform + +- Playing music reset when a page change + +### Android + +- Cut custom titles display in a playlist +- Footer not aestetic +- Footer controls too hard to find + +### Windows + +- The Layout doesn't disappear as the screen is shrinking + +## Built with + +- [.NET MAUI 7.0](https://learn.microsoft.com/fr-fr/dotnet/maui/get-started/installation) + * [C#](https://learn.microsoft.com/fr-fr/dotnet/csharp/) + * [XAML](https://learn.microsoft.com/fr-fr/dotnet/desktop/wpf/xaml/?view=netdesktop-7.0) +- [CodeFirst](https://codefirst.iut.uca.fr/) + * [Drone](https://codefirst.iut.uca.fr/drone) + * [SonarQube](https://codefirst.iut.uca.fr/sonar/) +- [Visual Studio 2022](https://visualstudio.microsoft.com/fr/vs/) +- [Doxygen](https://www.doxygen.nl/index.html) + +## Contributors + +* [LEMAIRE Corentin](https://codefirst.iut.uca.fr/git/corentin.lemaire) +* [LABORIE Louis](https://codefirst.iut.uca.fr/git/louis.laborie) + + +## Documentation + +### Description de l'architecture ![DA](Images/Diagramme_architecture.png) @@ -42,7 +114,7 @@ Enfin, nous avons utilisé *Drone* pour notre **CI** et **CD**. En effet, nous a --- -## Diagramme de classe +### Diagramme de classe ```plantuml @startuml @@ -233,44 +305,44 @@ Manager o--> "+ CurrentPlaying" CustomTitle @enduml ``` -### Explications +#### Explications ###### Note *Les classes CustomTitle, Playlist et Manager héritent de l'interface INotifyPropertyChanged afin de permettre le DataBinding de ces classes* -#### Album +##### Album Cette classe sert à modéliser des **albums** de musique. Ils ne sont pas jouables et sont uniquement implantés à titre **informatif**. Dans ce but, elle comporte plusieurs attributs comme un *nom*, une *description*, des *informations complémentaires* ou encore une *URL* pour son image (la pochette). -#### Artist +##### Artist Cette classe sert à modéliser les ***artistes*** qui réalise les albums. Il ne possède qu'un *nom* en atrribut. -#### Title +##### Title Cette classe sert à modéliser différents **titres**. Il possède plusieurs attributs comme un *nom*, une *URL* pour son image (cover) ainsi que des *informations complémentaires*. -#### InfoTitle +##### InfoTitle Cette classe hérite de **Title**. Elle hérite donc de tout ses attributs. Comme son nom l'indique, ces titres ont comme spécificité d'être uniquement informatif. Ils sont contenus dans les albums. Elle possède également d'autres attributs comme une description, un artiste (classe **Artist**) et une liste d'artiste pour les featuring. -#### CustomTitle +##### CustomTitle Cette classe hérite de **Title**. Elle hérite donc de tout ses attributs. Ces titres sont destinés à pouvoir être ajouter dans des playlists et à être jouer. Hormis les attributs hérités, cette classe possède un attribut path (chemin) qui lui permet d'indiquer où se situe le fichier audio. -#### Playlist +##### Playlist Cette classe possède une structure similaire à la classe **Album**. Elle contient des titres personnalisés (**CustomTitle**). Les morceaux sont joués dans un ordre précis (du premier jusqu'au dernier). Cette classe hérite des attributs de Title. Cette classe permet la gestion des playlists, soit l'accès à la musique suivante, précédente en fonction de la demande de l'utilisateur (en boule, aléatoire). Cela permet une lecture de musiques d'une playlist en boucle sans problème. -#### Manager +##### Manager Notre classe **Manager** est une interface entre le code-behind et les vues. Il permet de gérer les données grâce au *DataManager* et de **gérer** les fonctionnalités de l'application comme les playlists. Cette classe fonctionne avec le *parton de conception de façade*, étant une interface, un point d'entrée de l'application vers le modèle. De plus, nous utilisons un deuxième patron de conception, qui est la *stratégie*, avec une *injection de dépendance* par le constructeur de la classe. En effet, afin de créer un Manager, il faut joindre la méthode de sérialisation (stubs ou LINQ dans notre cas). @@ -546,43 +618,43 @@ LinqXmlSerialization o--> "+ StubInfoTitle" StubInfoTitle ``` -### Explications +#### Explications -#### IDataManager +##### IDataManager Cette **interface** nous permet de passer d'un sérialisation à une autre. En effet, chacune des méthodes qui implémenteront IDataManager auront les méthodes telles que les *CRUD* et celles de la gestion de la *sérialisation*. -#### LinqXmlSerialization +##### LinqXmlSerialization Notre **sérialisation** fonctionne avec lecture/écriture dans des fichiers **XML**. Pour cela, nous utilisons la bibliothèque *LINQ_XML* qui nous permet de créer et de modifier les différents fichiers. Pour la sérialisation des *CustomTitle* et des *Playlists* nous utilisons le LINQ. Cependant, pour les classes *InfoTitle*, *Artist* et *Album*, ces données sont récupérées des Stubs, étant statiques et à but *informatif*. Cette sérialisation a été testée et approuvée sur **Windows** et **Android**. -#### StubManager +##### StubManager Le StubManager est un **point d'entrée** vers les Stubs, permettant de les **gérer** avec des *requêtes CRUD*. Ces Stubs vont permettre de *tester* l'application, le modèle et l'application en générant des données directement dans le code. Cette classe permet de séparer le code de chaque Stub afin de le gérer avec plus de facilité. -#### StubAlbum +##### StubAlbum Le StubAlbum permet de **générer des albums** avec des informations écrites dans le code. Il permet également de les **gérer**. Cette classe utilise *StubArtist* afin de lier l'album avec l'artiste. Ce stub est aussi utilisé afin d'afficher ces albums à titre *informatif*. -#### StubArtist +##### StubArtist Le StubArtist permet de **créer des informations sur des artistes**S. Il permet de plus de créer les artistes pour les *InfoTitle* à afficher dans les titres informatifs présents dans les albums. -#### StubInfoTitle +##### StubInfoTitle Le StubInfoTitle est un stub avec des valeurs pour les **titres informatifs** affichés dans les albums déjà rédigées. Il est donc utilisé dans la *sérialisation LINQ* aussi. -#### StubCustomTitle +##### StubCustomTitle Le StubCustomTitle permet de **tester la gestion des titres personnalisés** avec des valeurs prédéfinies. Ce stub n'est utilisé que pour les *tests* et le *debug*. -#### StubPlaylist +##### StubPlaylist Le StubPlaylist **créé des informations** écrites dans le code afin de **tester** les méthodes et la classe des playlists. Elle n'est pas utilisée par la sérialisation LINQ. @@ -634,23 +706,23 @@ Manager *--> "+ DataManager" IDataManager @enduml ``` -### Explications +#### Explications Ce diagramme représente les **liens** entre les deux diagrammes ci-dessus. --- -## Diagramme de paquetage +### Diagramme de paquetage ![DP](Images/Diagramme_paquetage.png) -### Explications +#### Explications Notre projet est un projet MAUI se nommant **Linaris**. Une erreur a été effectuée lors de la conception, ce qui fait que nos vues portent le même nom. Pour les différencier, le paquet *Linaris* qui concerne les vues sera écrit en italique. Tous ces projets sont en .NET 7.0. -#### Model +##### Model Le paquet **Model** est une bibliothèque de classes C#. Certaines se trouvent à la racine de celle-ci. D'autres se trouvent dans des sous-dossiers comme la sérialisation (**Serialization**) ou encore les stubs (**Stub**). @@ -663,21 +735,21 @@ Stub contient quant à lui StubAlbum, StubArtist, StubCustomTitle, StubInfoTitle Enfin, Serialization contient la classe LinqXmlSerialization -#### Linaris +##### Linaris Ce paquet contient nos différentes vues codées en C#/XAML. Nos vues (*Linaris*) ont besoin de Model afin d'effectuer le data-binding pour que notre application ne soit pas uniquement graphique. Linaris contient les classes AlbumPage, App, AppShell, FooterPage, Layout, LocalFilesPage, MainPage, MauiProgram, PlaylistPage et PlaylistsPage. -#### Console +##### Console Ce paquet contient une application console C#. Elle contient donc nos tests fonctionnels de notre application. Pour effectuer différents tests fonctionnels sur nos différentes classes du modèle, l'application console (**Console**) a besoin de celui-ci. Console ne contient que la classe Program. -#### TestUnitaires +##### TestUnitaires Ce paquet contient les tests unitaires de nos différentes classes. Il utilise *xUnit* pour les réaliser. Pour effectuer ceux-ci, le paquet correspondant (**TestUnitaires**) dépend du modèle. @@ -686,9 +758,9 @@ TU_Album, TU_Artist, TU_CustomTitle, TU_InfoTitle, TU_Manager, TU_Playlist et TU --- -## Diagramme de séquence +### Diagramme de séquence -### LoadSerialization() +#### LoadSerialization() ```plantuml @@ -712,7 +784,7 @@ end ``` -#### Explications +##### Explications Notre sérialisation permet de sauvegarder nos données dans des fichiers *XML* ainsi que de charger dans des collections les données contenues dans ceux-ci. @@ -728,7 +800,7 @@ Cette méthode est appelée lorsque l'utilisateur démarre l'application *Linari | 6 | La liste chargée des informations est retournée au Manager | | 7 | Après les chargement, le Manager a accès aux données utilisateurs et aux titres informatifs, albums et artistes, permettant l'affichage des albums sur la page d'accueil au lancement de l'application, mais aussi des autres données sur les différentes vues de Linaris | -### NextTitle() +#### NextTitle() ```plantuml @startuml @@ -758,7 +830,7 @@ end @enduml ``` -#### Explications +##### Explications Lorsque l'utilisateur clique sur le bouton **suivant**, la fonction **NextTitle** de la classe C# *Manager* est appelée. Si la variable *currentPlaylist* est initialisée, la fonction **NextTitle** de la classe *Playlist* est appelée. Si le booléen *loop* est vrai, la fonction retourne le titre actuel. Si le booléen *loop* est faux et le booléen *shuffle* est vrai, @@ -779,7 +851,7 @@ la fonction retourne un titre aléatoire en générant un nombre aléatoire comp --- -#### Description de l'architecture +### Description de l'architecture Notre programme se compose de deux parties distinctes : les **vues** et le **modèle**.