Passer au contenu principal
Ce document fait partie du scénario d’architecture Mobile + API et explique comment implémenter l’application mobile sur Android. Veuillez consulter le scénario pour en savoir plus sur la solution mise en œuvre.

Étape 1. Configurer l’application

Projet d’exemple

Téléchargez un projet d’exemple propre à ce tutoriel pour bien démarrer. Télécharger Créer un fork sur GitHub Configuration requise
  • Android Studio 2.3
  • SDK Android 25
  • Émulateur - Nexus 5X - Android 6.0
Afficher la configuration requise

Configurer les dépendances

Pour cette implémentation, nous utiliserons les dépendances suivantes dans le fichier build.gradle de l’application :
  • Auth0.Android : ce package permet d’intégrer Auth0 afin d’authentifier les utilisateurs.
  • OkHttp : ce package fournit un client HTTP pour effectuer des requêtes vers l’API Node.JS.
  • JWTDecode.Android : ce package facilitera le décodage des .
  • AppCompat : ce package nous permet d’utiliser le widget Toolbar pour la navigation dans les activités.

Mettre à jour le manifeste

Ouvrez le fichier AndroidManifest.xml de l’application et ajoutez l’autorisation d’accès à Internet :
Nous mettrons aussi à jour les paramètres de l’application pour utiliser le widget Toolbar :

Définir les valeurs de configuration

Définissez votre , votre domaine Auth0 et l’URL de l’API dans la ressource strings.xml située dans /res/values/strings.xml :
Pour cette implémentation, créez des répertoires pour les activités, les modèles et les utilitaires dans le package de l’application.
  • activities/ : ce package contiendra LoginActivity.java, TimeSheetActivity.java, FormActivity.java et UserActivity.java.
  • models/ : ce package contiendra les modèles de données TimeSheet.java et User.java.
  • utils/ : ce package contiendra UserProfileManager.java, TimeSheetAdapter.java et ImageTask.java

Étape 2. Autoriser l’utilisateur

Mettre à jour le fichier manifeste

Ouvrez le fichier AndroidManifest.xml de l’application et ajoutez l’activité LoginActivity :

Créer l’activité de connexion

LoginActivity gérera l’autorisation de l’utilisateur et sera le premier écran affiché aux utilisateurs. Nous allons créer une méthode login() pour initialiser un WebAuthProvider et démarrer l’authentification. Assurez-vous de fournir le scheme, l’ et le scope appropriés au WebAuthProvider. Pour cette implémentation, nous utiliserons :
  • scheme : demo
  • audience : https://api.exampleco.com/timesheets (l’API Node.JS)
  • response_type : code
  • scope : create:timesheets read:timesheets openid profile email offline_access. Ces scopes nous permettront d’effectuer des requêtes POST et GET vers l’API Node.JS, ainsi que de récupérer le profil de l’utilisateur et un .
Dans la méthode login(), une fois l’authentification réussie, nous redirigerons l’utilisateur vers TimeSheetActivity.

Stocker les identifiants

Pour stocker les identifiants reçus après la connexion, nous utiliserons le CredentialsManager de la bibliothèque Auth0.Android et SharedPreferences pour les stocker. Avant d’initialiser le WebAuthProvider dans la méthode login(), nous pouvons créer le CredentialsManager. En passant un AuthenticationAPIClient au CredentialsManager, celui-ci peut actualiser les s’ils sont expirés.
Mettez maintenant à jour la méthode login() pour que les identifiants soient stockés par le CredentialsManager après une authentification réussie.

Étape 3. Récupérer le profil de l’utilisateur

Créer le modèle utilisateur

Créez un modèle utilisateur simple qui sera utilisé par UserProfileManager et UserActivity.

Stocker le profil de l’utilisateur

Pour gérer le stockage des renseignements du profil de l’utilisateur, nous allons créer une classe de gestion UserProfileManager. Le UserProfileManager utilisera SharedPreferences pour stocker les données.
Ensuite, mettez à jour la méthode login() dans LoginActivity pour récupérer le et extraire le profil de l’utilisateur du jeton à l’aide de la bibliothèque JWTDecode.Android. Stockez ensuite le profil de l’utilisateur avec UserProfileManager.

Étape 4. Afficher des éléments de l’interface de façon conditionnelle en fonction du scope

Pour déterminer si un utilisateur a les autorisations requises pour effectuer certaines actions, nous pouvons examiner le scope qui lui a été accordé pendant le processus d’authentification. Le scope contient une chaîne regroupant tous les scopes accordés à un utilisateur. Pour déterminer si un scope précis a été accordé, il suffit donc de vérifier si la chaîne de scopes contient la sous-chaîne correspondant à ce scope.

Stocker les scopes

D’abord, nous pouvons mettre à jour la classe User pour y stocker les scopes accordés, puis fournir une méthode utilitaire, hasScope(), qui peut servir à déterminer si les scopes accordés incluent un scope particulier :
N’oubliez pas non plus de mettre à jour le UserProfileManager afin d’y stocker le champ supplémentaire :
Ensuite, mettez à jour le LoginActivity pour transmettre le scope afin qu’il soit stocké dans l’objet User :

Afficher le menu d’approbation en fonction du scope

