Académique Documents
Professionnel Documents
Culture Documents
Département d’informatique
Filière Licence fondamentale
en Sciences Mathématiques et Informatique
intitulé :
Nous dédions ce travail à nos chers parents et bons amis, ainsi qu’à tous ceux qui de
loin ou de près ont contribué à sa réalisation.
i
Remerciements
Nous remercions ALLAH le tout puissant de nous avoir donné le courage, la volonté
et la patience de mener à terme le présent travail.
Nous exprimons aussi notre gratitude à tous les membres du jury d’avoir accepté
d’examiner et d’évaluer ce travail.
Avec beaucoup d’égard, nous ne manquerons pas d’exprimer notre grande recon-
naissance à tous les enseignants et administrateurs de la Faculté des Sciences Rabat.
ii
Résumé
iii
Abstract
iv
Table des matières
Dédicaces i
Remerciements ii
Résumé iii
Abstract iv
1 LA PRÉSENTATION GÉNÉRALE 1
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3 LA CONCEPTION 9
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.3 Diagramme d’activités . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3.1 Diagramme d’activités pour le cas d’utilisation "créer un compte" 10
3.3.2 Diagramme d’activités pour le cas d’utilisation
"s’authetifier" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4 Diagramme de séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4 L’ENVIRONNEMENT DE TRAVAIL 14
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2 Environnement matériel . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
v
4.3 Environnement logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.3.1 Présentation d’ANDROID . . . . . . . . . . . . . . . . . . . . . . 15
4.3.2 Les outils utilisés . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.4 Langages de programmation . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 REALISATION ET TEST 27
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Présentation des interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Conclusion 37
vi
Table des figures
5.2.1 Le logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2.2 Home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.3 Le menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.2.4 Déposer une annonce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.2.5 affichage d’annonce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2.6 Interface d’inscription . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.2.7 Interface de modification du profil . . . . . . . . . . . . . . . . . . . . . 33
5.2.8 Session client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.2.9 Session Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.2.10Interface de gestion des annonces . . . . . . . . . . . . . . . . . . . . . . 36
vii
Introduction Générale
Les Smartphones ont connu un essor très important durant ces dernières années,
ils sont de plus en plus dotés d’une puissance aoivec des fonctionnalités assez évoluées
permettant de créer des applications innovantes et de les distribuer en toute simplicité.
Bien plus que ces appareils nous permettent d’effectuer des appels ou d’envoyer
des SMS, ils sont devenus de véritables outils multimédia permettant d’accéder à tous
les modes de communication si bien que les besoins des utilisateurs sont de plus en plus
croissants et spécifiques en termes d’application pour satisfaire leurs besoins quotidien.
Dans le cadre de notre projet de fin d’étude, nous nous intéressons à développer
une application qui sert à la gestion des annonces, reconnu dans le domaine informatique
par le nom " m-commerce ", cette application est développée sous Android.
Les supports de notre application m-commerce sont les téléphones portable et les
tablettes menés d’un système d’exploitation Android.
L’OS Android est gratuit et open source fondé sur un noyau Linux destiné aux
Smartphones, et autres terminaux mobile comme les tablettes tactiles. Android ne cesse
d’accroitre sa part du marché, En 2015, il est le système d’exploitation le plus utilisé
dans le monde avec plus de 80 % de parts de marché dans les smartphones.
viii
Chapitre 1
LA PRÉSENTATION GÉNÉRALE
1.1 Introduction
Ce chapitre est consacré à la présentation, la précision du cadre du projet et la pro-
blématique puis l’énumération des étapes à suivre pour le réaliser.
1.2 Présentation
Cadre du travail
Ce travail s’inscrit dans le cadre du projet de fin d’études (PFE) pour l’obtention
du diplôme de licence Mathématique et Informatique et cela au terme du cursus de la
formation qui s’est étalée sur trois ans au sein de la faculté des Sciences Rabat. Le su-
jet est intitulé "Développement d’une application Android pour la gestion des annonces ".
Présentation du projet
1
Figure 1.2.1 – architecture 3-tiers
Notre application eeMarket est conçu spécialement pour les appareils Android. Elle
fournit un moyen simple pour chercher dans plusieurs régions du Maroc les annonces
publiées et validées par l’administrateur , notre application permet à n’importe quel
internaute de chercher et visualiser les annonces ainsi de s’inscrire pour devenir un
client qui peut déposer des annonces . notre solution consiste alors à développer une
application mobile sous Android connectée avec la base de données MYSQl, ce qui nous
a mené à écrire et exécuter des scripts PHP en utilisant le protocole HTTP, ensuite coder
les données dans le format JSON, afin de récupérer les données par le client Android
(Figure 1.3.1).
Objectifs visés
Ce projet a pour but de réaliser une application mobile fonctionnelle et esthétiquement
attrayante, de navigation fluide et efficace, facile et simple d’utilisation.
Approches du travail
Le projet comprend deux phases : la première est la recherche d’une solution convenable
pour réaliser l’application, et la deuxième, la phase de conception et de développement.
Phase de recherche
C’est l’étape qui inclut l’étude bibliographique, dans laquelle nous devons saisir les
différentes notions et technologies à utiliser dans le projet, les architectures, etc. Aussi
elle renferme les tests des différentes solutions mises en hypothèse, et les outils nécessaires
pour la réalisation du projet.
1.3 Conclusion
Au terme de ce premier chapitre, nous avons introduit le contexte de notre projet
dont les étapes de réalisation seront décrites d’une manière détaillée dans les chapitres
qui suivent. Le chapitre suivant sera réservé à la spécification détaillée et l’analyse des
différents besoins de notre application.
2
Chapitre 2
L’ANALYSE ET SPÉCIFICATION
DES BESOINS
2.1 Introduction
La phase d’analyse et spécification des besoins présente une étape primordiale dans le
cycle de développement d’un projet. En effet, elle permet de mieux comprendre le travail
demandé en dégageant les besoins des différents utilisateurs que le système doit accomplir.
La convivialité : Le futur logiciel doit être facile à utiliser. En effet, les interfaces
utilisateurs doivent être conviviales c’est-à-dire simples, ergonomiques et adaptées à
l’utilisateur.
3
2.4 Spécifications techniques
— Il faut que toute interface de notre application soit homogène, en effet, les dif-
férentes interfaces doivent suivre le même modèle de représentation (couleurs,
images, textes défilants, etc.).
— Le code doit être extensible et maintenable pour faciliter toute opération d’amé-
lioration ou d’optimisation
4
Figure 2.5.1 – Diagramme de cas d’utilisation
5
2.5.1 Raffinement des cas d’utilisations
6
Raffinement de cas d’utilisation "Déposer une annonce"
7
Raffinement de cas d’utilisation "Supprimer son profil"
2.6 Conclusion
Dans ce chapitre, nous avons énuméré les différents besoins fonctionnels et non fonc-
tionnels de notre application. Ensuite, nous avons fait une étude des différents cas d’uti-
lisation de notre solution. Ce chapitre a été d’une importance cruciale surtout pour la
compréhension des besoins et attentes du client.
8
Chapitre 3
LA CONCEPTION
3.1 Introduction
Dans ce chapitre nous abordons la partie conception du projet, dans laquelle, nous
détaillons les différents éléments de conception, à savoir les diagrammes de séquences, les
diagrammes d’activités et les diagrammes de classes.
9
Classe Utilisateur : est la classe qui contient toutes les informations concernant un
utilisateur ; client ou admin selon le type.
Classe Visiteur : est la classe qui définie les opérations qui peuvent être réalisées
par un visiteur.
Classe Annonce : est la classe qui contient toutes les informations concernant une
annonce.
Classe Inscription : est la classe qui contient toutes les informations concernant
une inscription.
10
3.3.2 Diagramme d’activités pour le cas d’utilisation
"s’authetifier"
11
3.4 Diagramme de séquence
Le diagramme de séquence décrit l’aspect dynamique du système. Il modélise les inter-
actions entre les objets ou entre utilisateur et objet, en mettant l’accent sur la chronologie
des messages échangés.
12
3.5 Conclusion
Dans ce chapitre nous avons détaillé la phase de conception, ainsi nous avons fait
la description des diagrammes de classe et d’activité afin de délimiter le cadre de notre
travail et de préparer pour la prochaine étape.
13
Chapitre 4
L’ENVIRONNEMENT DE TRAVAIL
4.1 Introduction
Ce chapitre est consacré à la présentation de l’environnement matériel et logiciel
utilisés pour le développement de la solution proposé, nous expliquerons éventuellement
nos choix techniques relatif aux langages de programmation et des outils utilisés.
14
4.3 Environnement logiciel
15
Figure 4.3.2 – Cycle de vie d’une application Android
16
4.3.2 Les outils utilisés
Pour réaliser notre application nous avons eu recours aux logiciels suivants :
1. Android studio L’environnement de travail que nous avons utilisé pour la réali-
sation de ce projet est Android studio, qui est annoncé lors de l’événement Google
I/O de mai 2013 . Il s’agit d’un IDE(Integrated Development Environment) conçu
par Google pour faciliter le développement d’apps pour système Android quel que
soit le terminal sous-jacent (smartphone, tablette, montre, TV, Google Glass...).
17
installation : JDK (Java Development Kit)
http ://www.oracle.com/technetwork/java/javase/downloads/index.html
18
Une fois le téléchargement terminé, lancez l’installation.
Sur cet écran, conservez les options Android SDK et Android Virtual Device, mais
ne sélectionnez Performance (Intel
R HAXM) que si vous avez un processeur Intel
capable d’émulation
Le premier répertoire est celui qui indique où sera installé Android Studio et le
deuxième celui où sera installé le SDK. Ce second répertoire risque de peser assez
lourd alors choisissez un disque qui a assez d’espace disque.
19
Si votre ordinateur est suffisamment puissant, cet écran vous propose d’indiquer
quel mémoire vive (RAM) vous souhaitez accorder à l’émulateur Android. La va-
leur par défaut est 2 Go mais vous pouvez indiquer une valeur en choisissant
Custom.
20
Maintenant on va configurer le SDK Manager, nécessaire pour développer une
application Android.
Ce SDK Manager propose tout une liste d’outil nécessaire ou non à installer.De
manière générale, une application développée pour une version précise d’Android
fonctionnera sur les versions suivantes d’Android mais pas sur les versions précé-
dentes.
21
2. Modelio Nous avons choisi pour la modélisation UML de l’application Modelio
qui se caractérise par sa simplicité d’installation et de prise en main . C’est un
outil de création de modèles.
4.Serveur de base de donnée MYSQL Notre choix s’est porté sur le serveur de
base de données MYSQL pour de nombreuses raisons :
C’est un SGBD gratuit et disponible sur de nombreuses plateformes (Unix, Linux,
Windows, MacOs X, Solaris, etc.). Il s’intègre au sein de nombreux serveurs web
(Apache, Microsoft IlS, etc.) et est beaucoup plus adapté à des petites bases de
données.
MySQL est un serveur de base de données très utilisé dans le monde. Il est rapide,
robuste, facile à utiliser et à administrer et dispose d’une documentation complète.
22
5.Serveur SQLite Pour la gestion en local des informations nous avons utilisé la
base SQLite car elle est légère et simple .
6.PHP (PHP :Hypertext Preprocessor)Le langage PHP est le langage utilisé pour
l’écriture de nos scripts, c’est un langage de script HTML, exécuté côté serveur.
Sa syntaxe est empruntée aux langages C, Java et Perl, et est facile à apprendre.
Le but de ce langage est de permettre aux développeurs web d’écrire des pages
dynamiques rapidement.
23
La connectivité aux bases de données est une opération trés importante. Il existe
plusieurs procédures qui permettent depuis un client android, de se connecter à
une base de données.
Dans notre cas,on a choisis d’utiliser la méthodes qui consiste à l’utilisation d’un
fichier PHP qui convertit les données récupérées en format JSON(Le format JSON
est une réprésentation structurée de données en Objet JavaScript, les données sont
maniables très facilement dans ce format qui est aussi une sorte de compression.En
PHP, la fonction json_encode() permet d’encoder en JSON.
Cette méthode est donc très avantageuse , souple et facile à mettre en oeuvre. Le
fichier php consiste à envoyer des requetes sql à la base de données qui contient
la table client et annonce. Il récupère le résultat des requetes, ensuite l’encode en
JSON grêce au simple appel de la fonction json_encode() comme dit précedem-
ment.
Au niveau du client Android, il s’agit de demander au serveur de nous renvoyer
les données grace aux commandes HttpClient, Ensuite, il nous appartient de de-
coder(récuperer les champs) ces données(puisqu’elles sont renvoyées sous forme
d’objet JSON) et les afficher sous forme de liste dans notre cas. Cela se fera en
utilisant une seule classe principale qui va hériter de ListActivity pour faire simple.
24
8.Adobe Photoshop Photoshop est un logiciel de retouche, de traitement et de des-
sin , Il est principalement utilisé pour le traitement de photographies numériques,
mais sert également à la création des images.
nous l’avons utilisé pour la création de la carte interactive et la répartition de ses
régions.
25
4.4 Langages de programmation
JAVA Le langage de programmation utilisé dans le cadre de ce projet Android est
le Java, très répandu dans les développements informatiques actuels. Ce langage
offre un ensemble de librairies qui facilitent le développement et dispose d’une
documentation bien fournie.
XML Pour la réalisation des interfaces graphiques de l’application nous avons utilisé
le langage XML. C’est un langage informatique qui sert essentiellement à sto-
cker/transférer des données de type texte structurées en champs arborescents. Ce
langage est qualifié d’extensible car il permet à l’utilisateur de définir des mar-
queurs (balises) qui facilitent le parcours au sein du fichier et donc la lecture de
l’information. Ce langage est couramment utilisé et son apprentissage est aisé.
4.5 Conclusion
Dans ce chapitre nous avons détaillé les technologies utilisées pour la réalisation de
notre projet ainsi que les différents logiciels ,et langages de programmation avec des liens
d’installation .
26
Chapitre 5
REALISATION ET TEST
5.1 Introduction
Dans ce chapitre, nous nous intéressons à la description de quelques interfaces du
système implémentés dans le cadre de quelques scénarios d’utilisation par des imprimés
écrans.
27
2. Le Home est la page qui s’affichera après le Splashscreen (écran de démarrage) de
l’application. Cette interface affiche une carte interactive du Maroc subdivisée en
12 régions cliquables qui mènent vers l’activité de recherche des annonces.
28
3. Le menu contient un sous menu en commun entre tout les utilisateurs, un autre
pour le client et le dernier pour l’administrateur.
29
4. L’interface de déposition des annonces qui contient un formulaire à remplir par le
client afin de déposer son annonce.
30
5. L’interface d’affichage détaillé d’une annonce.
31
6. l’interface d’inscription dédié aux visiteurs pour créer un compte .
32
7. L’interface qui permet au client de modifier ou supprimer son compte.
33
8. L’interface qui s’affiche après l’authentification du client.
34
9. L’interface qui s’affiche après que l’administrateur s’authentifie.
35
10. L’interface qui permet à l’administrateur de valider, invalider ou supprimer une
annonce.
5.3 Conclusion
Nous sommes parvenus au terme de ce chapitre dont l’objectif principal était de
présenter le résultat final obtenu, à l’aide de quelque imprimés-écrans.
36
Conclusion Générale
Au bout de notre cursus en licence informatique, nous avons été chargés de réaliser
un projet de fin d’études. Ceci nous a amené à découvrir une nouvelle plateforme de
développement et enrichir notre savoir et notre expérience.
37
ANNEXE
Inscription a l’application
1. Le code Java pour l’activité SignUp ; inscription a l’application :
package com.example.eeMarket ;
import android.app.AlertDialog ;
import android.app.ProgressDialog ;
import android.content.DialogInterface ;
import android.content.Intent ;
import android.os.AsyncTask ;
import android.os.Bundle ;
import android.support.design.widget.NavigationView ;
import android.support.v4.view.GravityCompat ;
import android.support.v4.widget.DrawerLayout ;
import android.support.v7.app.AppCompatActivity ;
import android.util.Log ;
import android.view.MenuItem ;
import android.view.View ;
import android.widget.Button ;
import android.widget.EditText ;
import android.widget.Spinner ;
import android.widget.Toast ;
import java.io.BufferedReader ;
import java.io.BufferedWriter ;
import java.io.InputStreamReader ;
import java.io.OutputStream ;
import java.io.OutputStreamWriter ;
import java.io.UnsupportedEncodingException ;
import java.net.HttpURLConnection ;
import java.net.URL ;
import java.net.URLEncoder
import java.util.HashMap ;
import java.util.Map ;
import javax.net.ssl.HttpsURLConnection ;
public class SignUpActivity extends AppCompatActivity implements
38
NavigationView.OnNavigationItemSelectedListener
private static final String TAG =SignInActivity.class.getSimpleName() ;
private Button btnSignin ;
private Button btnLinkToLogin ;
private EditText Name ;
private EditText Phone ;
private EditText Email ;
private EditText Password ;
private ProgressDialog pDialog ;
private SessionManager session ;
private SQLiteHandler db ;
private Spinner spinner1,spinner2 ;
private static final String SIGNIN_URL = AppConfig.URL_REGISTER ;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState) ;
setContentView(R.layout.activity_sign) ;
Name = (EditText) findViewById(R.id.fname) ;
Email = (EditText) findViewById(R.id.email) ;
Password = (EditText) findViewById(R.id.passwd) ;
Phone=(EditText) findViewById(R.id.phone) ;
spinner2=(Spinner) findViewById(R.id.spinner_region) ;
btnSignin = (Button) findViewById(R.id.btnsignin) ;
btnLinkToLogin = (Button) findViewById(R.id.btnLinkTologin) ;
NavigationView navigationView = (NavigationView)
findViewById(R.id.nav_view) ;
navigationView.setNavigationItemSelectedListener(this) ;
db = new SQLiteHandler(getApplicationContext()) ;
// Session manager
session = new SessionManager(getApplicationContext()) ;
// SQLite database handler
db = new SQLiteHandler(getApplicationContext()) ;
// Check if user is already logged in or not
if (session.isLoggedIn())
// User is already logged in. Take him to main activity
Intent intent = new Intent(SignInActivity.this,
MainActivity.class) ;
startActivity(intent) ;
finish() ;
btnLinkToLogin.setOnClickListener(new View.OnClickLstener()
public void onClick(View view)
39
Intent i = new Intent(getApplicationContext(),
LoginActivity.class) ;
startActivity(i) ;
finish() ;
);
btnSignin.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
String name = Name.getText().toString().trim() ;
String email = Email.getText().toString().trim() ;
String password =
Password.getText().toString().trim() ;
String phone = Phone.getText().toString().trim() ;
String region= spinner2.getSelectedItem().toString() ;
if ( !name.isEmpty() && !email.isEmpty() &&
!password.isEmpty() && !phone.isEmpty() &&
!region.isEmpty())
registerUser(name, email, password,phone,region) ;
else
Toast.makeText(getApplicationContext(),
"Please enter your details !", Toast.LENGTH_LONG)
.show() ;
);
private void registerUser(final String name, final String email,
final String password, final String phone, final String region)
class RegisterUser extends AsyncTask<String, Void, String>
ProgressDialog loading ;
@Override
protected void onPreExecute()
super.onPreExecute() ;
loading = ProgressDialog.show(SignInActivity.this,
"Please Wait",null, true, true) ; @Override
protected void onPostExecute(String s)
super.onPostExecute(s) ;
loading.dismiss() ;
Log.d("Erreur On Post", s) ;
Toast.makeText(getApplicationCont
ext(),s,Toast.LENGTH_LONG).show() ;
@Override
protected String doInBackground(String... params)
HashMap<String, String> data = new
HashMap<String,String>() ;
40
data.put("name",params[0]) ;
data.put("email",params[1]) ;
data.put("password", params[2]) ;
data.put("phone", params[3]) ;
data.put("region", params[4]) ;
String
str=params[0]+"
,"+params[1]+","+params[2]+","+params[3]+","+params[4] ;
Log.d("params",str) ;
String result = sendPostRequest(SIGNIN_URL,data) ;
return result ;
RegisterUser ru = new RegisterUser() ;
ru.execute(name, email, password, phone, region) ;
public String sendPostRequest(String requestURL,
HashMap<String, String> postDataParams)
URL url ;
String response = "" ;
try
url = new URL(requestURL) ;
HttpURLConnection conn = (HttpURLConnection)
url.openConnection() ;
conn.setReadTimeout(15000) ;
conn.setConnectTimeout(15000) ;
conn.setRequestMethod("POST") ;
conn.setDoInput(true) ;
conn.setDoOutput(true) ;
OutputStream os = conn.getOutputStream() ;
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8")) ;
writer.write(getPostDataString(postDataParams)) ;
writer.flush() ;
writer.close() ;
os.close() ;
int responseCode=conn.getResponseCode() ;
if (responseCode == HttpsURLConnection.HTTP_OK)
BufferedReader br=new BufferedReader(new
InputStreamReader(conn.getInputStream())) ;
response = br.readLine() ;
else
response="Error Registering" ;
catch (Exception e)
41
e.printStackTrace() ;
return response ;
private String getPostDataString(HashMap<String, String> params) throws
UnsupportedEncodingException
StringBuilder result = new StringBuilder() ;
boolean first = true ; for(Map.Entry<String, String> entry : params.entrySet())
if (first)
first = false ;
else
result.append("&") ;
result.append(URLEncoder.encode(entry.getKey(), "UTF-8")) ;
result.append("=") ;
result.append(URLEncoder.encode(entry.getValue(), "UTF-8")) ;
return result.toString() ;
@Override
public boolean onNavigationItemSelected(MenuItem item)
int id = item.getItemId() ;
if (id == R.id.exp)
startActivity(new
Intent(SignInActivity.this,EmptyActivity.class)) ;
return true ;
else if (id == R.id.sign_in)
startActivity(new Intent(SignInActivity.this,SignInActivity.class)) ;
return true ;
else if (id == R.id.login)
startActivity(new Intent(SignInActivity.this,LoginActivity.class)) ;
return true ;
else if (id == R.id.regs)
startActivity(new Intent(SignInActivity.this,MainActivity.class)) ;
return true ;
else if (id == R.id.adm)
startActivity(new Intent(SignInActivity.this,AdminSpace.class)) ;
return true ; else if (id == R.id.dep)
startActivity(new Intent(SignInActivity.this,AnnonceActivity.class)) ;
return true ; else if (id == R.id.your_announces)
startActivity(new
Intent(SignInActivity.this,Annonce_emailActivity.class)) ;
return true ;
else if (id == R.id.edit)
/*Intent i = new Intent(getApplicationContext(), AdminChoice.class) ;
i.putExtra("id",Id) ;
42
startActivity(i) ;*/
AlertDialog.Builder builder = new
AlertDialog.Builder(SignInActivity.this) ;
builder.setMessage("Choose an action ?") ;
builder.setNegativeButton("Delete", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
Intent i = new Intent(SignInActivity.this, Delete_Account.class) ;
startActivity(i) ;
dialog.cancel() ;
finish() ;
);
builder.setPositiveButton("Edit", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
Intent i = new Intent(SignInActivity.this,
Edit_ProfileActivity.class) ;
startActivity(i) ;
dialog.cancel() ;
finish() ;
);
Aler
tDialog alert11 = builder.create() ;
alert11.show() ;
return true ;
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout) ;
drawer.closeDrawer(GravityCompat.START) ;
return true ;
2. Le code XML :
43
>
<android.support.design.widget.CoordinatorLayout
xmlns :android="http ://schemas.android.com/apk/res/android"
xmlns :app="http ://schemas.android.com/apk/res-auto"
xmlns :tools="http ://schemas.android.com/tools"
android :layout_width="match_parent"
android :layout_height="match_parent"
android :background="@color/bg_login"
android :fitsSystemWindows="true"
tools :context="com.example.jawad.myapplication.MainActivity"
>
<android.support.design.widget.AppBarLayout
android :layout_width="match_parent"
android :layout_height="wrap_content"
android :theme="@style/AppTheme.AppBarOverlay"
> <android.support.v7.widget.Toolbar
android :id="@+id/toolbar"
android :layout_width="match_parent"
android :layout_height=" ?attr/actionBarSize"
android :background="#019ACB"
android :titleTextColor="@color/white"
app :popupTheme="@style/AppTheme.PopupOverlay"
/>
</android.su
pport.design.widget.AppBarLayout>
<LinearLayout
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_gravity="center"
android :orientation="vertical"
android :paddingTop="100dp"
android :paddingLeft="20dp"
android :paddingRight="20dp" >
<EditText
android :id="@+id/fname"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/fname"
android :inputType="text"
44
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
<EditText
android :id="@+id/email"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/email"
android :inputType="textEmailAddress"
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
<EditText
android :id="@+id/passwd"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/passwd"
android :inputType="textPassword"
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
<EditText
android :id="@+id/phone"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/tel"
android :inputType="text"
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
<Spinner
45
android :id="@+id/spinner_region"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :padding="10dp"
android :singleLine="true"
android :entries="@array/region_arrays"
android :prompt="@string/region_prompt"
/>
< !– Login Button –>
<Button
android :id="@+id/btnsignin"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginTop="20dip"
android :background="@color/btn_login_bg"
android :text="Register"
android :textColor="@color/btn_login" />
< !– Link to Login Screen –>
<Button
android :id="@+id/btnLinkTologin"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginTop="40dip"
android :background="@null"
android :text="@string/btn_link_to_login"
android :textAllCaps="false"
android :textColor="@color/white"
android :textSize="20sp" />
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android :id="@+id/nav_view"
android :layout_width="wrap_content"
android :layout_height="match_parent"
android :layout_gravity="start"
android :fitsSystemWindows="true"
app :headerLayout="@layout/nav_header_main2 " />
</android.support.v4.widget.DrawerLayout>
46
3. le code php :
47
Authentification
1. le code Java : package com.example.jawad.myapplication ;
import ...
public class LoginActivity extends Activity implements Navigation-
View.OnNavigationItemSelectedListener
private static final String TAG = LoginActivity.class.getSimpleName() ;
private Button btnLogin ;
private Button btnLinkToRegister ;
private EditText inputEmail ;
private EditText inputPassword ;
private ProgressDialog pDialog ;
private SessionManager session ;
private SQLiteHandler db ;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState) ;
setContentView(R.layout.activity_login) ;
inputEmail = (EditText) findViewById(R.id.email) ;
inputPassword = (EditText) findViewById(R.id.password) ;
btnLogin = (Button) findViewById(R.id.btnLogin) ;
btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen) ;
NavigationView navigationView = (NavigationView) findView-
ById(R.id.nav_view) ;
navigationView.setNavigationItemSelectedListener(this) ;
// Progress dialog
pDialog = new ProgressDialog(this) ;
pDialog.setCancelable(false) ;
// SQLite database handler
db = new SQLiteHandler(getApplicationContext()) ;
// Session manager
session = new SessionManager(getApplicationContext()) ;
// Check if user is already logged in or not
if (session.isLoggedIn())
// User is already logged in. Take him to welcome activity
Intent intent = new Intent(LoginActivity.this, WelcomeActivity.class) ;
startActivity(intent) ;
finish() ;
// Login button Click Event
btnLogin.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
String email = inputEmail.getText().toString().trim() ;
48
String password = inputPassword.getText().toString().trim() ;
// Check for empty data in the form
if ( !email.isEmpty() && !password.isEmpty())
// login user
checkLogin(email, password) ;
else
// Prompt user to enter credentials
Toast.makeText(getApplicationContext(),
"Please enter the credentials !", Toast.LENGTH_LONG).show() ;
);
// Link to Register
btnLinkToRegister.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
Intent i = new Intent(getApplicationContext(),
SignInActivity.class) ;
startActivity(i) ;
finish() ;
);
private void checkLogin(final String email, final String password)
// Tag used to cancel the request
String tag_string_req = "req_login" ;
pDialog.setMessage("Logging in ...") ;
showDialog() ;
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener<String>()
@Override
public void onResponse(String response)
Log.d(TAG, "Login Response : " + response.toString()) ;
hideDialog() ;
try
JSONObject jObj = new JSONObject(response) ;
boolean error = jObj.getBoolean("error") ;
// Check for error node in json
if ( !error)
// user successfully logged in
// Create login session
session.setLogin(true) ;
JSONObject user = jObj.getJSONObject("user") ;
String name = user.getString("name") ;
String email = user.getString("email") ;
// Now store the user in SQLite
49
// Inserting row in users table
db.addUser(name, email) ;
// Launch welcome activity
Intent intent = new Intent(LoginActivity.this,WelcomeActivity.class) ;
startActivity(intent) ;
finish() ;
else
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg") ;
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show() ;
catch (JSONException e)
// JSON error
e.printStackTrace() ;
Toast.makeText(getApplicationContext(), "Json error : " + e.getMessage(),
Toast.LENGTH_LONG).show() ;
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
Log.e(TAG, "Login Error : " + error.getMessage()) ;
Toast.makeText(getApplicationContext(),error.getMessage(),
Toast.LENGTH_LONG).show() ;
hideDialog() ;
)
@Override
protected Map<String, String> getParams()
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>() ;
params.put("email", email) ;
params.put("password", password) ;
return params ;
;
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req) ;
private void showDialog()
if ( !pDialog.isShowing())
pDialog.show() ;
private void hideDialog()
if (pDialog.isShowing())
pDialog.dismiss() ;
@Override
50
public boolean onNavigationItemSelected(MenuItem item)
int id = item.getItemId() ;
if (id == R.id.exp)
startActivity(new Intent(LoginActivity.this,EmptyActivity.class)) ;
return true ;
else if (id == R.id.sign_in)
startActivity(new Intent(LoginActivity.this,SignInActivity.class)) ;
return true ;
else if (id == R.id.login)
startActivity(new Intent(LoginActivity.this,LoginActivity.class)) ;
return true ;
else if (id == R.id.regs)
startActivity(new Intent(LoginActivity.this,MainActivity.class)) ;
return true ;
else if (id == R.id.adm)
startActivity(new Intent(LoginActivity.this,AdminSpace.class)) ;
return true ;
else if (id == R.id.dep)
startActivity(new Intent(LoginActivity.this,AnnonceActivity.class)) ;
return true ;
else if (id == R.id.your_announces)
startActivity(new Intent(LoginActivity.this,Annonce_emailActivity.class)) ;
return true ;
else if (id == R.id.edit)
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this) ;
builder.setMessage("Choose an action ?") ;
builder.setNegativeButton("Delete", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
Intent i = new Intent(LoginActivity.this, Delete_Account.class) ;
startActivity(i) ;
dialog.cancel() ;
finish() ;
);
builder.setPositiveButton("Edit", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
Intent i = new Intent(LoginActivity.this, Edit_ProfileActivity.class) ;
startActivity(i) ;
dialog.cancel() ;
finish() ;
51
);
AlertDialog alert11 = builder.create() ;
alert11.show() ;
return true ;
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout) ;
drawer.closeDrawer(GravityCompat.START) ;
return true ;
2. Le code XML : < ?xml version="1.0" encoding="utf-8" ?>
<android.support.v4.widget.DrawerLayout xmlns :android="http ://sche-
mas.android.com/apk/res/android"
xmlns :app="http ://schemas.android.com/apk/res-auto"
xmlns :tools="http ://schemas.android.com/tools"
android :id="@+id/drawer_layout"
android :layout_width="match_parent"
android :layout_height="match_parent"
android :fitsSystemWindows="true"
tools :openDrawer="start"
android :background="@color/white"
>
<android.support.design.widget.CoordinatorLayout
xmlns :android="http ://schemas.android.com/apk/res/android"
xmlns :app="http ://schemas.android.com/apk/res-auto"
xmlns :tools="http ://schemas.android.com/tools"
android :layout_width="match_parent"
android :layout_height="match_parent"
android :background="@color/bg_login"
android :fitsSystemWindows="true"
tools :context="com.example.jawad.myapplication.MainActivity"
>
<android.support.design.widget.AppBarLayout
android :layout_width="match_parent"
android :layout_height="wrap_content"
android :theme="@style/AppTheme.AppBarOverlay"
>
<android.support.v7.widget.Toolbar
android :id="@+id/toolbar"
android :layout_width="match_parent"
android :layout_height=" ?attr/actionBarSize"
android :background="@color/bg_main"
app :popupTheme="@style/AppTheme.PopupOverlay"
/>
52
</android.support.design.widget.AppBarLayout>
<LinearLayout
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_gravity="center"
android :orientation="vertical"
android :paddingLeft="20dp"
android :paddingRight="20dp" >
<EditText
android :id="@+id/email"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/hint_email"
android :inputType="textEmailAddress"
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
<EditText
android :id="@+id/password"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginBottom="10dp"
android :background="@color/white"
android :hint="@string/hint_password"
android :inputType="textPassword"
android :padding="10dp"
android :singleLine="true"
android :textColor="@color/input_login"
android :textColorHint="@color/input_login_hint" />
< !– Login Button –>
<Button
android :id="@+id/btnLogin"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginTop="20dip"
android :background="@color/btn_login_bg"
android :text="@string/btn_login"
android :textColor="@color/btn_login" />
53
< !– Link to Login Screen –>
<Button
android :id="@+id/btnLinkToRegisterScreen"
android :layout_width="fill_parent"
android :layout_height="wrap_content"
android :layout_marginTop="40dip"
android :background="@null"
android :text="@string/btn_link_to_register"
android :textAllCaps="false"
android :textColor="@color/white"
android :textSize="15dp" />
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android :id="@+id/nav_view"
android :layout_width="wrap_content"
android :layout_height="match_parent"
android :layout_gravity="start"
android :fitsSystemWindows="true"
app :headerLayout="@layout/nav_header_main2"
app :menu="@menu/activity_main2_drawer" />
</android.support.v4.widget.DrawerLayout>
54
3. Le code PHP :
55
WEBOGRAPHIE
1. https ://developer.android.com/index.html
2. http ://ineumann.developpez.com/
3. https ://openclassrooms.com/dashboard
4. http ://www.frandroid.com/comment-faire/tutoriaux/311391_lesmeilleurs-
tutorielspourapprendreamaitriserandroid
5. http ://www.androiddev.fr/
56
Bibliographie
http ://www.academiepro.com/uploads/livres/lart-du-developpement-android.pdf
57