{"id":22214328,"url":"https://github.com/stephsako/footlite","last_synced_at":"2026-04-19T06:39:53.874Z","repository":{"id":110222887,"uuid":"168131228","full_name":"StephSako/FootLite","owner":"StephSako","description":" Android application recovering JSON data from the football-data.org API","archived":false,"fork":false,"pushed_at":"2019-12-02T12:38:16.000Z","size":15899,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T06:28:51.671Z","etag":null,"topics":["alwaysdata","android","api-rest","get-post","java","mvc","retrofit","sqlite","svg-images"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StephSako.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-01-29T09:53:41.000Z","updated_at":"2023-01-07T15:13:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"07b45981-8098-4f4e-8a53-63e73e69ed66","html_url":"https://github.com/StephSako/FootLite","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/StephSako/FootLite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StephSako%2FFootLite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StephSako%2FFootLite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StephSako%2FFootLite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StephSako%2FFootLite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StephSako","download_url":"https://codeload.github.com/StephSako/FootLite/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StephSako%2FFootLite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279029160,"owners_count":26088794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alwaysdata","android","api-rest","get-post","java","mvc","retrofit","sqlite","svg-images"],"created_at":"2024-12-02T21:15:39.414Z","updated_at":"2025-10-14T23:58:12.820Z","avatar_url":"https://github.com/StephSako.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Description du projet\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/6/1574517326-20191123-144951.jpg\" width=\"18%\"\u003e\u003cbr\u003e\u003ci\u003e\u003clegend\u003eLogo de l'application\u003c/legend\u003e\u003c/i\u003e\u003c/p\u003e\n\nProjet de développement mobile de 4ème année à l'ESIEA, utilisant le pattern MVC pour une application Android codée en Java.\n\nL'application **FootLite** traite des données reçues au format JSON récupérées via requêtes HTTP GET sécurisées depuis l'API REST de \u003ca href=\"https://www.football-data.org/\"\u003efootball-data.org\u003c/a\u003e relative à des compétitions, équipes, matches, historiques de rencontres et joueurs de football des huit principaux championnats européens, à savoir la **Bundesliga** (Allemagne), la **Ligue 1** (France), la **Primera Division** (Espagne), la **Premier League** (Angleterre), la **Serie A** (Brésil et Italie), l'**Eredivisie** (Pays-Bas) et enfin la **Primeira Liga** (ou \"Liga NOS\", Portugal).\n\nL'utilisateur a également la possibilité de s'inscrire et de se connecter à un compte dans lequel il renseignera son pseudo, mot de passe ainsi que le club qu'il supporte. De plus, il pourra parier sur les matches de son choix des 8 championnats.\nJ'ai donc développé \u003ca href=\"https://github.com/StephSako/FootLite-PHP-REST-API\"\u003emon API REST\u003c/a\u003e implémentée en PHP sur un serveur mutualisé Linux grâce à l'hébergeur Web \u003ca href=\"https://www.alwaysdata.com/fr/\"\u003ealways-data\u003c/a\u003e dans le but de gérer des comptes et des paris.\n\n# Outils et technologies de développement\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://uploads-ssl.webflow.com/5b2117aebeee55aa5a8260df/5b3ad6f600c8d86a49530010_android-studio.png\" width=\"16%\"\u003e\u003c/p\u003e\n\n- **\u003ca href=\"https://developer.android.com/studio\"\u003eAndroid Studio\u003c/a\u003e** est un environnement de développement pour développer des applications mobiles Android.\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://miro.medium.com/max/1030/0*0RDQH_SlaGamudtr.jpg\" width=\"16%\"\u003e\u003c/p\u003e\n\n- **\u003ca href=\"https://square.github.io/retrofit/\"\u003eRetrofit2\u003c/a\u003e** est une librairie permettant de réaliser des appels à des webservices REST sur Android.\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://huddle.eurostarsoftwaretesting.com/wp-content/uploads/2018/10/pm-logo-vert.png\" width=\"24%\"\u003e\u003c/p\u003e\n\n- **\u003ca href=\"https://www.getpostman.com/\"\u003ePostman\u003c/a\u003e** est un envrionnement de développement permettant de visualiser les réponses d'API sous différents formats, pour différentes requêtes HTTP.\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://www.primefaces.org/wp-content/uploads/2016/10/feature-8.png\" width=\"15%\"\u003e\u003c/p\u003e\n\n- **\u003ca href=\"https://www.getpostman.com/\"\u003eMaterial design\u003c/a\u003e** est un ensemble de règles de design proposées par Google et qui s'appliquent à l'interface graphique des logiciels et applications.\n\n## Consignes et fonctionnalités implémentées :\n  - Une quinzaine d'écrans (4 activités et 12 fragments)\n  - Utilisation de *RecyclerView*, *ViewPager*, *WebView*, *GoogleMap*, *ProgressBar* stylisés\n   - Une dizaine d'appels WebService :\n\t   - API REST de football avec méthodes HTTP @GET\n\t   - API REST développée en PHP et hébergée sur un serveur Linux avec méthodes HTTP @GET \u0026 @POST (gestions des comptes et paris sportifs)\n   - Stockage des données en cache :\n\t   - SharedPreferences\n\t   - Base de données locale SQLite\n   - Architecture MVC\n   - SplashScreen au démarrage de l'application\n   - GitFlow respecté (master → developp → features → #...)\n   - Animations entre les écrans\n   - Option de recherche d'équipes dans la BDD locale\n   - Utilisation du Material Design \u0026 migration vers androidx\n   - Préférences SharedPreferences :\n\t\t- Affichage des logos\n\t\t- Activation de la mise en cache au démarrage de l'application\n\n## Navigation dans l'application :\nL'application **FootLite** est composée des vues suivantes :\n* Activité principale composée d'une *Navigation Drawer* permettant la navigation entre chaque championnats et activités listés ci-dessous\n* Activités de connexion \u0026 d'inscription à un compte FootLite\n* Fragment principal listant les matches de la saison de l'équipe supportée\n* Fragment détaillant un match (boutons de paris, score, dates, historique des rencontres, ...)\n* Fragment d'une compétition composée d'un *ViewPager* de deux fragments :\n\t* son classement\n\t* les matches de toutes ses équipes\n* Fragment détaillant une équipe à l'aide d'un *ViewPager* composé de 4 fragments :\n\t- les matches de la saison\n\t- l'équipe (joueurs et staff)\n\t- carte *Google Maps* situant le club avec le nom du stade\n\t- page Web officiel du club affiché\n* Fragment présentant un joueur\n* Activité de recherche d'une équipe ou de son championnat\n* Activité pour effectuer des modifications de son compte FootLite\n* Activité des paramètres de l'application\n* Fragment des crédits\n\n# API REST - Récupération des données à afficher\nDans l'optique de récupérer un nombre conséquent de données, j'ai choisi l'API REST sportive \u003ca href=\"https://www.football-data.org/\"\u003efootball-data.org\u003c/a\u003e.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://www.football-data.org/assets/logo.jpg\" width=\"50%\"\u003e\u003c/p\u003e\n\nAfin d'accéder aux services de l'API, nous devons créer un compte et ainsi obtenir un tocken\u003csup\u003e1\u003c/sup\u003e qui sera passé dans le header de la requête. Tous les WebServices sont à appeler avec la méthode HTTP @GET (pattern *Singleton* \u0026 *Facade*). De plus, les requêtes utilisent une couche de transport sécurisée (TSL Connection).\n\nLes contrôleurs sont basés sur le pattern de l'injection de dépendances.\n\n**_ATTENTON : cette API restreint à 10 appels/min. Pour la première utilisation, la mise en cache est activée afin de remplir une première fois la base de données locale. Une fois l'application installée, désactivez-la dans les préférences pour ne plus utiliser 8 appels à chaque redémarrage de l'application._**\n\n\u003csup\u003e1\u003c/sup\u003e *token* : Jeton d'authentification, séquence de lettres et de chiffres en guise de mot de passe pour une authentification forte.\n\n### Structure MVC du code Java\n\n```\n+-- app/\n|   +-- manifests/\n|   |   +-- AndroidManifest.xml\n|   +-- java/\n|   |   +-- com.example.footballapi/\n|   |   |   +-- controleur/\n|   |   |   |   +-- (*.java)\n|   |   |   +-- model/\n|   |   |   |   +-- model_dao/\n|   |   |   |   |   +-- (*.java)\n|   |   |   |   +-- model_recyclerview/\n|   |   |   |   |   +-- classement/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   +-- matches/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   +-- squad/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   +-- model_retrofit/\n|   |   |   |   |   +-- competition/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   +-- player/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   +-- restService/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   +-- team/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   +-- model_session_manager/\n|   |   |   |   |   |   +-- (*.java)\n|   |   |   |   +-- model_view_pager/\n|   |   |   |   |   |   +-- competition/\n|   |   |   |   |   |   |   +-- (*.java)\n|   |   |   |   |   |   +-- team/\n|   |   |   |   |   |   |   +-- (*.java)\n|   |   |   +-- view/\n|   |   |   |   +-- activities/\n|   |   |   |   |   +-- (*.java)\n|   |   |   |   +-- fragments/\n|   |   |   |   |   +-- (*.java)\n|   +-- res/\n|   |   +-- anim/, drawable/, layout/, menu/, values/, xml/\n|   |   |   +-- (*.xml)\n|   |   +-- mipmap/\n|   |   |   +-- (*.png)\n+-- svgloader/\n+-- Gradle Scripts/\n```\n\n# Implémentation d'une API REST en PHP via hébergeur Web (serveur Linux mutualisé)\nAfin de pouvoir gérer librement les comptes des utilisateurs ainsi que leurs paris, j'ai choisi de développer une API REST en PHP, grâce aux multiples services que propose l'hébergeur web \u003ca href=\"https://www.alwaysdata.com/fr/\"\u003ealways-data\u003c/a\u003e, afin de réaliser des requêtes HTTP @POST.\nCette solution me permet de stocker et d'avoir accès à 100 Mo de code sur un serveur Linux (notamment grâce à l'accès distant \u003ca href=\"https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/41773-la-connexion-securisee-a-distance-avec-ssh\"\u003eSSH\u003c/a\u003e) et de gérer une base de données MySQL.\n\nVoici le schéma relationnel de la base de données :\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574346595-mld-ad.png\"\u003e\u003c/p\u003e\n\nJ'ai également structuré mes fichiers de code PHP selon le modèle MVC :\n\n```\n+-- www/\n|   +-- bet/\t\t\t\tContrôleurs des paris\n|   |   +-- *.php\n|   +-- supporter/\t\t\tContrôleurs des supporters\n|   |   +-- *.php\n|   +-- config/\t\t\t\tModèle de la BDD\n|   |   +-- bdd.php\n|   +-- objects/\t\t\tModèles\n|   |   |   +-- supporter.php\n|   |   |   +-- bet.php\n|   +-- rest.php\n```\n*Le fichier* **rest.php** *est chargé de récupérer les données envoyées par les requêtes SQL et de les convertir au bon format JSON.*\n\nLe code est disponible \u003ca href=\"https://github.com/StephSako/FootLite-PHP-REST-API\"\u003eici\u003c/a\u003e.\n\n# Enchaînement et compositions des écrans\n\n### SplashScreen\nEn ouvrant l'application, un SplashScreen apparaît, laissant le temps au programme de mettre en cache\u003csup\u003e2\u003c/sup\u003e les classements et équipes des championnats. Une animation de rotation zoom-dézoom est lancée.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574369228-screenshot-20191121-214631-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n### Connexion \u0026 inscription à son compte FootLite\n\nVoici l'écran de connexion où doivent être renseignés le pseudo et le mot de passe :\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574346856-screenshot-20191120-095852-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n* Cet écran apparaît lorsque l'utilisateur n'est pas connecté, donc lorsque les SharedPreferences relatives au compte sont vides. Après connexion, ses données personnelles ainsi que l'ensemble de ses paris sont mis à jour dans les SharedPreferences (le tableau de paris est donc sérialisé).\n\nVoici l'écran d'inscription où doivent être renseignés le pseudo, le mot de passe et l'équipe supportée en la sélectionnant grâce à un Spinner (les équipes sont récupérées grâce aux données stockées dans la base de données locale SQLite) :\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574346990-screenshot-20191120-095858-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\nIl est possible de se déconnecter depuis le drawer. Les données en cache relatives aux comptes sont donc vidées.\n\n## Liste des matches de l'équipe supportée\n\n### Navigation Drawer\n\nUne fois l'utilisateur connecté, le header de la Navigation Drawer se met à jour faisant apparaître le logo de l'équipe supportée ainsi que le nom du supporter.\nDe plus, ce drawer permet de rechercher une équipe et son championnat, de naviguer entre les différentes compétitions, de modifier son compte FootLite, de gérer les paramètres de l'application, de se déconnecter puis de voir les crédits.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574351279-nd-up.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574351282-nd-down.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\nLe fragment initialisé est une RecyclerView listant les matches de la saison (compétition d'appartenance et potentielle participation à la Ligue des Champions) de l'équipe ainsi supportée. La RecyclerView s'initialise à la date du dernier match joué pour éviter de scroller la liste à date actuelle.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574351618-screenshot-20191120-100221-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\nLes matches terminés sont encadrés en noir, programmés en bleu ciel, annulés en rouge, en live en vert clair puis ceux en pause (mi-temps par exemple) en orange.\n\n## Compétition\n\nEn cliquant sur une compétition, l'écran charge un ViewPager révélant le classement et tous les matches de la saison en cours.\nAfin de générer les différentes RecyclerView de l'application, j'ai utilisé un pattern Adapter.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574352699-screenshot-20191120-095816-footlite.jpg\" width=\"35%\"\u003e\n    -\n\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574352728-screenshot-20191121-145626-footlite.jpg\" width=\"35%\"\u003e\u003c/p\u003e\n\nS'il n'y a pas de connexion Internet, les équipes dans le classement ne sont pas cliquables et un message d'avertissement apparaît.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574370394-screenshot-20191121-220600-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## L'équipe\n\nNous pouvons accéder à cet écran depuis plusieurs sources :\n* En recherchant une équipe : une liste apparaît et affiche les équipes correspondant au mot-clef saisi, grâce à une requête SQL réalisée sur la base de données locale. Les boutons permettent d'accéder à sa compétition ou à sa fiche.\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574352962-screenshot-20191120-100201-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n* En cliquant sur le logo de l'équipe supportée dans la NavigationDrawer\n* En cliquant sur un item dans les classements\n\nUn ViewPager de 4 fragments nous expose différentes informations :\n\n* une RecyclerView des matches de l'équipe. Il est possible de cliquer sur un match pour accéder à ses détails.\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574353458-screenshot-20191120-125643-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n* une RecyclerView du line-up (joueurs et staff).  Il est possible de cliquer sur un joueur/personnel pour accéder à sa fiche.\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574353491-screenshot-20191120-125653-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n* une carte Google Maps situant le club (librairie **Geocoder**) avec un marker titré du nom du stade (j'ai dû utiliser l'API Maps de Google et m'authentifier grâce à un token)\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574353512-screenshot-20191120-125659-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n* un composant WebView affichant le site officiel du club\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574353592-screenshot-20191120-125704-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## Fiche d'un match\n\nEn cliquant sur un match depuis une RecyclerView, nous avons accès à la fiche d'un match renseignant les logos et noms des deux équipes, la date et stade de la rencontre, le score à la mi-temps (\"MT\") et à la fin du match, ainsi qu'un historique des dernières rencontres avec le nombre de match disputés, de buts et des statistiques de victoires/défaites matérialisées par des ProgressBar stylisés.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574353817-screenshot-20191120-184726-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\nLe bandeau vert central permet au supporters de parier sur le match en cliquant sur le bouton associé à un potentiel vainqueur. Le nombre de parieurs ainsi que les **côtes** sont renseignés et mis à jour dès le pari effectué.\nIl n'est pas possible de parier une seconde fois, ni lorsque le match a un autre statut que *programmé* (autrement dit, un match *suspendu*, *annulé*, *en live* ou *terminé* n'est plus susceptible d'être parié ... tel est le principe du pari sportif 😁). De plus, les cotes ne seront affichées qu'une fois le pari effectué.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574354182-screenshot-20191121-173556-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## Fiche d'un joueur\n\nCette fiche détaille des informations personnelles sur le joueur.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574357233-screenshot-20191120-152920-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## Modifier son compte FootLite\n\nL'utilisateur a la possibilité de modifier ses informations personnelles telles que son pseudo, mot de passe et équipe supportée. Les inputs sont bloqués le temps que la requête renvoie une réponse.\nLes informations sont alors immédiatement mises à jour dans le header du drawer de l'activité principale.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574354575-screenshot-20191120-125719-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## Crédits\n\nUne description, les coordonnées du développeur ainsi que le Git du projet sont renseignés.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574354382-screenshot-20191120-190138-footlite.jpg\" width=\"40%\"\u003e\u003c/p\u003e\n\n## Préférences\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://image.noelshack.com/fichiers/2019/47/4/1574354681-screenshot-20191121-173557-footlite-convertimage.jpg\" width=\"60%\"\u003e\u003c/p\u003e\n\n**Affichage des images** : l'uilisateur peut choisir d'afficher ou non les logos des clubs dans le classement ainsi que dans l'écran de détails d'une équipe.\n\n\u003csup\u003e2\u003c/sup\u003e **Mise en cache** : l'utlisateur peut choisir d'activer ou non la mise en cache des classements dans la base de données locale au démarrage de l'application.\n\n# Mise en cache des données\n\n### SharedPreferences\n\nLe contrôleur/helper SessionManagerPreferences donne un accès aux données stockées en cache et permet de manager les paramètres et les données du compte FootLite, comme effectuer des opérations de type CRUD , vérifier que l'utilisateur est bien connecté ou vider le cache lors d'une déconnexion.\n\n### DAO (Data Access Object)\n\nL'API me renvoie beaucoup de données que je traite dans mon application, à savoir 8 championnats composés d'une vingtaine d'équipes chacun, elles-mêmes composées de plus de 40 matches et d'une trentaine de joueurs chacune; j'ai décidé de stocker les classements de chaque championnat.\n\nAfin d'assurer une persistance longue des classements, j'ai choisi d'opter pour la DAO qui permet de stocker des données dans une base de données locale SQLite. Voici sa structure :\n\n| Colonne       | Type    | Nullable | Description                                                        |\n|:-------------:|:-------:|:--------:|--------------------------------------------------------------------|\n| idCompet (PK) | integer | Non      | ID de la compétition associée à l'équipe                           |\n| idTeam        | integer | Non      | ID de l'équipe                                                     |\n| position      | integer | Non      | Position de l'équipe dans le classement de la compétition associée |\n| nomTeam       | text    | Non      | Nom de l'équipe                                                    |\n| diff          | integer | Non      | Différence de buts de l'équipe (NbButsMarqués - NbButsConcédés)    |\n| points        | integer | Non      | Points de l'équipe dans le classement de la compétition associée   |\n| crest         | text    | Oui      | URL de l'image de l'équipe (format SVG, PNG ou GIF)                |\n\nAu démarrage, s'il y a Internet et que l'utilisateur a activé cette fonctionnalité dans les préférences, la base de données locale est mise à jour.\n\n# Problèmes rencontrés\n\n### API\nDes informations ne sont pas fournies par l'API comme certaines URL d'images pour des équipes ainsi que pour les matches. Par conséquent, j'ai opté pour la création d'un helper qui fournit les URL d'images manquantes en passant le nom de l'équipe en paramètre.\nDe plus, le championnat brésilien a lieu de Mai à Décembre; les matches ne sont plus consultables en dehors de cette plage.\n\u003cbr\u003e\n### URL d'images\n\nCharger des images au format SVG depuis une URL est une tâche compliquée. J'ai d'abord recherché du côté de Glide et de la librairie svg:android, mais les images ne s'affichaient pas correctement. J'ai finalement trouvé une \u003ca href=\"https://github.com/ar-android/AndroidSvgLoader\"\u003elibrairie\u003c/a\u003e qui parse et affiche les images dans des ImageView correctement (il faut parfois faire des va-et-vient avec les RecyclerView pour les afficher).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephsako%2Ffootlite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstephsako%2Ffootlite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephsako%2Ffootlite/lists"}