Skip to content
This repository has been archived by the owner on Jun 8, 2019. It is now read-only.
Hippolyte Barraud edited this page Apr 16, 2015 · 1 revision
<title>Hello!</title> <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

Epitech MicroNet

MicroNet est un client iOS (et bientôt Android !) permettant d’accéder à l’Intranet de l’école Epitech. Il est développé en C# et utilise le framework Xamarin (anciennement Monotouch) pour générer du code natif.
Le code utilise l’abstraction de Xamarin.Forms pour déclarer des interfaces “Device agnostic” : le même code compile pour Android, Windows Phone et iOS (voir OSX et Windows) en utilisant les API de chaque OS.

Xamarin est gratuit pour les étudiants !

Note:

  • N’hésitez pas à déclarer des bug en ouvrant des issues. Si vous avez une idée de fonctionnalité, faites une pull request ou codez-la vous même !
  • Si vous voulez participer au développement, n’hésiter pas à ouvrir une branch !

Screenshots

Profil Projet Trombi Planning Notifications E-Learning

Fonctionnalités

  • Accès à tous les profils, notes et log des étudiants du groupe IONIS.
  • Possibilité de voir toutes les notes pour une activités, avec les commentaires.
  • Gestion du planning étudiant (inscription | désinscription | validation du token).
  • Voir qui est inscrit à telle ou telle sessions. Voir quel profs gèrent telle activité.
  • Synchronisation optionnelle de votre planning avec l’application calendrier (seulement les événements auxquelles vous êtes inscrit).
  • Accès aux projets en cours, aux groupes et aux sujets des projets.
  • Recherche avec auto-complétion parmi les membres du groupe IONIS.
  • Gestion des notifications de l’intra (avec pop-up sur le Device).
  • Accès aux ressources d’E-Learning (y compris les vidéos). Pratique quand internet flanche pendant la piscine.
  • Actualisation des données en arrière-plan.
  • Interface fluide et réactive.
  • Gestion sécurisé des identifiants via Keychain. Protection par TouchID si disponible. (Parce qu’un password en clair dans les fichiers d’une app, ça fait mauvais effet…)
  • Toutes les orientations supportés. Toute les tailles d’écran supportés.
  • Support de l’iPad

Le code

La solutions se compose de trois projets :

  • Epitech.Intra.API : Contiens le code métier de l’application, les classes de donnés et les points d’entrés de l’API.
  • Epitech.Intra.SharedApp : Contiens le code partagé de toutes les applications iOS et Android. Défini les interfaces et les mécaniques d’utilisation.
  • Epitech.Intra.iOS : Contiens l’application iOS. Utile exclusivement pour les appels aux APIs spécifiques au device, comme la gestion de la Keychain ou EventKit pour iOS.

Note:

Vous devez compiler OxyPlot avec la solution. OxyPlot est un super projet open-source pour tracer des graph. Vous pouvez aussi utiliser le paquet NuGet.

Ajouter une fonctionnalité d’API

Voici un exemple d’appel à l’intra pour récupérer le json de la page d’accueil :

    public async Task<Welcome> GetWelcome ()
    {
        //Déclaration du client http.
        HttpClient client = new HttpClient ();

        try {
            //Envoi de la requête (GetHeader : génération d'un header avec les identifiants de l'utilisateur).
            var result = await client.PostAsync (buildUri ("/"), GetHeader ());
            //On retourne l'objet JSON désérialisé via Json.Net ou null si l'appel n'a pas abouti.
            return !result.IsSuccessStatusCode ? null : Newtonsoft.Json.JsonConvert.DeserializeObject<Welcome> (await result.Content.ReadAsStringAsync ());
        } catch (Exception e) {
            //Si il y a une erreur, on la throw sur la pile d'appel.
            throw new Exception ("Impossible de récupérer le message de bienvenue", e);
        }
    }