Nous pouvons maintenant afficher certains éléments de l’interface utilisateur selon qu’un utilisateur s’est vu accorder un scope particulier. Par exemple, nous avons un élément du menu d’approbation qui ne devrait être visible que pour les utilisateurs ayant obtenu le scope approve:timesheets. Ci-dessous, vous pouvez voir le code de la classe BaseActivity qui vérifie si un utilisateur possède le scope approve:timesheets et, en conséquence, définit la visibilité de l’élément de menu qui affiche l’activité d’approbation :

Étape 5. Appeler l’API

Mettre à jour le manifeste

Ouvrez le fichier AndroidManifest.xml de l’application et ajoutez TimeSheetActivity :

Créer les mises en page de l’activité Timesheets

Créez ensuite timesheet_activity.xml, la mise en page de TimeSheetsActivity :
Le widget ListView contiendra des entrées individuelles représentées par la mise en page item_entry.xml :
Et pour la navigation de la Toolbar de TimeSheetActivity, nous allons créer la ressource de menu timesheet_action_menu.xml (/res/menu/) :

Créer le modèle Timesheet

Créez un modèle pour travailler avec les données de feuille de temps dans nos vues :

Créer l’adaptateur de feuille de temps

Le TimeSheetAdapter est une classe utilitaire qui prend un tableau d’entrées de feuille de temps et les associe au ListView de TimeSheetActivity.

Créer l’activité Timesheet

La TimeSheetActivity affiche les entrées de feuille de temps de l’utilisateur connecté, stockées sur le serveur.
  • @string/api_url est défini sur http://10.0.2.2:8080/timesheets afin que l’émulateur Android puisse se connecter à l’API Node.js exécutée sur http://localhost:8080.
  • La méthode callAPI() récupère les feuilles de temps à partir de l’API Node.js.
  • La méthode processResults() prend la réponse JSON de callAPI() et la convertit en objets TimeSheet.
  • Les méthodes onCreateOptionsMenu() et onOptionsItemSelected() gèrent la navigation du widget Toolbar.

Étape 6. Afficher le profil de l’utilisateur

Pour afficher le profil de l’utilisateur connecté, nous allons créer UserActivity, la mise en page correspondante user_activity.xml, ainsi que user_action_menu.xml pour la navigation dans la Toolbar. La vue affichera le nom, le courriel et la photo de profil de l’utilisateur.

Mettre à jour le manifeste

Ouvrez le fichier AndroidManifest.xml de l’application et ajoutez UserActivity :

Créer les mises en page de l’activité utilisateur

Créez ensuite user_activity.xml, la mise en page de UserActivity, avec un ImageView pour la photo de profil et des TextViews pour le nom et le courriel de l’utilisateur.
Et créez le user_actions_menu.xml pour la Toolbar de UserActivity :

Charger la photo de profil à partir de l’URL

Pour charger la photo de profil de l’utilisateur à partir de l’URL, créez une tâche qui hérite de AsyncTask et s’exécute en arrière-plan.

Créer l’activité utilisateur

Dans la méthode onCreate(), nous allons récupérer les informations de l’utilisateur depuis UserProfileManager et renseigner les valeurs dans la vue. Comme précédemment, les méthodes onCreateOptionsMenu() et onOptionsItemSelected() assurent la fonctionnalité de navigation du widget Toolbar.

Étape 7. Formulaire pour créer de nouvelles feuilles de temps

Créez ensuite le FormActivity et la mise en page pour permettre la création de nouvelles entrées de feuille de temps.

Mettre à jour le manifeste

Ouvrez le fichier AndroidManifest.xml de l’application et ajoutez-y FormActivity :

Créer les mises en page de l’activité du formulaire

Créez la mise en page form_activity.xml avec des champs EditText pour le nom du projet et le nombre d’heures travaillées, ainsi qu’un DatePicker pour la date de travail.
Et créez le form_actions_menu.xml pour la Toolbar de FormActivity :

Créer l’activité du formulaire

  • @string/api_url est défini sur http://10.0.2.2:8080/timesheets afin que l’émulateur Android puisse se connecter à l’API Node.JS exécutée sur http://localhost:8080.
  • La méthode onCreate() initialise le formulaire et recueille les données saisies pour la méthode postAPI() lorsque le bouton d’envoi est activé.
  • La méthode postAPI() envoie à l’API Node.JS, au format JSON, les données saisies récupérées du formulaire.
  • La méthode clearForm() efface les champs du formulaire.
  • Les méthodes onCreateOptionsMenu() et onOptionsItemSelected() gèrent la navigation du widget Toolbar.

Tester l’application

Avant de continuer, assurez-vous d’avoir implémenté l’API Node.JS.
  1. Démarrez l’API en accédant à son répertoire dans votre terminal, puis en exécutant la commande node server.
  2. Ouvrez l’application mobile dans Android Studio et cliquez sur le bouton Run.
  3. Sélectionnez l’appareil virtuel Nexus 5X API 23.
  4. Une fois l’application mobile chargée dans l’émulateur, vous pouvez vous connecter, puis créer et afficher des entrées de feuille de temps à partir de l’API Node.JS en cours d’exécution.
C’est tout ! Vous avez terminé !