Cette fonction demande la ressource “/” (c’est à dire http://intra.epitech.eu/), puis converti le json de la réponse en un objet Welcome via la fonction DeserializeObject(string jsoncontent). Les appels susceptibles de générer des erreurs sont entourés de try-catch. Les exceptions sont renvoyés à la fonction appelante si lieu.

Note:

La fonction retourne un type Task<Welcome>, elle est donc non bloquante. Toute les fonction de l’API doivent respecter ce format.

Maintenant, il ne reste plus qu’a consumer l’API via ces fonctions.

Le système de page et les appels à l’API

Toutes les pages d’interface utilisateur (présentent dans Epitech.Intra.SharedApp.Views) héritent de la classe IntraPage qui définit la gestion des données, l’invalidation et qui appelle les fonctions d’API si besoin. Son fonctionnement ressemble à ceci :

Created with Raphaël 2.1.2PagePageIntraPageIntraPageAPIAPIintra.epitech.euintra.epitech.euInitIntraPageRefreshDataAppel de fonctionrequêteréponse de l'intraDisplayContent || DisplayError

Pour l’utiliser, il faut d’abord appeller la fonction

InitIntraPage (Type type, Func<Task<object>> function, TimeSpan dataInvalidation);

Le premier paramètre est un typeof de la classe de la page, le second un pointeur sur la fonction d’API voulu et le troisième un TimeSpan d’invalidation des données. Une surcharge de cette fonction existe et permet d’ajouter un quatrième paramètre pour passer une string à la fonction d’API. Par exemple pour la page du profil l’appel est :

// Ma page est de type "Profile", la fonction est GetUser, les données s'invalident après 1 heure et le login de mon utilisateur est TargetUser.
InitIntraPage (typeof(Profile), App.API.GetUser, new TimeSpan (1, 0, 0), TargetUser);

L’appel à cette fonction doit se faire avant tout autre, de préférence dans le constructeur de la classe.

La classe IntraPage définit deux fonctions pouvant être override par la classe fille :

  • public virtual void DisplayContent (object data), qui est automatiquement appelé lorsque le contenu de la page est disponible. Data contiens les donnée retourné par l’API. L’objet doit être casté pour être utilisé. C’est dans cette fonction qu’il faudra creer/mettre à jour la page avec les nouvelles data.
  • public virtual void DisplayError (Exception ex), qui permet de customiser l’affiche par défaut des erreurs. Ceci est optionnel.

Elle définit aussi deux fonctions publiques :

  • public async Task RefreshData (bool forceFetch, string dat), qui demande à renouveler les donnée de la page. forceFetch permet de forcer l’appel à l’API (outrepasser l’invalidation automatique), le second permet de passer une string à la fonction d’API. Cette fonction affiche automatiquement sur la page un ActivityIndicatorpour signaler à l’utilisateur le chargement. Si les données sont toujours valides, alors DisplayContent sera immédiatement appelé avec les données présentent en local.
  • public virtual async Task<object> SilentUpdate (string param), qui permet la même chose que RefreshData mais est silencieuse, elle n’appellera pas DisplayContentet ne changera pas le contenu de la page. Au contraire, elle retourne directement les données demandé. Elle est très utile pour le PullToRefresh d’une liste par exemple. Cette fonction peut aussi être override pour des cas particuliers si besoin.

Ainsi, pour obtenir les données d’une page, il faut appeler la fonction RefreshData. Cette fonction se charge de tout : verifier l’invalidation des données locale si lieu et fetch via l’API REST d’Epitech si besoin. Une fois les données disponible, RefreshData appellera automatiquement la fonction DisplayContent et il ne vous reste plus qu’à afficher les données. Si une erreur se produit, elle appellera DisplayError.

Note:
Pour toujours afficher à l’utilisateur les données les plus récentes, il est conseillé d’overrider la fonction OnAppearing ()des pages et d’y mettre son appel à RefreshData.

Ce système permet de créer des pages très vite sans ce soucier de comment les données sont gérés, ou même de la gestions des erreurs de l’API, l’objet IntraPage le gère une fois pour toute. De plus, il permet de garder dans les pages un code simple et concis, orienté sur les données, le travail compliqué ce faisant ailleurs.


Contact

Je suis joignable à l’adresse hippolyte.barraud@epitech.eu si vous avez des questions sur l’app ou sur le développement via Xamarin, ou plus généralement sur c# !

Important:

Si quelqu’un est doué en graphisme, ou plus généralement à un gout pour l’esthétisme plus prononcé que moi (ce sera pas dûr), il est le bienvenu ! Actuellement, la beauté du code ne se reflète pas vraiment sur l’interface… enter image description here


Index