You are on page 1of 103

Master E-Services

Gnie Logiciel et Interaction Homme-Machine


PROJET UCAMPUS
2010-2011 SPADI Julien VAN HOEYMISSEN Thomas

TABLE DES MATIERES 1. LAPPLICATION ....................................................................................................... 2 1.1 1.2 2. Objectif Principal................................................................................................ 2 Fonctionnalits prsentes ................................................................................... 2

PHASE DANALYSE ................................................................................................ 2 2.1 2.2 Public vis .......................................................................................................... 2 Scnarios dutilisation ........................................................................................ 3

3.

PHASE DE CONCEPTION ..................................................................................... 5 3.1 3.2 3.3 Diagramme de Use case ..................................................................................... 5 Maquette ............................................................................................................. 6 Schma de la base de donnes ............................................................................ 12

4.

REALISATION ......................................................................................................... 13 4.1 4.2 Fonctionnement de notre application ................................................................. 13 Difficults rencontres et rsolution des problmes.......................................... 19

5.

FUTUR DE LAPPLICATION ................................................................................ 21 5.1 5.2 5.3 volutions possible............................................................................................. 21 Problmes rsoudre.......................................................................................... 22 Prconisations ..................................................................................................... 22

6.

BILAN DU TRAVAIL ............................................................................................... 23 6.1 6.2 6.3 6.4 La question utile et utilisable.............................................................................. 23 Mthode de travail utilise ................................................................................. 23 Apports personnels ............................................................................................. 24 Bilan sur les technologies utilises ..................................................................... 25

7. 8.

CONCLUSION .......................................................................................................... 27 ANNEXE ..................................................................................................................... 28

1. LAPPLICATION
1.1 OBJECTIF PRINCIPAL
Lobjectif principal de lapplication est de permettre lutilisateur de se reprer dans le campus de Lille 1. En effet, le campus tant assez grand, il est parfois un peu compliqu de trouver le lieu o lon doit se rendre, surtout si lon est un nouvel tudiant. Ainsi avec cette application appele UCampus, lutilisateur est capable de se localiser sur le campus.

1.2 FONCTIONNALITES PRESENTES


La liste des fonctionnalits prsentes sur lapplication est la suivante :

Se localiser Afficher les btiments dune catgorie donne Recherche dun btiment sur le campus Itinraire piton ou en voiture vers un btiment du campus Navigation piton ou en voiture via le GPS vers un btiment du campus Consulter la fiche dtaille de chaque btiment (Adresse, horaires, description) Appeler le btiment / Consulter son site internet. Consulter le menu du RU

2. PHASE DANALYSE
2.1 PUBLIC VISE
Avant de se lancer dans la conception de lapplication (base de donnes, interaction s et maquettages crans), nous nous sommes dabord demand quelles fonctionnalits devraient tre prsentes de base dans notre application. Pour cela nous nous sommes demand quel type dutilisateurs pourrait trouver notre application utile. Il sest dgag ainsi quatre types de public vise. Tout dabord, lutilisateur qui arrive pour la premire fois sur le campus de Lille 1. Il doit se rendre dans un btiment spcifique et tant donne la taille du campus, il se retrouve un peu perdu. Il pourra ainsi, avec UCampus, se rendre o il le souhaite soit en voiture soit pied. Vient ensuite lutilisateur qui est dj habitu au campus de Lille 1 mais qui exceptionnellement doit se rendre dans un btiment dont il ignore ladresse. Il pourra sy rendre via UCampus. Ensuite, il y a lutilisateur qui est sur le campus depuis un temps assez consquent qui a besoin dun renseignement sur un btiment particulier. Il peut alors via UCampus con sulter les informations gnrales du btiment (horaires, adresse, ) mais galement accder des fonctionnalits telles que lappel au btiment,

Finalement, il y a le professionnel qui se rend sur le campus pour par exemple donner un cours ou faire une intervention. Ainsi, avant sa venue, il est possible de lui demander de tlcharger UCampus pour quil puisse sy retrouver et donc, par exemple, ne pas arriver en retard.

2.2 SCENARIOS DUTILISATION


Ensuite nous nous sommes fait une reprsentation sous fo rme de scnarios de lutilisation concrte de notre application. Voici 6 exemples dutilisation mettant en scne 3 acteurs diffrents qui nont pas la mme connaissance du campus :
o o o

Pierre est un tudiant en 3me anne de licence informatique Lille 1 Franois est un tudiant en 1re anne de physique milie est une RH dAtos Worldline, elle ne connat pas luniversit de Lille1

Appeler le SIUMPPS

Pierre souhaite obtenir un rendez-vous avec un mdecin. Pour cela il se connecte lapplication UCampus, sur la page daccueil il clic sur Rechercher un lieu, puis slectionne la catgorie Sant et le btiment SIUMPPS. Une fois arriv sur la fiche dtaille, il consulte les horaires douverture puis slectionne longlet Complment dinformation. Dans cet onglet, il clic sur le bouton Appeler ce btiment. Il est ainsi mis en contact direct avec le service Inter-Universitaire de Mdecine Prventive et de Promotion de la Sant de l'Universit Lille 1. Consulter le menu du Barrois

Pierre souhaite consulter le menu de son restaurant universitaire prfr : Le Barrois. Pour cela il se connecte lapplication UCampus, sur la page daccueil il clic sur Rechercher un lieu, puis slectionne la catgorie Restaurants et le btiment Le Barrois. Une fois arriv sur la fiche dtaille, il slectionne longlet Complment dinformation et clic sur le bouton Menu du RU. Le navigateur web de son smart phone se lance la page du menu du Barrois. Visualiser tous les RU du campus

Franois ne connat pas bien luniversit de Lille 1, il souhaite savoir o sont situs tous les restaurants universitaire. Pour cela il se connecte lappl ication UCampus, sur la page daccueil il clique sur Maps, puis clic sur le bouton reprsent par une loupe. La liste des catgories lui apparat, il slectionne la catgorie Restaurants et clic sur Restaurants : tous les btiments. Saffiche alors lcran lemplacement de chacun des restaurants universitaire de luniversit de Lille 1.

Visualiser litinraire piton jusquau Pariselle

Franois s'aperoit que le Pariselle est le restaurant universitaire le plus proche de lui. Il dcide de sy rendre pied. Sur la page de golocalisation, il clic sur le bouton reprsent par un panneau de signalisation avec une flche et accde ainsi la pop-up Itinraire. Il renseigne la destination par Le Pariselle, le mode de dplacement par Piton et clic sur le bouton Itinraire. Franois est averti de la distance en kilomtres qui le spare du Pariselle et l'itinraire le plus rapide est dessin en bleu sur la carte. Il lui ne reste plus qu le suivre. Se rendre la salle de sport Halle Vallin pied

Franois a rendez-vous avec Florent pour jouer au badminton dans la salle de sport Halle Vallin. Toutefois, il ne connat pas du tout la route pour sy rendre. Franois se connecte lapplication UCampus, sur la page daccueil, il clic sur Maps, puis sur le bouton reprsent par un panneau de signalisation avec une flche pour renseigner sa navigation. Il accde ainsi la pop-up Itinraire. Il renseigne la destination par Halle Vallin, le mode de dplacement par Piton et clic sur le bouton Navigation. Le GPS Google navigation se lance et dtermine le chemin pied que Franois doit suivre pour arriver destination. Se rendre en voiture au Sully

milie est invite dans le cadre dun projet de communication participer des simulations dentretiens qui ont lieu dans le restaurant universitaire du Sully. Lors de son invitation, le projet de communication lui a conseill dutiliser lapplication UCampus pour venir. Pour cela elle se connecte lapplication UCampus, sur la page daccueil, elle clic sur Rechercher un lieu, puis slectionne la catgorie Restaurants et le btiment Le Sully. Une fois arriv sur la fiche dtaille, elle slectionne longlet Localisation / Maps et clic sur le bouton Navigation Voiture. Le GPS Google navigation se lance et mile na plus qu suivre les instructions du GPS pour arriver bon port. Les scnarios ont pour but de montrer concrtement des cas dutilisation. Cependant il y a plusieurs faons d'accder aux fonctionnalits.

3. PHASE DE CONCEPTION
3.1 DIAGRAMME DE USE CASE
De ces scnarios dusage nous avons dgag un diagramme de use cases ( voir figure 1) afin de dterminer les enchanements dactions possibles de notre application et afin de bien dterminer si notre application respectera les objectif attendus dtermins dans les scnarios dusages. En bleu sont reprsents les tats auxquels nous voulions arrivs dans nos scnarios.

Figure 1: Diagramme de use case de l'application UCampus

3.2 MAQUETTE
De cette phase danalyse, a dcoul la conception de notre application. Aprs avoir dtermin les scnarios dusages nous nous sommes mis faire la maquette de notre application afin de voir si toutes les possibilits dcrites dans nos scnarios seraient bien ralisables dans notre application finale. Ainsi, laide loutil Balsmiq, nous avons ralis la maquette de notre application.
3.2.1 La page daccueil

Figure 2: La maquette de la page d'accueil de l'application UCampus

Nous avons dcid de faire une page daccueil assez simple en termes de contenu dinformation (voir figure 2). Ainsi pour ne pas perdre lutilisateur, il nest possible de raliser que deux actions possibles via les deux boutons. Nous avons aussi ajout le logo de notre application sur cette page comme dans de nombreuses autres applications.

3.2.2 Partie Golocalisation / Itinraire : La map

Figure 3 : La maquette de la page Maps de l'application UCampus

Pour laspect ergonomique de la page Maps (voir figure 3), nous nous sommes inspirs de lapplication mobile Google Maps car nous pensions quelle tait claire, ludique, pratique et intuitive. Nous avons essays de garder et de mettre en uvre ces caractristiques. Cette page est compose de 2 parties :

Partie haute : Une barre donglet contenant 4 boutons : Afficher les catgories de lieu
Dfinir un itinraire Se golocaliser Rinitialiser la carte. Partie centrale : La carte Google Maps permettant de go localiser lutilisateur, dafficher les diffrents lieux et de le guider.

3.2.3 Partie Golocalisation / Itinraire : La pop-up ditinraire et de navigation

Figure 4 : La maquette de la pop-up ditinraire et de navigation de l'application UCampus

Cette pop-up (voir figure 4) permet de renseigner les donnes dun itinraire : Dpart : Position de lutilisateur Arrive : Destination de litinraire Mode : Mode dplacement (Piton ou Voiture)

2 boutons permettent de choisir le type ditinraire : Navigation : Itinraire via le GPS Itinraire : Itinraire statique (trait bleu sur la map)

Lors de la conception des crans nous avions ajouts un bouton Annuler permettant de retourner lcran de la carte. Toutefois, ce bouton a t enlev lors du dveloppem ent de UCampus car sur les applications Android il ny a pas de bouton annuler. Il faut utiliser le bouton retour du tlphone.

Nous avons choisi dutiliser une pop-up plutt quune nouvelle page car nous avons estim que les informations prsents ntaient pas assez nombreuses pour remplir une page.
3.2.4 Partie Golocalisation / Itinraire : Laffichage des informations sur la map

Figure 5 : maquette de laffichage des informations sur la map de l'application UCampus

Sur cette page (voir figure 5), on retrouve la position de lutilisateur, le ou les btiments que lutilisateur souhaite afficher et litinraire entre lutilisateur et un btiment de luniversit. Pour reprsenter lutilisateur nous avons utiliss la mme icne que celle utilise s ur Google Maps. Les btiments sont reprsents par une icne symbolisant la catgorie de ce btiment. Chaque icne doit tre le plus explicite et reconnaissable possible. Nous souhaitions qu partir de licne du btiment avoir un accs rapide la fich e dtaille du btiment. Afin de reprsenter litinraire piton ou en voiture de lutilisateur vers un btiment, nous avons souhaits mettre disposition de lutilisateur 2 outils : La navigation GPS. Litinraire statique reprsent par un trait bleu.

3.2.5 Partie Recherche de btiment : les listes de catgories et de btiments

Figure 6 : maquette des listes de catgories et de btiments de l'application UCampus

Afin davoir une navigation simple et agrable, nous avons dcid de prsenter les catgories et les btiments sous forme de liste (voir figure 6). Nous nous sommes inspirs du tutoriel Personnaliser une ListView propos sur le site http://www.tutomobile.fr. La dcouverte de ce tutoriel a t trs bnfique dans lavancement de laspect graphique de notre application (voir partie difficults rencontres et rsolution des problmes). Pour ne pas que lutilisateur se perde dans la recherche de btiment, le titre de la catgorie est toujours prsent sur chaque liste de btiments. De plus nous avons dcid de mettre des icnes assez explicites pour chaque catgorie (un cuisinier pour la catgorie Restaurants Universitaires par exemple).

10

3.2.6 Partie Recherche de btiment : la fiche dtaille dun btiment

Figure 7 : La maquette de la fiche dtaille dun btiment de lapplication UCampus

La page reprsentant la fiche dtaille dun btiment est dcoupe en trois parties (voir figure 7) savoir :

La partie informations gnrales du btiment contenant ladresse, le numro de tlphone, Le partie navigation et itinraire La partie autre dans laquelle on peut trouver la possibilit dappeler le btiment par exemple

Nous avons dcid dutilis un systme donglet pour permettre de mieux structurer les parties. Ainsi la lisibilit est plus claire. De plus, le fait dut iliser des icnes dans les onglets permet un gain de place assez consquent compte tenu du nombre dinformation afficher dans la page. Ainsi, nous avons russi faire en sorte que lutilisateur nai t pas scroller dans la fiche du btiment.

11

3.2.7 Menu Android

Sur toutes les pages de UCampus, lutilisateur a accs en appuyant sur le bouton Menu de son tlphone un menu lui permettant daccder diffrentes pages. Ce menu change selon la page o se trouve lutilisateur. Sil est sur la page de Golocalisation, le menu sera constitu de Lieux, Itinraire, Effacer les rsultats, Rglages et Plus. Sil est sur la page daccueil, le menu sera constitu de Rglages et Plus. Sur toutes les autres pages, le menu sera constitu de Go localisation, Accueil, Rglages et Plus.

3.3 SCHEMA DE LA BASE DE DONNEES

Figure 8 : Le schma de la base de donnes de l'application UCampus

La base est spare en deux partie (voir figure 8) car nous navons besoin que de 2 objets reprsenter savoir dun ct les btiments prsent sur le Campus et de lautre la c atgorie de ce btiment afin de permettre un certain classement ou ordre dans la liste des btiments. La table BATIMENT contient les champs: ID_BAT : lidentifiant unique pour chaque btiment auto -incrment (ici il sagit dune String mais nous avons fait en sorte que lauto-incrmentation se fasse quand mme) NAME_BAT : le nom du btiment NUMERO_BAT : le numro de tlphone du btiment HORAIRES_BAT : Les horaires douverture du btiment IMAGE_BAT : le chemin vers limage afficher dans la fiche de descr iption du btiment LATITUDE_BAT : la latitude du btiment (utilise pour la golocalisation) 12

LONGITUDE_BAT : la longitude du btiment (utilise pour la golocalisation) SITEINTERNET_BAT : le lien vers le site internet du btiment pour avoir plus dinformations ID_CAT : lidentifiant de la catgorie laquelle le btiment appartient

La table CATEGORIE contient quant elle les champs : ID_CAT : lidentifiant unique pour chaque catgorie auto -incrmente NAME_CAT : le nom de la catgorie ICON_CAT : le chemin vers l'icne reprsentant la catgorie Comment ajouter une catgorie de btiment et un btiment? Pour le moment, lajout de btiment et de catgorie doit se faire directement dans le code source mais cela pourra et surtout devra tre modifi en passant par un parser xml par exemple (voir partie amlioration). Ainsi, afin de rajouter un btiment dans la base, il suffit de se rendre dans la classe InsertBDD et dy ajouter dabord une catgorie en crant un objet catgorie et en linsrant dans la base de d onnes, puis pour ajouter un btiment il faut crer lobjet btiment et linsrer dans la base de donnes en prenant bien en compte lidentifiant de la catgorie cre auparavant (lidentifiant est gnr dans lordre des insertion dans la base en partant de 1). Il faut bien videmment veiller fermer les connections la base de donnes aprs. Pour que la nouvelle catgorie soit prise en compte dans la partie golocalisation, il faut ajouter une icne qui reprsentera la catgorie et crer 2 objets dans la classe Geolocaliasation.java: MyItemizedOverlay qui contiendra les lieux afficher pour cette catgorie Drawable qui correspond licne qui sera affiche pour cette catgorie Voir annexe : Tutorial Crer une catgorie de btiment

4. REALISATION
4.1 FONCTIONNEMENT DE NOTRE APPLICATION
Nous allons vous prsenter les crans de notre application UCampus ainsi que leurs fonctionnalits sous forme de zones de texte prsentant les actions ralises en via cet lment.

13

Figure 9 : La page d'accueil de UCampus

1 : Ouvre les fonctionnalits de golocalisation 2 : Ouvre la fonctionnalit de recherche de lieu dont la premire page

Figure 10 : La page de golocalisation de UCampus

Lors dun clic sur le bouton Maps de la page daccueil, lutilisateur est golocaliser sur la carte. 1 : Barre donglets permettant de rechercher un lieu, un itinraire, de se golocaliser et de rinitialiser la carte 2 : Position de lutilisateur 14

1 2 3

Figure 11 : Pop-up itinraire

Cette pop-up souvre lors dun click sur le deuxime lment de la barre donglets. 1 : Destination de litinraire : Auto compression partir dune lettre saisie par lutilisateur 2 : Mode de dplacement Piton ou Voiture 3 : Choix du mode de litinraire : Via le GSP (Navigation) ou statique (Itinraire)

Figure 12 : Reprsentation de litinraire

Une fois litinraire renseign et un clic sur le bouton Itinraire de la pop-up prcdente, un trait bleu reprsente litinraire le plus rapide en distance vers le lieu choisi. 15

Figure 13 : La liste des catgories de l'application UCampus

Lors dun clic sur le bouton Rechercher un lieu de la page daccueil, la liste des catgories de lieux est propos lutilisateur. 1 : Ouvre la liste des btiments contenus dans la catgorie choisie

Figure 14 : La liste des btiment correspondants une catgorie de l'application UCampus

Lorsque lutilisateur choisi une catgorie de lieux, les btiments de cette catgorie saffichent. 1 : Ouvre la fiche dtaille du btiment slectionn 2 : Affiche sur la map tous les btiments de la catgorie choisie

16

Figure 15 : Tous les restaurants universitaires de Lille 1

Si lutilisateur a cliqu sur lcran prcdent sur tous les btiments, la carte contient tous les btiments de cette catgorie. Ces btiments sont reprsents par licne de la catgorie.

Figure 16 : La partie informations gnrales de la fiche dtaille d'un btiment de l'application UCampus

Si lutilisateur a cliqu sur lcran prcdent sur un btiment, il accde sa fiche dtaille. 1 : Ouvre la partie golocalisation de la fiche dtaille 2 : Ouvre la partie Complment dinformation de la fiche dtaille

17

1 2 3 4 5

Figure 17 : La partie Localisation/Maps de la fiche dtaille d'un btiment de l'application UCampus

Ouverture de longlet Localisation/Maps de la fiche dtaille. 1 : Affiche le btiment sur la map 2 : Affiche litinraire pied vers le btiment sur la map 3 : Affiche litinraire en voiture vers le btiment sur la map 4 : Ouvre le service de Google Navigation en mode piton vers le btiment 5 : Ouvre le service de Google Navigation en mode voiture vers le btiment

1 2
Figure 18 : La partie Complment d'information de la fiche dtaille d'un btiment de l'application UCampus

Ouverture de longlet Complment dinformation de la fiche dtaille. 1 : Appel le btiment 2 : Affiche le menu (ou le site internet) du btiment dans un navigateur web 18

Figure 19 : Le menu de la fiche dtaille d'un btiment de l'application UCampus

1 : Affiche la map centre sur ma position 2 : Affiche la page daccueil Les autres lments du menu sont en construction.

4.2 DIFFICULTES RENCONTREES ET RESOLUTION DES PROBLEMES


4.2.1 Difficults communes

Lors de ce projet, nous avons rencontrs de nombreuses difficults notamment lies au langage de programmation Android. En effet, ctait la premire fois que nous travaillions sur un projet Android. Nous avons consults de nombreux sites, forums, tutoriels et cours pour parvenir dvelopper UCampus. Le site le plus utilis tait http://developer.android.com. La principale difficult commune que nous ayons rencontre sest porte sur laspect graphique, la mise en page, le placement des boutons, comment dterminer les tailles des objets, . Pour rsoudre en partie ce problme, Julien a trouv un logiciel (DroidDraw) qui permet par Drag and drop de faire de la mise en page sous Android et dobtenir le code XML gnr. Toujours concernant laffichage et la mise en page de lapplication, Thomas a trouv un tutoriel permettant de faire un affichage plutt ergonomique des listes de catgories et de btiment. Ce qui nous a permis de comprendre un peu plus les principes des fichiers xml utilis dans le dveloppement des interfaces graphiques sous Android. Nous nous sommes aussi rendu compte que certaines actions comme la navigation par exemple prenaient du temps se lancer. Lutilisateur ne sait pas si laction a bien t enclenche. Nous avons donc dcid dajouter une vibration chaque pression de lutilisateur afin quil ait un feedback immdiat. 19

Le dernier problme commun que nous avons rencontr tait li la cl Google map ncessaire lutilisation de la carte. En effet, pour utiliser la carte propose par Google, il est obligatoire de gnrer une cl Google map propre chaque ordinateur o le projet est compil. tant donn que lon travaillait deux sur le projet et que lon utilisait SVN, il fallait chacun gnrer une cl Google map correspondant son poste. Nous avons ainsi cre un fichier (cleGoogleMap.txt) qui contient la cl de chaque poste o le projet a t compil.
4.2.2 Difficults rencontres par Thomas

Dun point de vue technique, les fonctionnalits lies la golocalisation (navigation, localisation et itinraire) mont poses le plus de problmes. Jai suivi diffrents tutoriels (http://developer.android.com/resources/tutorials/views/hellomapview.html;http://mobiforge.com/developing/story/using-google-maps-android) pour dvelopper ses fonctions. Jai galement utilis des fonctions dveloppes par dautres dveloppeurs comme la fonction qui permet de dterminer la distance entre sa position et un lieu et la fonction qui permet de mettre jour sa position. En ce qui concerne le guidage de lutilisateur, jtais parti sur un guidage uniquement via la carte. En mettant jour le trait de l'itinraire chaque modification de sa position. Toutefois, je me suis rendu compte que cette faon alle tre trop fastidieuse et pas assez efficace. De plus Google proposant un outil de navigation GPS (Google Navigation) intgre au smart phone, nous avons dcids de lutiliser. Ainsi, lutilisateur peut soit tracer un itinrai re fixe soit utiliser un GPS pour se dplacer. Dun point de vue fonctionnel, ce qui ma pris le plus de temps a t de placer les btiments sur la carte en rcuprant les coordonnes GPS (latitude et longitude) via Google Maps. Javais donc dun ct la carte de luniversit de Lille1, dun autre cot cette mme vue sur Google map mais sans tous les btiments.
4.2.3 Difficults rencontres par Julien

Un de mes principaux soucis dans cette application tait de crer une base de donnes et dy faire les actions principales telles que linsertion et laccs aux donnes prsentes dans cette dernire. Aprs avoir consult quelques tutoriels, je me suis pench sur un en particulier (Comment utiliser SQLite sous Android disponible sur le site http://www.tutomobile.fr). Ainsi, jai pu dcouvrir comment crer et administr une base de donnes sous Android en utilisant la technologie SQLite. Jai choisi cette technologie car elle est intgre de base lOS Android, de plus je nai pas trouv dautre technologie disponible pour effectuer la gestion des donnes. Ensuite, jai remarqu qu chaque dmarrage de lapplication, toutes les catgories et les btiments taient chargs une fois de plus dans la base de donnes. En fait, je chargeais la classe dinsertion dans la base chaque appel lapplication. Ainsi, la base se retrouvait pleine de doublons. Pour pallier ce problme, jai fait en sorte que sil sagit du premier chargement de lapplication (i.e. si la base est vide), la classe dinsertion en base soccupe de 20

nourrir la base de donnes. En revanche, si lapplication et dj installe et quil il y a donc des donnes prsentes en base alors rien nest insr. Finalement, dans les listes de recherche, il y a une icne reprsentant chaque type de catgories et de btiment. Ces icnes mont poses quelques problmes car elles taient directement intgr au projet .apk et non pas sur la carte SD du tlphone. Pour faire simple, elles taient dj compiles dans le projet. Ainsi, il mtait impossible de rcuprer limage directement en faisant appel la mthode createFromPath(String pathName) qui est propose dans la documentation dAndroid et qui permet de crer lobjet Drawable (Image) correspondant limage se trouvant dans le pathName. De plus, chaque catgorie dispose de sa propre icne dont il faut aller chercher le nom dans la base de donnes. Il fallait donc trouver un autre moyen pour crer cette icne en fonction de la catgorie. Aprs quelques recherches sur les forums ddis au dveloppement mobiles, jai trouv la solution en utilisant la mthode permettant de rcuprer lidentifiant de limage compil. Il suffisait ensuite de faire correspondre cette identifiant lobjet Drawable afficher.

5. FUTUR DE LAPPLICATION
5.1 VOLUTIONS POSSIBLE
Nous avons rflchis des pistes dvolutions qui permettraient denrichir UCampus. 4 catgories regroupent ces pistes dvolution:
5.1.1 Elargir les cibles potentielles

Tout dabord, il serait intressant dajouter un module de reco nnaissance vocale pour permettre des personnes dficientes visuelles dutiliser lapplication. De plus, tant donn que lUniversit Lille 1 accueille chaque anne plus de environ 4000 tudiants internationaux, ce qui reprsente plus de 20% de la populat ion totale des tudiants, proposer lutilisateur le choix de la langue peut tre trs utile.
5.1.2 Faciliter la navigation au sein de UCampus

Si lutilisateur connat le nom du btiment dont il souhaite avoir des informations, il serait utile dajouter une fonction de recherche du btiment ds la page daccueil. De plus, nous pensons que la golocalisation peut tre amliore dans le sens o lutilisateur dfinit la catgorie de lieux et demande le btiment de cette catgorie le plus proche de lui. Par exemple, lutilisateur se situe au M5 et souhaite savoir quel est le restaurant universitaire le plus proche. Des volutions lies la fiche dtaille dun btiment telles que lintgration du menu du restaurant universitaire et lajout dune photo reprsentant le btiment sont parfaitement envisageable.

21

5.1.3 Donnes de UCampus

A lheure actuelle, la base de donnes de UCampus contient 3 catgories de lieux (Restaurant, Sant et Salle de sport) et 7 btiments. Pour optimiser son utilisation, il est ncessaire denrichir la base de donnes par des catgories de lieux et par des btiments. De plus, le mode de base de donnes actuellement mis en place est propre chaque smart phone, cest dire que la base de donnes est embarque dans le mobile. Ce qui implique qu chaque modifications de la base de donnes il est ncessaire de re-tlcharger lapplication. Pour remdier ce problme il faut utiliser une base de donnes externe hberge sur un serveur.
5.1.4 Ajout de nouvelles fonctionnalits

Il est envisageable denrichir UCampus par des services utiles chaque tudiants. On peut imaginer intgrer une boite mail pour les mails de la Fac, un agenda de ses cours ou mme grer ses cartes (tudiante, bibliothque, Crous). Une version widget de UCampus, permettrait un accs plus rapide une des fonctionnalits de lapplication car il est accessible directement via le bureau de son smart phone. Par exemple ce widget pourrait servir rcuprer le numro de tlphone dun btiment. Il sagit en fait de dterminer quelle e st la fonctionnalit la plus utilise sur UCampus et den faire un widget.

5.2 PROBLEMES A RESOUDRE


Sur la version prsente il reste quelques problmes mineurs rgls. Lorsquun utilisateur souhaite connatre l'itinraire vers un lieu, un trait bleu est dessin sur la carte Google map. Si lutilisateur effectue un nouvel itinraire, le trait de lancien itinraire reste. Pour effacer le trait dun itinraire, il est ncessaire de soit cliquer sur le bouton Rinitialiser soit dafficher un lieu sur la carte. Il est galement possible pour un utilisateur de ne pas utiliser la 3G et le GPS lorsquil est sur la page de golocalisation. En effet, le contrle de lactivation de ces deux outils est effectu lors de laccs la page de golocalisation. Si lutilisateur quitte lapplication et y retourne, il arrivera directement o il tait lors de la fermeture de lapplication. Ainsi, il peut trs bien arriver sur lcran de golocalisation sans avoir ractiv son GPS et sa 3G. Il serait donc judicieux de tester si la 3G et le GPS sont actifs tout moment. Il faudrait galement intgrer dans le modle de donnes une partie description du btiment afin de pouvoir intgrer plus dinformations sur le btiment et aussi permettre une meilleure mise en page du premier onglet de la fiche produit.

5.3 PRECONISATIONS
Afin dutiliser UCampus dans des conditions optimales, nous prconisons son utilisation en extrieur. Ceci afin de permettre une golocalisation plus rapide et surtout plus prcise. Le GPS tant plus prcis en extrieur. 22

Si la golocalisation ne fonctionne pas correctement, il est conseill de se golocaliser avec Google Maps et de revenir sur UCampus.

6. BILAN DU TRAVAIL
6.1 LA QUESTION UTILE ET UTILISABLE
Nous avions un objectif lors dans la ralisation de cette appli cation. En effet, il fallait quelle soit utile et utilisable. Les diffrents publics viss sont dj un argument permettant de montrer que notre application est utile. En effet, le fait davoir catgoris des t ypes dutilisateurs rend cette application utile car chaque type trouvera une utilit UCampus. De plus, le fait que de nombreuses fonctionnalits soient prsentes renforce largumentation sur lutilit de notre application. En effet, UCampus dispose de fonctionnalits qui permettent lutilisateur de trouver ce quil cherche, si bien videmment il sait ce que lapplication permet de faire. Lutilisabilit de notre application rside dans lIHM. En effet, nous avons voulu une ergonomie assez claire. De plus nous voulions que lutilisateur nait pas trop dactions faire pour arriver ce quil cherche. Nous nous sommes aussi appuyer sur des APIs qui ont dj t approuves par de nombreux utilisateurs comme Google Maps et Google Navigation. Ainsi, nous sommes persuads que les parties utilisant ces APIs sont utilisables. Nous avons valu les caractres utile et utilisable de UCampus grce une exprimentation utilisateur. Pour cela nous avons fait manipuler lapplication par un ensemble de sujets . Au dbut, nous souhaitions que les sujets ne soient pas des tudiants de la formation Eservices afin davoir des avis les plus neutres possibles. Toutefois, dans un souci de respect des dlais nous avons fait tester UCampus des tudiants en E-services. Le retour a t positif cependant tant donne le type de sujet (informaticien), nous navons pas pu avoir une ide prcise sur lutilit et lutilisabilit de UCampus. Il aurait t ncessaire dlargir les types de sujet par rapport la nationalit, lge, au sexe et la formation scolaire de lutilisateur.

6.2 METHODE DE TRAVAIL UTILISEE


Nous avons consacr les deux premires sances de projet au listing des fonctionnalits dvelopper au sein de UCampus. Trois parties ce sont dgages :

Golocalisation Base de donnes Mise en page

Nous nous sommes ainsi rpartis ces trois parties. Thomas a travaill s ur laspect golocalisation et Julien sur la partie base de donnes et mise en page. Ces parties ntant pas troitement lies nous avons pu travailler chacun de notre ct et facilement intgrer le dveloppement de lun et lautre grce lutilisation dun SVN. Nous avons galement mis jour la forge mis notre disposition, afin de tenir informer de notre avancement.

23

Nous nous tions fixs 3 jalons :

JALON : 1ERE VERSION UCAMPUS (12/20/10)


o

La premire version de l'application doit permettre de :


Se golocaliser Localiser sur la carte les restaurants universitaires de Lille 1 Se rendre via un itinraire piton ou voiture vers un des restaurants universitaires de Lille 1 (Google Navigation - Google Maps) Consulter les informations de chaque restaurant universitaire (Nom, adresse, horaires, menu, tlphone)

JALON : AJOUT DE NOUVEAUX LIEUX - RECONNAISSANCE VOCALE (01/11/11)


o

Enrichissement des lieux :


Btiments de cours informatiques Btiments administratifs Salles de sport

Intgrer la reconnaissance vocale Cette version doit contenir des donnes relles. Permettre un utilisateur d'utiliser toutes les fonctionnalits de l'application.

JALON : VERSION LIVRABLE (01/25/11)


o

Comme on peut le constater sur la version prsente le 25/01/2011, les jalons nont pas t exactement respects. En effet, au cours du projet nous nous sommes rendu compte que la fonctionnalit de reconnaissance vocale tait secondaire et surtout trs compliqu mettre en place. De plus cette fonction tait dveloppe par un autre groupe et ils ne savaient pas encore comment la mettre en place. Ce qui nous a permis de nous concentrer sur le dveloppement des fonctionnalits primordiales (navigation, recherche, appel). En ce qui concerne lenrichissement des lieux, nous avons prfrs ajouter des catgories o nous tions capables de renseigner tous les btiments de cette catgorie. De plus, tant donn quil sagit dune version de prsentation nous avons souhait mettre en valeur les fonctionnalits plutt que la quantit de donnes.

6.3 APPORTS PERSONNELS


6.3.1 Thomas

Ds lannonce des sujets de GLIHM, jai tout de suite t attir par UCampus car il permettait de mettre en perspective les enseignements reus cette anne dans le cadre dun projet professionnel. Au commencement du projet, je navais jamais dvelopp en Android. Ce projet ma permis dapprendre le langage de dveloppement Android. Etant en alternance chez Atos Worldline dans le dpartement Tlcom Utilities Media, cette comptence me sera trs utile car les plans directeurs sont orients applications mobiles Android/Iphone. Grce ce projet, je me sens capable de dvelopper des applications Android. 24

De plus, le fait de travailler en quipe est trs enrichissant : changes, entraides, confrontations des opinions, apprentissage au contact des autres et cohsion dquipe. Ces diffrentes comptences sont de plus en plus recherches par les entreprises. Le projet UCampus, ne se limitait pas uniquement au dveloppement dune a pplication mobile mais comprenait les phases danalyse, de conception, de maquettage, de dveloppement et de suivi. Le fait de pouvoir grer ces diffrentes phases du projet tait important pour moi car elles font parties intgrante de notre vie professionnelle. Finalement, ce projet ma permis daccroitre mes comptences techniques et relationnelles, denrichir mon CV et davoir de nombreuses ides dapplication mobile.
6.3.2 Julien

Tout dabord, le fait de dvelopper une application from scratch est lun des apports personnels le plus intressant. En effet, le fait de pouvoir choisir soi-mme les fonctionnalits prsentes dans lapplication, de pouvoir choisir comment les mettre en place, de pouvoir choisir la mise en page et le design, ma permis de minvestir du dbut jusqu la fin du dveloppement de lapplication. Il y a une certaine fiert de concevoir et de dvelopper une application en partant de rien. De plus, mon attrait pour les nouvelles technologies mayant pouss choisir ce sujet, je nai pas t du de lapprentissage du dveloppement sous Android. Je me sens maintenant assez laise dans ce domaine. Je nhsiterais pas dvelopper de nouvelles applications sous Android si lopportunit se prsente. Lexprience a t tellement intressante quelle ma fait changer de tlphone portable passant dun IPhone un tlphone Android. Le fait que le dveloppement soit en Java ayant aussi aid car je ne me suis pas senti perdu en terme de langage de dveloppement. Finalement, le fait davoir eu disposition des outils tels que le SVN a t bnfique car cela simplifier notre manire de travailler en ensemble. Nous avons pu ainsi bien sparer les tches et toujours avoir la dernire version de notre application sur nos tlphones. Ceci permettant de dtecter les ventuels bugs et de les corriger immdiatement.

6.4 BILAN SUR LES TECHNOLOGIES UTILISEES


6.4.1 Android

Android est un systme d'exploitation open source pour smart phones, PDA et terminaux mobiles conu par Google. Il sagit galement dun langage de programmation bas sur le JAVA et sur le XML. Le JAVA permet d'interagir avec lutilisateur en faisant la liaison entre linterface graphique et la base de donnes. Quant au XML, il permet notamment de dcrire les interfaces graphiques. UCampus a t dvelopp pour la version 2.1 dAndroid baptis Eclair. Toutefois, UCampus, est utilisable sur la version 2.2 et sur les versions antrieures dAndroid. Le fait que le langage utilis pour le dveloppement sous Android soit du Java permet des tudiants comme nous de prendre assez facilement en main un projet Android. En effet, nous avons tous au moins 3 ans de dveloppement Java derrire nous. De plus la documentation sur 25

le site dAndroid est vraiment complte et enrichie de nombreux exemple q ui permettent de mieux comprendre certaine subtilits. Cependant la partie affichage graphique est assez complique matriser.
6.4.2 DroidDraw

DroidDraw est un diteur wysiwyg (What You See Is What You Get) disponible sur Windows, Mac et Linux. Grace au drag and drop il est possible d assembler les diffrents lments de lapplication. Une fois linterface termine un fichier xml est gnr. DroidDraw a t particulirement utilis pour la fiche dtaill dun btiment. DroidDraw est tout de mme limit en termes de dveloppement pur et dur, il faut envisager son utilisation comme une aide au dveloppement de linterface utilisateur plus quun gnrateur de code. Bien quil sagisse dun outil bien utile pour le dveloppement dIHM sous Android pour ce genre de projet, il est clair quil nest pas encore assez abouti pour tre utilis grande chelle. Nous lavons surtout utilis pour pouvoir faire des LinearLayout que nous avons ensuite intgrer aux fichiers xml prsent dans le dossier layout du projet. Lintrt pour nous tait de pouvoir dvelopper des IHMs assez simples.
6.4.3 SQLite

SQLite est une bibliothque crite en C qui propose une base de donnes accessible par du langage SQL. Il est intgr de base lOS Android.
6.4.4 Balsamiq

Balsamiq est un outil qui permet de faire du mock-up, c'est dire de maquetter un site ou une application mobile, assez simplement. Nous avons utilis la version gratuite online car elle prsentait les principaux lments qui nous intressaient pour maquetter notre application comme par exemple des boutons, des onglets, Balsamiq est un outil assez puissant car il permet en quelques clics davoir une reprsentation trs concrte de lapplication finale. De plus le rendu final de la maquette au design crayonn est assez beau. Pour aller plus loin dans le mock-up, nous nous sommes demand sil existait un outil qui permettait davoir une version dynamique de la maquette faite avec Balsamiq. Nous avons trouv cet outil : Napkee. Cependant, nous ne lavons pas utilis dans le cadre de ce projet. De plus, il ny a quune version dessai de 45 jours, la version complte cotant 45 dollars.

26

7. CONCLUSION
Nous avons donc pass environ six mois analyser, concevoir et dvelopper cette application. De ce projet, nous ne pouvons retirer que des lments bnfiques. Nous sommes maintenant laise avec le dveloppement Android, nous avons dcouvert des outils pour la conception dapplication, trouver des moyens de rsoudre certains problmes, Nous sommes contents davoir pu mettre ce projet en place. Nous estimons, bien quil y ait encore des problmes rsoudre, que les bases de cette application sont prsentes et quil sera ais de les amliorer.

27

8. ANNEXE
TABLE DES MATIERES DE LANNEXE 1. PARTIE XML AFFICHAGE ................................................................................... 30 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. main.xml : page daccueil................................................................................... 30 catlist.xml : page daffichage de la liste des btiments ...................................... 30 batlist.xml : page daffichage de la liste des btiments ...................................... 30 affichageItem.xml : lment saffichant dans les listes ...................................... 31 viewbatiment.xml : page daffichage de la fiche dtaille ................................. 32 geolocalisation.xml : affichage de la page de golocalisation ........................... 37 balloon_overlay.xml : overlay sur la map .......................................................... 38 itineraire.xml : pop-up sur la map ...................................................................... 39 phonebutton.xml : exemple dun image button personnalis ............................. 40

COUCHE MODELE ................................................................................................. 40 2.1 2.2 Batiment.java : classe reprsentant lobjet Btiment ......................................... 40 Catgorie.java : classe reprsentant lobjet Catgorie ........................................ 43

3.

COUCHE DAO .......................................................................................................... 44 3.1 3.2 3.3 3.4 BatimentDataBase.java : cration de la base de btiment avec SQLite ............. 44 CategorieDataBase.java : cration de la base de catgorie avec SQLite ........... 45 BatimentDAO.java : connexion et CRUD sur la base des btiments................. 46 CategorieDAO.java : connexion et CRUD sur la base des catgories ............... 50

4.

COUCHE UTILITAIRES ......................................................................................... 52 4.1 InsertBDD.java : classe dinsertion dans lma base ............................................ 52

5.

COUCHE ANDROID ................................................................................................ 54 5.1 5.2 5.3 5.4 5.5 5.6 5.7 Home.java : la page daccueil ............................................................................ 54 CatList.java : page de listing des catgories ....................................................... 57 BatList.java : page de listing des btiments ....................................................... 59 ViewBatiment.java : fiche dtaille du btiment ............................................... 62 Geolocalisation.java : Geolocalisation via Google Maps................................... 78 MyItemizedOverlay.java : Contient les Overlay dune catgorie ...................... 91 BalloonItemizedOverlay.java : Apparait lors dun click sur un btiment .......... 92

5.8 BalloonOverlayView.java : Reprsente le marker lors dun click sur un btiment ....................................................................................................................... 96 28

5.9 6.

MyOverLay.java : Reprsente une superposition sur la carte ............................ 98

TUTORIAL ................................................................................................................ 101 6.1 Crer une catgorie de btiment ......................................................................... 101

29

1. PARTIE XML AFFICHAGE


1.1 MAIN.XML : PAGE DACCUEIL
<?xml version="1.0" encoding="utf-8"?> <!-- Page d'accueil --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> <RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/top" android:gravity="top"> </RelativeLayout> <!-- bouton pour lancer la map --> <Button android:id="@+id/localisationHome" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/localisation" android:layout_margin="50px" android:background="@drawable/custombutton" android:textColor="#ffffff" android:textSize="11pt"/> <!-- Bouton pour rechercher un batiment --> <Button android:id="@+id/searchHome" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/search" android:layout_margin="50px" android:background="@drawable/custombutton" android:textColor="#ffffff" android:textSize="11pt"/> </LinearLayout>

1.2 CATLIST.XML : PAGE DAFFICHAGE DE LA LISTE DES BATIMENTS


<?xml version="1.0" encoding="utf-8"?> <!-- Page de la liste des catgories de batiment --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_marginTop="15px" android:layout_marginBottom="15px" android:layout_height="wrap_content" android:text="Catgories" android:layout_gravity="center_horizontal" android:textSize="18px" /> <ListView android:id="@+id/listviewcategories" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>

1.3 BATLIST.XML : PAGE DAFFICHAGE DE LA LISTE DES BATIMENTS


<?xml version="1.0" encoding="utf-8"?> <!-- Page d'accueil -->

30

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> <RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/top" android:gravity="top"> </RelativeLayout> <!-- bouton pour lancer la map --> <Button android:id="@+id/localisationHome" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/localisation" android:layout_margin="50px" android:background="@drawable/custombutton" android:textColor="#ffffff" android:textSize="11pt"/> <!-- Bouton pour rechercher un batiment --> <Button android:id="@+id/searchHome" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/search" android:layout_margin="50px" android:background="@drawable/custombutton" android:textColor="#ffffff" android:textSize="11pt"/> </LinearLayout>

1.4 AFFICHAGEITEM.XML : ELEMENT SAFFICHANT DANS LES LISTES


<?xml version="1.0" encoding="utf-8"?> <!-- fichier qui permet de reprsenter une ligne dans la liste des catgories et des btiments --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1" > <TextView android:id="@+id/titre" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" /> <TextView android:id="@+id/description"

31

android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </LinearLayout>

1.5 VIEWBATIMENT.XML : PAGE DAFFICHAGE DE LA FICHE DETAILLEE


<?xml version="1.0" encoding="utf-8"?> <!-- Page d'un batiment --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> <!-- Le conteneur d'onglets --> <TabHost android:id="@+id/TabHost01" android:layout_height="fill_parent" android:layout_width="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent"> <!-- Le contenu des onglets --> <TabWidget android:id="@android:id/tabs" android:layout_height="wrap_content" android:layout_width="fill_parent"> </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_marginLeft="15px" android:layout_marginRight="15px"> <!-- Onglet info gnrale --> <LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:scrollbars="vertical" android:id="@+id/general_info"> <TextView android:layout_width="wrap_content" android:layout_marginTop="15px" android:layout_marginBottom="15px" android:layout_height="wrap_content" android:text="Informations Gnrales" android:layout_gravity="center_horizontal" android:textColor="#000000" android:textSize="18px" /> <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Name" android:textColor="#000000" /> <TextView android:id="@+id/numero" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Numero" android:textColor="#000000" /> <TextView android:id="@+id/ouverture" android:layout_width="fill_parent" android:layout_height="wrap_content"

32

android:text="Ouverture" android:textColor="#000000" /> <TextView android:id="@+id/adresse" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Adresse" android:textColor="#000000" /> </LinearLayout> <!-- Onglet maps --> <LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:scrollbars="vertical" android:id="@+id/loc_maps"> <!-- Titre localisation Map --> <TextView android:id="@+id/locText" android:layout_width="wrap_content" android:layout_height="40px" android:text="Localisation / Maps" android:layout_alignParentTop="true" android:gravity="center" android:layout_gravity="center_horizontal" android:textColor="#000000" android:textSize="18px"> </TextView> <!-- localiser --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/localise" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/locbutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/loc" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" android:text="Localiser" android:textColor="#000000" /> </LinearLayout> </LinearLayout> <!-- itineraire piton --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android"

33

android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/itinerairePieton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/pietonbutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/itinerairePietonText" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" android:text="Itinraire Piton" android:textColor="#000000" /> </LinearLayout> </LinearLayout> <!-- itineraire voiture --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/itineraireVoiture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/carbutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/itineraireVoitureText" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" android:text="Itinraire Voiture" android:textColor="#000000" /> </LinearLayout>

34

</LinearLayout> <!-- navigation piton --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/navigationPieton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/pietonbutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/NavPietonText" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" android:text="Navigation Piton" android:textColor="#000000" /> </LinearLayout> </LinearLayout> <!-- navigation voiture --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/navigationVoiture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/carbutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/NavVoitureText" android:layout_width="fill_parent" android:layout_height="fill_parent"

35

android:textSize="16px" android:textStyle="bold" android:text="Navigation Voiture" android:textColor="#000000" /> </LinearLayout> </LinearLayout> </LinearLayout> <!-- Onglet complments d'information --> <LinearLayout android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:scrollbars="vertical" android:id="@+id/autres"> <!-- Titre complments d'information --> <TextView android:id="@+id/locText" android:layout_width="wrap_content" android:layout_height="40px" android:text="Complment d'information" android:layout_alignParentTop="true" android:gravity="center" android:layout_gravity="center_horizontal" android:textColor="#000000" android:textSize="18px"> </TextView> <!-- tlphoner --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageButton android:id="@+id/boutonTelephoner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" android:src="@drawable/phonebutton" /> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingLeft="10px" android:layout_weight="1"> <TextView android:id="@+id/phoneText" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="16px" android:textStyle="bold" android:text="Appeler ce btiment" android:textColor="#000000" /> </LinearLayout> </LinearLayout> <!-- accs au site ou menu du ru --> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android"

36

android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/siteInternet" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="10px" /> </LinearLayout> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout>

1.6 GEOLOCALISATION.XML : AFFICHAGE DE LA PAGE DE GEOLOCALISATION


<?xml version="1.0" encoding="utf-8"?> <!-- Page golocalisation --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fff"> <!-- panel du haut --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" android:padding="1px" > <!-- barre de boutons --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/lieux" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@android:drawable/ic_menu_search" /> </LinearLayout> <!-- bouton pour avoir les lieux --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/itineraire" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@android:drawable/ic_menu_directions" /> </LinearLayout> <!-- bouton pour me localiser -->

37

<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/localiseMoi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:drawable/ic_menu_crop" /> </LinearLayout> <!-- bouton pour effacer les rsultats --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center"> <Button android:id="@+id/reinitialiser" android:layout_width="wrap_content" android:layout_height="fill_parent" android:background="@android:drawable/ic_menu_close_clear _cancel" /> </LinearLayout> </LinearLayout> <!-- Google map --> <com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="@string/key_map" android:layout_below="@+id/lieux" /> </LinearLayout>

1.7 BALLOON_OVERLAY.XML : OVERLAY SUR LA MAP


<?xml version="1.0" encoding="utf-8"?> <!-- Reprsente la figure lors d'un click sur un lieu de la carte ou sur sa position --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="35dip" android:paddingLeft="10dip" android:minWidth="200dip" android:id="@+id/balloon_main_layout" android:background="@drawable/balloon_overlay_bg_selector" android:paddingTop="0dip" android:paddingRight="0dip"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1" android:paddingTop="10dip"

38

android:id="@+id/balloon_inner_layout"> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/balloon_item_title" android:text="balloon_item_title" android:textSize="16dip" android:textColor="#FF000000"></TextView> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/balloon_item_snippet" android:text="balloon_item_snippet" android:textSize="12dip"></TextView> </LinearLayout> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/balloon_overlay_close" android:id="@+id/close_img_button" android:paddingLeft="10dip" android:paddingBottom="10dip" android:paddingRight="8dip" android:paddingTop="8dip"></ImageView> </LinearLayout>

1.8 ITINERAIRE.XML : POP-UP SUR LA MAP


<?xml version="1.0" encoding="utf-8" ?> <!-- Popup permettant le choix du lieu de destination, le mode de dplacement et le mode d'affichage(Navigation via GPS ou itineraire via maps) --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout_root"> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="50px"> <TextView android:layout_width="wrap_content" android:text="Point de dpart :" android:layout_height="wrap_content" android:layout_below="@+id/LinearLayout01" android:id="@+id/TextView01"></TextView> <EditText android:id="@+id/EditTextMaPosition" android:enabled="false" android:editable="false" android:text="Ma position" android:layout_width="fill_parent" android:layout_height="50px" android:layout_below="@+id/LinearLayout01" android:layout_toRightOf="@+id/TextView01"></EditText> </LinearLayout> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="fill_parent" android:layout_height="50px" android:layout_below="@+id/LinearLayout01"> <TextView android:layout_width="wrap_content" android:text="Destination :" android:layout_height="wrap_content" android:layout_below="@+id/TextView01" android:id="@+id/TextView02"></TextView> <AutoCompleteTextView android:id="@+id/autocomplete_country" android:layout_width="fill_parent" android:layout_height="50px" android:layout_marginLeft="22px" android:completionThreshold="1" android:layout_below="@+id/TextView01" android:layout_toRightOf="@+id/TextView02"/> </LinearLayout>

39

<LinearLayout android:id="@+id/LinearLayout03" android:layout_width="wrap_content" android:layout_height="80px" android:layout_below="@+id/LinearLayout02"> <TextView android:layout_width="wrap_content" android:layout_marginTop="27px" android:text="Mode de dplacement :" android:layout_height="wrap_content" android:layout_below="@+id/TextView01" android:id="@+id/TextView02"></TextView> <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:layout_width="wrap_content" android:id="@+id/RadioButtonPieton" android:text="Piton" android:checked="true" android:layout_height="35px" android:layout_below="@+id/LinearLayout02" android:layout_toRightOf="@+id/LinearLayout03"></RadioButton> <RadioButton android:layout_width="wrap_content" android:id="@+id/RadioButtonVoiture" android:text="Voiture" android:layout_height="35px" ></RadioButton> </RadioGroup> </LinearLayout> <LinearLayout android:id="@+id/LinearLayout04" android:layout_width="wrap_content" android:layout_height="50px" android:layout_below="@+id/LinearLayout03"> <Button android:id="@+id/ButtonNavigation" android:layout_width="wrap_content" android:layout_height="50px" android:text="Navigation" android:layout_below="@+id/LinearLayout03"/> <Button android:id="@+id/ButtonItineraire" android:layout_width="wrap_content" android:layout_height="50px" android:text="Itinraire" android:layout_below="@+id/LinearLayout03"/> </LinearLayout> </RelativeLayout>

1.9 PHONEBUTTON.XML : EXEMPLE DUN IMAGE BUTTON PERSONNALISE


<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/phone" android:state_pressed="true" /> <item android:drawable="@drawable/phone" android:state_focused="true" /> <item android:drawable="@drawable/phone" /> </selector>

2. COUCHE MODELE
2.1 BATIMENT.JAVA : CLASSE REPRESENTANT LOBJET BATIMENT
package com.ucampus.model; // Classe qui reprnte un bment public class Batiment { private int idCategorie;

40

private int idBatiment; private String name; private String numero; private String horaires; private String image; private String adresse; //Coordonn GPS private String latitude; private String longitude; private String siteInternet; public Batiment(int idCategorie,int idBatiment, String nameBat, String numeroBat, String horaires, String image, String adresse, String latitude, String longitude,String siteInternet) { super(); this.idCategorie = idCategorie; this.idBatiment=idBatiment; this.name = nameBat; this.numero = numeroBat; this.horaires = horaires; this.image = image; this.adresse = adresse; this.latitude = latitude; this.longitude = longitude; this.siteInternet=siteInternet; } public Batiment(){ } public int getIdBatiment() { return idBatiment; } public void setId(int idBatiment) { this.idBatiment = idBatiment; } public String getName() { return name; } public void setName(String nameBat) { this.name = nameBat; } public String getNumero() { return numero; } public void setNumero(String numero) { this.numero = numero; } public String getLatitude() { return latitude; } public void setLatitude(String latitude) { this.latitude = latitude; }

41

public String getLongitude() { return longitude; } public void setLongitude(String longitude) { this.longitude = longitude; } public String getSiteInternet() { return siteInternet; } public void setSiteInternet(String siteInternet) { this.siteInternet = siteInternet; } public int getIdCategorie() { return idCategorie; } public void setIdCategorie(int idCategorie) { this.idCategorie = idCategorie; } public String getHoraires() { return horaires; } public void setHoraires(String horaires) { this.horaires = horaires; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public String getAdresse() { return adresse; } public void setAdresse(String adresse) { this.adresse = adresse; } @Override public String toString() { return "Batiment [idBatiment=" + idBatiment + ", idCategorie=" + idCategorie + ", nameBat=" + name + ", numeroBat=" + numero + ", horaires=" + horaires + ", image=" + image + ", adresse=" + adresse + ", latitude=" + latitude + ", longitude=" + longitude + ", siteInternet=" + siteInternet + "]"; } }

42

2.2 CATEGORIE.JAVA : CLASSE REPRESENTANT LOBJET CATEGORIE


package com.ucampus.model; //Catrie de lieu public class Categorie { private int id; private String nameCategorie; //Icone qui reprnte la catrie private String iconCategorie; public Categorie(String nameCategorie, String iconCategorie) { super(); this.nameCategorie = nameCategorie; this.iconCategorie=iconCategorie; } public Categorie(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNameCategorie() { return nameCategorie; } public void setNameCategorie(String nameCategorie) { this.nameCategorie = nameCategorie; } public String getIconCategorie() { return iconCategorie; } public void setIconCategorie(String iconCategorie) { this.iconCategorie = iconCategorie; } @Override public String toString() { return "Categorie [id=" + id + ", iconCategorie=" + iconCategorie + ", nameCategorie=" + nameCategorie + "]"; } }

43

3. COUCHE DAO
3.1 BATIMENTDATABASE.JAVA : CREATION DE LA BASE DE BATIMENT AVEC SQLITE
package com.ucampus.dataBase; import import import import android.content.Context; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteDatabase.CursorFactory; android.database.sqlite.SQLiteOpenHelper;

public class BatimentDataBase extends SQLiteOpenHelper { private private private private private private private private private private private static static static static static static static static static static static final final final final final final final final final final final String String String String String String String String String String String TABLE_BAT = "table_batiment"; COL_ID = "ID_BAT"; COL_ID_CATEGORIE = "ID_CATEGORIE_BAT"; COL_NAME = "NAME_BAT"; COL_NUMERO = "NUMERO_BAT"; COL_HORAIRES = "HORAIRES_BAT"; COL_IMAGE = "IMAGE_BAT"; COL_ADRESSE = "ADRESSE_BAT"; COL_LATITUDE = "LATITUDE_BAT"; COL_LONGITUDE= "LONGITUDE_BAT"; COL_SITEINTERNET= "SITEINTERNET_BAT";

//requete pour la cration de la table private static final String CREATE_BDD = "CREATE TABLE " + TABLE_BAT + " (" + + + + + + + + + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " COL_ID_CATEGORIE + " INTEGER NOT NULL , " COL_NAME + " TEXT NOT NULL, " COL_NUMERO + " TEXT NOT NULL ," COL_HORAIRES + " TEXT NOT NULL ," COL_IMAGE + " TEXT NOT NULL ," COL_ADRESSE + " TEXT NOT NULL ," COL_LATITUDE + " TEXT NOT NULL ," COL_LONGITUDE + " TEXT NOT NULL," COL_SITEINTERNET + " TEXT NOT NULL);";

public BatimentDataBase(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } //on cree la table @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(CREATE_BDD); } //a chaque update de la table @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

44

// TODO Auto-generated method stub db.execSQL("DROP TABLE " + TABLE_BAT + ";"); onCreate(db); } }

3.2 CATEGORIEDATABASE.JAVA : CREATION DE LA BASE DE CATEGORIE AVEC SQLITE


package com.ucampus.dataBase; import import import import android.content.Context; android.database.sqlite.SQLiteDatabase; android.database.sqlite.SQLiteDatabase.CursorFactory; android.database.sqlite.SQLiteOpenHelper;

public class CategorieDataBase extends SQLiteOpenHelper { private private private private static static static static final final final final String String String String TABLE_BAT = "table_categorie"; COL_ID = "ID_CAT"; COL_NAME = "NAME_CAT"; COL_ICON = "ICON_CAT";

//requete pour la cration de la table private static final String CREATE_BDD = "CREATE TABLE " + TABLE_BAT + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_NAME + " TEXT NOT NULL, " + COL_ICON + " TEXT NOT NULL);"; public CategorieDataBase(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } //on cree la table @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL(CREATE_BDD); } //a chaque update de la table @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub db.execSQL("DROP TABLE " + TABLE_BAT + ";"); onCreate(db); } }

45

3.3 BATIMENTDAO.JAVA : CONNEXION ET CRUD SUR LA BASE DES BATIMENTS


package com.ucampus.dao; import java.util.ArrayList; import import import import android.content.ContentValues; android.content.Context; android.database.Cursor; android.database.sqlite.SQLiteDatabase;

import com.ucampus.dataBase.BatimentDataBase; import com.ucampus.model.Batiment; public class BatimentDAO { private static final int VERSION_BDD = 1; private static final String NOM_BDD = "uCampusBat.db"; private private private private private private private private private private private private private private private private private private private private private private static final String TABLE_BAT = "table_batiment"; static final String COL_ID_BAT = "ID_BAT"; static final int NUM_ID = 0; static final String COL_ID_CATEGORIE = "ID_CATEGORIE_BAT"; static final int NUM_ID_CATEGORIE = 1; static final String COL_NAME = "NAME_BAT"; static final int NUM_COL_NAME = 2; static final String COL_NUMERO = "NUMERO_BAT"; static final int NUM_COL_NUMERO = 3; static final String COL_HORAIRES = "HORAIRES_BAT"; static final int NUM_COL_HORAIRES = 4; static final String COL_IMAGE = "IMAGE_BAT"; static final int NUM_COL_IMAGE = 5; static final String COL_ADRESSE = "ADRESSE_BAT"; static final int NUM_COL_ADRESSE = 6; static final String COL_LATITUDE = "LATITUDE_BAT"; static final int NUM_COL_LATITUDE = 7; static final String COL_LONGITUDE = "LONGITUDE_BAT"; static final int NUM_COL_LONGITUDE = 8; static final String COL_SITEINTERNET = "SITEINTERNET_BAT"; static final int NUM_COL_SITEINTERNET = 9; SQLiteDatabase bdd;

private BatimentDataBase maBatimentDataBase; public BatimentDAO(Context context) { // On crer la BDD et sa table maBatimentDataBase = new BatimentDataBase(context, NOM_BDD, null, VERSION_BDD); } public void open() { // on ouvre la BDD en criture bdd = maBatimentDataBase.getWritableDatabase(); } public void close() { // on ferme l'accs la BDD

46

bdd.close(); } public SQLiteDatabase getBdd() { return bdd; } public long insertBatiment(Batiment b) { // Cration d'un ContentValues (fonctionne comme une HashMap) ContentValues values = new ContentValues(); // on lui ajoute une valeur associ une cl (qui est le nom de la // colonne dans laquelle on veut mettre la valeur) values.put(COL_NAME, b.getName()); values.put(COL_NUMERO, b.getNumero()); values.put(COL_ID_CATEGORIE, b.getIdCategorie()); values.put(COL_HORAIRES, b.getHoraires()); values.put(COL_IMAGE, b.getImage()); values.put(COL_ADRESSE, b.getAdresse()); values.put(COL_LATITUDE, b.getLatitude()); values.put(COL_LONGITUDE, b.getLongitude()); values.put(COL_SITEINTERNET, b.getSiteInternet()); values.put(COL_ID_BAT, b.getIdBatiment()); return bdd.insert(TABLE_BAT, null, values); } public long updateBatiment(int id, Batiment b) { // Cration d'un ContentValues (fonctionne comme une HashMap) ContentValues values = new ContentValues(); // on lui ajoute une valeur associ une cl (qui est le nom de la // colonne dans laquelle on veut mettre la valeur) values.put(COL_NAME, b.getName()); values.put(COL_NUMERO, b.getNumero()); values.put(COL_ID_CATEGORIE, b.getIdCategorie()); values.put(COL_HORAIRES, b.getHoraires()); values.put(COL_IMAGE, b.getImage()); values.put(COL_ADRESSE, b.getAdresse()); values.put(COL_LATITUDE, b.getLatitude()); values.put(COL_LONGITUDE, b.getLongitude()); values.put(COL_SITEINTERNET, b.getSiteInternet()); values.put(COL_ID_BAT, b.getIdBatiment()); return bdd.update(TABLE_BAT, values, COL_ID_BAT + " = " + id, null); } public int removeBatimentWithID(int id) { // Suppression d'un batiment de la BDD grce l'ID return bdd.delete(TABLE_BAT, COL_ID_BAT + " = " + id, null); } public ArrayList<Batiment> getAllBatiment() { ArrayList<Batiment> allBatiments = new ArrayList<Batiment>(); Cursor c = bdd.query(TABLE_BAT, new String[] { COL_ID_BAT, COL_ID_CATEGORIE, COL_NAME, COL_NUMERO, COL_HORAIRES, COL_IMAGE, COL_ADRESSE, COL_LATITUDE, COL_LONGITUDE, COL_SITEINTERNET }, null, null, null, null, null); if (c.getCount() == 0) {

47

return null; } else { while (c.moveToNext()) { Batiment batiment = new Batiment(); // on lui affecte toutes les infos grce aux infos contenues // dans le Cursor batiment.setId(c.getInt(NUM_ID)); batiment.setName(c.getString(NUM_COL_NAME)); batiment.setNumero(c.getString(NUM_COL_NUMERO)); batiment.setIdCategorie(c.getInt(NUM_ID_CATEGORIE)); batiment.setHoraires(c.getString(NUM_COL_HORAIRES)); batiment.setImage(c.getString(NUM_COL_IMAGE)); batiment.setAdresse(c.getString(NUM_COL_ADRESSE)); batiment.setLatitude(c.getString(NUM_COL_LATITUDE)); batiment.setLongitude(c.getString(NUM_COL_LONGITUDE)); batiment.setSiteInternet(c.getString(NUM_COL_SITEINTERNET)); allBatiments.add(batiment); } c.close(); } return allBatiments; } public Batiment getBatimentWithName(String name) { // Rcupre dans un Cursor les valeur correspondant un batiment // contenu dans la BDD Cursor c = bdd.query(TABLE_BAT, new String[] { COL_ID_BAT, COL_ID_CATEGORIE, COL_NAME, COL_NUMERO, COL_HORAIRES, COL_IMAGE, COL_ADRESSE, COL_LATITUDE, COL_LONGITUDE, COL_SITEINTERNET }, COL_NAME + " LIKE \"" + name + "\"", null, null, null, null); return cursorToBatiment(c); } public ArrayList<Batiment> getBatimentWithCategorie(int catId) { ArrayList<Batiment> allBatiments = new ArrayList<Batiment>(); // Rcupre dans un Cursor les valeur correspondant un batiment // contenu dans la BDD Cursor c = bdd.query(TABLE_BAT, new String[] { COL_ID_BAT, COL_ID_CATEGORIE, COL_NAME, COL_NUMERO, COL_HORAIRES, COL_IMAGE, COL_ADRESSE, COL_LATITUDE, COL_LONGITUDE, COL_SITEINTERNET }, COL_ID_CATEGORIE + " LIKE \"" + catId + "\"", null, null, null, null); if (c.getCount() == 0) { return null; } else { while (c.moveToNext()) { Batiment batiment = new Batiment();

48

// on lui affecte toutes les infos grce aux infos contenues // dans le Cursor batiment.setId(c.getInt(NUM_ID)); batiment.setName(c.getString(NUM_COL_NAME)); batiment.setNumero(c.getString(NUM_COL_NUMERO)); batiment.setIdCategorie(c.getInt(NUM_ID_CATEGORIE)); batiment.setHoraires(c.getString(NUM_COL_HORAIRES)); batiment.setImage(c.getString(NUM_COL_IMAGE)); batiment.setAdresse(c.getString(NUM_COL_ADRESSE)); batiment.setLatitude(c.getString(NUM_COL_LATITUDE)); batiment.setLongitude(c.getString(NUM_COL_LONGITUDE)); batiment.setSiteInternet(c.getString(NUM_COL_SITEINTERNET)); allBatiments.add(batiment); } c.close(); } return allBatiments; } private Batiment cursorToBatiment(Cursor c) { // si aucun lment n'a t retourn dans la requte, on renvoie null if (c.getCount() == 0) return null; // Sinon on se place sur le premier lment c.moveToFirst(); // On cr un batiment Batiment batiment = new Batiment(); // on lui affecte toutes les infos grce aux infos contenues dans le // Cursor batiment.setId(c.getInt(NUM_ID)); batiment.setName(c.getString(NUM_COL_NAME)); batiment.setNumero(c.getString(NUM_COL_NUMERO)); batiment.setIdCategorie(c.getInt(NUM_ID_CATEGORIE)); batiment.setHoraires(c.getString(NUM_COL_HORAIRES)); batiment.setImage(c.getString(NUM_COL_IMAGE)); batiment.setAdresse(c.getString(NUM_COL_ADRESSE)); batiment.setLatitude(c.getString(NUM_COL_LATITUDE)); batiment.setLongitude(c.getString(NUM_COL_LONGITUDE)); batiment.setSiteInternet(c.getString(NUM_COL_SITEINTERNET)); // On ferme le cursor c.close(); // On retourne le batiment return batiment; } }

49

3.4 CATEGORIEDAO.JAVA : CONNEXION ET CRUD SUR LA BASE DES CATEGORIES


package com.ucampus.dao; import java.util.ArrayList; import import import import android.content.ContentValues; android.content.Context; android.database.Cursor; android.database.sqlite.SQLiteDatabase;

import com.ucampus.dataBase.CategorieDataBase; import com.ucampus.model.Categorie; public class CategorieDAO { private static final int VERSION_BDD = 1; private static final String NOM_BDD = "uCampusCat.db"; private private private private private private private static static static static static static static final final final final final final final String TABLE_BAT = "table_categorie"; String COL_ID = "ID_CAT"; int NUM_ID = 0; String COL_NAME = "NAME_CAT"; int NUM_COL_NAME = 1; String COL_ICON = "ICON_CAT"; int NUM_COL_ICON = 2;

private SQLiteDatabase bdd; private CategorieDataBase maCategorieDataBase; public CategorieDAO(Context context){ //On crer la BDD et sa table maCategorieDataBase = new CategorieDataBase(context, NOM_BDD, null, VERSION_BDD); } public void open(){ //on ouvre la BDD en criture bdd = maCategorieDataBase.getWritableDatabase(); } public void close(){ //on ferme l'accs la BDD bdd.close(); } public SQLiteDatabase getBdd() { return bdd; } public long insertCategorie(Categorie c){ //Cration d'un ContentValues (fonctionne comme une HashMap) ContentValues values = new ContentValues(); //on lui ajoute une valeur associ une cl (qui est le nom de la colonne dans laquelle on veut mettre la valeur) values.put(COL_NAME, c.getNameCategorie()); values.put(COL_ICON, c.getIconCategorie());

50

return bdd.insert(TABLE_BAT, null, values); } public long updateCategorie(int id, Categorie c){ //Cration d'un ContentValues (fonctionne comme une HashMap) ContentValues values = new ContentValues(); //on lui ajoute une valeur associ une cl (qui est le nom de la colonne dans laquelle on veut mettre la valeur) values.put(COL_NAME, c.getNameCategorie()); values.put(COL_ICON, c.getIconCategorie()); return bdd.update(TABLE_BAT, values, COL_ID + " = " +id, null); } public int removeCategorieWithID(int id){ //Suppression d'une catgorie de la BDD grce l'ID return bdd.delete(TABLE_BAT, COL_ID + " = " +id, null); } public ArrayList<Categorie> getAllCategories(){ ArrayList<Categorie> allCategories = new ArrayList<Categorie>(); Cursor c = bdd.query(TABLE_BAT, new String[] {COL_ID, COL_NAME, COL_ICON}, null, null, null, null, null); if (c.getCount() == 0){ return null; }else{ while (c.moveToNext()){ Categorie cat = new Categorie(); //on lui affecte toutes les infos grce aux infos contenues dans le Cursor cat.setId(c.getInt(NUM_ID)); cat.setNameCategorie(c.getString(NUM_COL_NAME)); cat.setIconCategorie(c.getString(NUM_COL_ICON)); allCategories.add(cat); } c.close(); } return allCategories; } public Categorie getCategorieWithName(String name){ //Rcupre dans un Cursor les valeur correspondant une catgorie contenue dans la BDD Cursor c = bdd.query(TABLE_BAT, new String[] {COL_ID, COL_NAME, COL_ICON}, COL_NAME + " LIKE \"" + name +"\"", null, null, null, null); return cursorToBCategorie(c); } public Categorie getCategorieById(int id){ //Rcupre dans un Cursor les valeur correspondant une categorie contenue dans la BDD Cursor c = bdd.query(TABLE_BAT, new String[] {COL_ID, COL_NAME,COL_ICON}, COL_ID + " LIKE \"" + id +"\"", null, null, null, null); return cursorToBCategorie(c); } private Categorie cursorToBCategorie(Cursor c) { //si aucun lment n'a t retourn dans la requte, on renvoie null if (c.getCount() == 0)

51

return null; //Sinon on se place sur le premier lment c.moveToFirst(); //On cr une categorie Categorie cat = new Categorie(); //on lui affecte toutes les infos grce aux infos contenues dans le Cursor cat.setId(c.getInt(NUM_ID)); cat.setNameCategorie(c.getString(NUM_COL_NAME)); cat.setIconCategorie(c.getString(NUM_COL_ICON)); //On ferme le cursor c.close(); //On retourne la categorie return cat; } }

4. COUCHE UTILITAIRES
4.1 INSERTBDD.JAVA : CLASSE DINSERTION DANS LMA BASE
package com.ucampus.utils; import android.content.Context; import import import import import com.google.android.maps.GeoPoint; com.ucampus.dao.BatimentDAO; com.ucampus.dao.CategorieDAO; com.ucampus.model.Batiment; com.ucampus.model.Categorie;

public class InsertBDD { final BatimentDAO bBDD; final CategorieDAO cBDD; //premire version qui n'utilise pas de Parser BDD public InsertBDD(Context c) { super(); //Insertion des catgories this.cBDD = new CategorieDAO(c); cBDD.open(); if (cBDD.getAllCategories() == null) { Categorie cat; // A renseigner pour crer une catgorie : // Nom de la catgorie // icone qui represente la catgorie cat = new Categorie("Restaurants","cook"); cBDD.insertCategorie(cat); cat = new Categorie("Sant","health"); cBDD.insertCategorie(cat); cat = new Categorie("Salle de sport","sports"); cBDD.insertCategorie(cat); } cBDD.close();

52

this.bBDD = new BatimentDAO(c); bBDD.open(); if (bBDD.getAllBatiment()== null) { // A renseigner pour crer un btiement : // Id de la catgorie // Id du btiment // Nom du btiment // Numro de tlphone // Horaires d'ouverture // Image // Adresse // Latitude // longitude // Site internet Batiment b; // Catgorie : Restaurants Universitaire b = new Batiment(1,1,"Le Barrois","03 20 33 61 23","11h15 13h30 ","imgM5","Cit Scientifique","50611027","3144468","http://www.crous-lille.fr/adminsite/restauration_menu_print_w.php?ru=26&midi=1&soir=1&nb_w=2"); bBDD.insertBatiment(b); b = new Batiment(1,2,"Le Pariselle","03 20 43 43 85","11h30 13h45 et 18h30 19h45","imgM3","Cit Scientifique - Boulevard Langevin","50608186","3147195","http://www.crous-lille.fr/adminsite/restauration_menu_print_w.php?ru=19&midi=1&soir=1&nb_w=2"); bBDD.insertBatiment(b); b = new Batiment(1,3,"Le Sully","03 20 43 44 51","11h15 13h30 ","imgM3","Cit Scientifique - Boulevard Langevin","50605594","3136443","http://www.crous-lille.fr/adminsite/restauration_menu_print_w.php?ru=25&midi=1&soir=1&nb_w=2"); bBDD.insertBatiment(b); // Catgorie : Sant b = new Batiment(2,4,"SIUMPPS","03 20 43 65 50","du lundi au jeudi de 8h30 17h00 et le vendredi de 8h30 16h00 ","imgM3","Le Service Inter-Universitaire de Mdecine Prventive et de Promotion de la Sante (SIUMPPS) situ, pour l'Universit Lille 1, la Maison Universitaire de la Sant face au Btiment A3, ct du M1, Cit Scientifique, 59650 VILLENEUVE DASCQ","50608335","3138784","http://www.univlille1.fr/campus/Sante"); bBDD.insertBatiment(b); // Catgorie : Salle de sport b = new Batiment(3,5,"COSEC","03 20 33 62 00","Veuillez consulter le site internet de l'universit ","imgM3","Universit Lille I Bvd Paul Langevin -59655 Villeneuve d'Ascq","50606874","3145176","http://suaps.univ-lille1.fr/AssoSportive/Asso+des+Etudiants+de+Lille1/"); bBDD.insertBatiment(b); b = new Batiment(3,6,"Halle Grmeaux","03 20 33 62 00","Veuillez consulter le site internet de l'universit ","imgM3","Universit Lille I Rue Paul Langevin - 59650 Villeneuve d'Ascq","50607554","3134383","http://suaps.univ-lille1.fr/AssoSportive/Asso+des+Etudiants+de+Lille1/"); bBDD.insertBatiment(b); b = new Batiment(3,7,"Halle Vallin","03 20 33 62 00","Veuillez consulter le site internet de l'universit ","imgM3","Universit Lille I Rue Paul Langevin - 59650 Villeneuve d'Ascq","50609779","3136005","http://suaps.univ-lille1.fr/AssoSportive/Asso+des+Etudiants+de+Lille1/");

53

bBDD.insertBatiment(b); } bBDD.close(); } }

5. COUCHE ANDROID
5.1 HOME.JAVA : LA PAGE DACCUEIL
package com.ucampus; import import import import import import import import import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.Context; android.content.DialogInterface; android.content.Intent; android.location.LocationManager; android.net.ConnectivityManager; android.net.NetworkInfo; android.net.wifi.WifiManager; android.os.Bundle; android.os.Vibrator; android.view.Menu; android.view.MenuInflater; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.Toast;

import com.ucampus.dao.BatimentDAO; import com.ucampus.utils.InsertBDD; public class Home extends Activity { private Button localisationHome; private Button search; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //insertion dans la base si il n'y a rien dedans InsertBDD i = new InsertBDD(this); //listener et action sur le button localidation localisationHome = (Button) findViewById(R.id.localisationHome); localisationHome.setOnClickListener(new OnClickListener() { public void onClick(View v) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); //Test si GPS est activ

54

if (isGPSon()) { //Test si 3G est active if (is3GorWIFIon()) { Intent intent = new Intent(Home.this,Geolocalisation.class); startActivity(intent); } else { create3GWifiDisabledAlert(); } } else { createGpsDisabledAlert(); } } }); //listener et action sur le button recherche de lieu search = (Button) findViewById(R.id.searchHome); search.setOnClickListener(new OnClickListener() { public void onClick(View v) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); Intent intent = new Intent(Home.this, CatList.class); startActivity(intent); } }); } // Test si l'acces internet (WIFI ou 3G) est activ private Boolean is3GorWIFIon() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null) { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (!wifi.isWifiEnabled()) { return false; } else { return true; } } else { return true; } } // Test si le GPS est activ private Boolean isGPSon() { LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { return false; } else { return true; } } // On propose l'utilisateur d'activer son gps private void create3GWifiDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( "Veuillez activer votre 3G (manuellement) ou votre WIFI! Souhaitez-vous activer WIFI?")

55

.setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent connectingOptionsIntent = new Intent( android.provider.Settings.ACTION_WIFI_SETTINGS); startActivity(connectingOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } // On informe l'utilisateur qu'il doit activer sa 3G ou son Wifi private void createGpsDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Votre GPS est dsactiv! Souhaitez-vous l'activer?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent gpsOptionsIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(gpsOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } //Cration du menu public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menuaccueil, menu); return true; } // Appeler lors du click sur le menu public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuReglages: Intent intent = new Intent(Home.this, Reglages.class); startActivity(intent); break; }

56

return true; } }

5.2 CATLIST.JAVA : PAGE DE LISTING DES CATEGORIES


package com.ucampus; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import import import import import import import import import import import import import import android.content.Intent; android.graphics.drawable.Drawable; android.os.Bundle; android.os.Vibrator; android.util.Log; android.view.Menu; android.view.MenuInflater; android.view.MenuItem; android.view.View; android.widget.AdapterView; android.widget.ListView; android.widget.SimpleAdapter; android.widget.AdapterView.OnItemClickListener; android.widget.Toast;

import com.ucampus.dao.CategorieDAO; import com.ucampus.model.Categorie; public class CatList extends Activity { private ListView categoriesListView; /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.catlist); CategorieDAO cBDD = new CategorieDAO(this); cBDD.open(); //Rcupration de la listview cre dans le fichier catlist.xml categoriesListView = (ListView) findViewById(R.id.listviewcategories); //Cration de la ArrayList qui nous permettra de remplir la listView ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>(); //On dclare la HashMap qui contiendra les informations pour un item HashMap<String, String> map;

ArrayList<Categorie> allC = cBDD.getAllCategories(); for (Categorie c : allC) {

57

//Cration d'une HashMap pour insrer les informations du premier item de notre listView map = new HashMap<String, String>(); //on insre un lment titre que l'on rcuprera dans le textView titre cr dans le fichier affichageitem.xml map.put("titre",c.getNameCategorie() ); //on insre un lment description que l'on rcuprera dans le textView description cr dans le fichier affichageitem.xml map.put("description", "Tous les batiment de la catgorie "+c.getNameCategorie()); //on rcupre l'id de l'iamge dans les ressources du projet (les images dans les apk sont compiles...) int resID = getResources().getIdentifier(c.getIconCategorie(), "drawable", "com.ucampus"); map.put("img", String.valueOf(resID)); //enfin on ajoute cette hashMap dans la arrayList listItem.add(map); } //Cration d'un SimpleAdapter qui se chargera de mettre les items prsent dans notre list (listItem) dans la vue affichageitem SimpleAdapter mSchedule = new SimpleAdapter (this.getBaseContext(), listItem, R.layout.affichageitem, new String[] {"img", "titre", "description"}, new int[] {R.id.img, R.id.titre, R.id.description}); //On attribut notre listView l'adapter que l'on vient de crer categoriesListView.setAdapter(mSchedule); //On met un couteur d'vnement sur notre listView categoriesListView.setOnItemClickListener(new OnItemClickListener() { @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> a, View v, int position, long id) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); //on rcupre la HashMap contenant les infos de notre item (titre, description, img) HashMap<String, String> map = (HashMap<String, String>) categoriesListView.getItemAtPosition(position); Intent intent = new Intent(CatList.this, BatList.class); intent.putExtra("catName", map.get("titre")); CatList.this.startActivity(intent); } }); cBDD.close(); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menulistecategorie, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuAccueil:

58

Intent intent2 = new Intent(CatList.this, Home.class); startActivity(intent2); this.finish(); break; case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuLocalisation: Intent intent = new Intent(CatList.this, Geolocalisation.class); startActivity(intent); this.finish(); break; case R.id.menuReglages: Intent intent3 = new Intent(CatList.this, Reglages.class); startActivity(intent3);this.finish(); break; } return true; } }

5.3 BATLIST.JAVA : PAGE DE LISTING DES BATIMENTS


package com.ucampus; import java.util.ArrayList; import java.util.HashMap; import import import import import import import import import import import import import import import import import import import import import android.app.Activity; android.app.ListActivity; android.content.Intent; android.os.Bundle; android.os.Vibrator; android.util.Log; android.view.Menu; android.view.MenuInflater; android.view.MenuItem; android.view.View; android.widget.AdapterView; android.widget.AdapterView.OnItemClickListener; android.widget.ArrayAdapter; android.widget.ListView; android.widget.SimpleAdapter; android.widget.TextView; android.widget.Toast; com.ucampus.dao.BatimentDAO; com.ucampus.dao.CategorieDAO; com.ucampus.model.Batiment; com.ucampus.model.Categorie;

public class BatList extends Activity { private ArrayList<String> lesLieux = new ArrayList<String>(); private ListView categoriesListView;

59

private TextView titleList; /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.batlist); final BatimentDAO bBDD = new BatimentDAO(this); final String catName = this.getIntent().getExtras() .getString("catName"); bBDD.open(); // rcupration de la catgorie choisie CategorieDAO cBDD = new CategorieDAO(this); cBDD.open(); Categorie categorie = cBDD.getCategorieWithName(catName); cBDD.close(); // Rcupration de la listview cre dans le fichier catlist.xml categoriesListView = (ListView) findViewById(R.id.listviewbatiments); // Cration de la ArrayList qui nous permettra de remplir la listView ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>(); // On dclare la HashMap qui contiendra les informations pour un item HashMap<String, String> map; final ArrayList<String> allBName = new ArrayList<String>(); ArrayList<Batiment> allB = bBDD.getBatimentWithCategorie(categorie.getId()); for (Batiment b : allB) { // Cration d'une HashMap pour insrer les informations du premier item de notre listView map = new HashMap<String, String>(); // on insre un lment titre que l'on rcuprera dans le textView titre cr dans le fichier affichageitem.xml map.put("titre", b.getName()); // on insre un lment description que l'on rcuprera dans le textView description cr dans le fichier affichageitem.xml map.put("description", b.getAdresse()); //on rcupre l'id de l'iamge dans les ressources du projet (les images dans les apk sont compiles...) int resID = getResources().getIdentifier(categorie.getIconCategorie(), "drawable", "com.ucampus"); map.put("img", String.valueOf(resID)); // enfin on ajoute cette hashMap dans la arrayList listItem.add(map); allBName.add(b.getName()); } // Ajout de l'option tous les batiments map = new HashMap<String, String>(); map.put("titre", catName+" : tous les btiments"); map.put("description", "");

60

allBName.add(catName+ " : tous les btiments"); String[] BATS = new String[allBName.size()]; allBName.toArray(BATS); int resID = getResources().getIdentifier(categorie.getIconCategorie(), "drawable", "com.ucampus"); map.put("img", String.valueOf(resID)); listItem.add(map); // Cration d'un SimpleAdapter qui se chargera de mettre les items prsent dans notre list (listItem) dans la vue affichageitem SimpleAdapter mSchedule = new SimpleAdapter(this.getBaseContext(), listItem, R.layout.affichageitem, new String[] { "img", "titre", "description" }, new int[] { R.id.img, R.id.titre, R.id.description }); // On attribut notre listView l'adapter que l'on vient de crer categoriesListView.setAdapter(mSchedule); //Affichage du titre de la page en fonction de la catgorie titleList = (TextView) findViewById(R.id.titleBatList); titleList.setText(catName); categoriesListView.setOnItemClickListener(new OnItemClickListener() { @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> a, View v, int position, long id) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); // on rcupre la HashMap contenant les infos de notre item // (titre, description, img) HashMap<String, String> map = (HashMap<String, String>) categoriesListView.getItemAtPosition(position); //permet d'afficher tous les btiments de la catgorie if (map.get("titre").contains(" : tous les btiments")) { allBName.remove(allBName.size()-1); lesLieux.addAll(allBName); Log.e("les batiments : ",lesLieux.toString()); Intent intent = new Intent(BatList.this,Geolocalisation.class); intent.putExtra("categorieDeLieux", catName); intent.putStringArrayListExtra("lieu", lesLieux); bBDD.close(); BatList.this.startActivity(intent); } else { Intent intent = new Intent(BatList.this, ViewBatiment.class); intent.putExtra("BatName", map.get("titre")); bBDD.close(); BatList.this.startActivity(intent); }

61

} }); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menulistecategorie, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuAccueil: Intent intent = new Intent(BatList.this, Home.class); startActivity(intent); this.finish(); break; case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuLocalisation: Intent intent2 = new Intent(BatList.this, Geolocalisation.class); startActivity(intent2); this.finish(); break; case R.id.menuReglages: Intent intent3 = new Intent(BatList.this, Reglages.class); startActivity(intent3); this.finish(); break; } return true; } }

5.4 VIEWBATIMENT.JAVA : FICHE DETAILLEE DU BATIMENT


package com.ucampus; import java.util.ArrayList; import import import import import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.Context; android.content.DialogInterface; android.content.Intent; android.location.LocationManager; android.net.ConnectivityManager; android.net.NetworkInfo; android.net.Uri; android.net.wifi.WifiManager; android.os.Bundle; android.os.Vibrator; android.util.Log; android.view.Menu;

62

import import import import import import import import import import import import import import import import

android.view.MenuInflater; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.ImageButton; android.widget.TabHost; android.widget.TabHost.OnTabChangeListener; android.widget.TabHost.TabSpec; android.widget.TextView; android.widget.Toast; com.google.android.maps.GeoPoint; com.google.android.maps.OverlayItem; com.ucampus.dao.BatimentDAO; com.ucampus.dao.CategorieDAO; com.ucampus.model.Batiment;

public class ViewBatiment extends Activity { private ArrayList<String> lesLieux = new ArrayList<String>(); private String numeroTelephone; private String uriString; private TabHost monTabHost; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.viewbatiment); /** Ajout des onglets **/ monTabHost = (TabHost) findViewById(R.id.TabHost01); monTabHost.setup(); /** Ajout des 3 onglets **/ TabSpec spec = monTabHost.newTabSpec("onglet_info"); spec.setIndicator("",getResources().getDrawable(R.drawable.info)); spec.setContent(R.id.general_info); monTabHost.addTab(spec); monTabHost.addTab(monTabHost.newTabSpec("onglet_loc_maps").setIndicat or("",getResources().getDrawable(R.drawable.map)).setContent(R.id.loc_maps) ); monTabHost.addTab(monTabHost.newTabSpec("onglet_autres").setIndicator ("",getResources().getDrawable(R.drawable.plus)).setContent(R.id.autres)); String batName = this.getIntent().getExtras().getString("BatName"); final BatimentDAO bBDD = new BatimentDAO(this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(this); cBDD.open(); final Batiment b = bBDD.getBatimentWithName(batName); //mise jour du texte dans la fiche du batiment TextView tW = (TextView) findViewById(R.id.name); tW.setText(b.getName()); tW = (TextView) findViewById(R.id.numero); tW.setText(b.getNumero());

63

numeroTelephone = b.getNumero(); tW = (TextView) findViewById(R.id.ouverture); tW.setText(b.getHoraires()); tW = (TextView) findViewById(R.id.adresse); tW.setText(b.getAdresse()); // url du site internet uriString = b.getSiteInternet(); // Mise jour du label du bouton Button boutonSiteInternet = (Button) findViewById(R.id.siteInternet); //Si c'est un restaurant on changre le texte du bouton if (b.getIdCategorie()==1){ boutonSiteInternet.setText("Menu du RU"); }else{ boutonSiteInternet.setText("Site internet"); } cBDD.close(); bBDD.close(); //Action lors du click sur le bouton de localisation d'un btiment ImageButton boutonLocalise = (ImageButton) findViewById(R.id.localise); boutonLocalise.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { //Test si le GPS est activ if (isGPSon()) { //Test si la 3G est active if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); //Ajout de la catgorie de lieu afficher dans les parametres du intent intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); lesLieux.add(b.getName()); //Ajout des lieux afficher dans les parametres du intent intent.putStringArrayListExtra("lieu", lesLieux); cBDD.close(); bBDD.close(); //Vibrateur pour informer du click ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else { createGpsDisabledAlert();

64

} } }); //Affichage du site du btiment (ou du menu du RU) boutonSiteInternet.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ Log.e("internet","internet"+uriString); Uri intentUri = Uri.parse(uriString); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(intentUri); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } }); //lancement du mode itinraire piton ImageButton boutonItinerairePieton = (ImageButton) findViewById(R.id.itinerairePieton); boutonItinerairePieton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); intent.putExtra("lieuDestination", b.getName()); intent.putExtra("modeDeplacement", "pieton"); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else { createGpsDisabledAlert();

65

} } }); //lancement du mode itinraire voiture ImageButton boutonItineraireVoiture = (ImageButton) findViewById(R.id.itineraireVoiture); boutonItineraireVoiture.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); intent.putExtra("lieuDestination", b.getName()); intent.putExtra("modeDeplacement", "voiture"); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else { createGpsDisabledAlert(); } } }); //lancement du mode navigation piton ImageButton boutonNavigationPieton = (ImageButton) findViewById(R.id.navigationPieton); boutonNavigationPieton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this);

66

cBDD.open(); GeoPoint point = new GeoPoint( Integer.parseInt(b.getLatitude()), Integer.parseInt(b .getLongitude())); OverlayItem overlayitem = new OverlayItem(point, cBDD .getCategorieById(b.getIdCategorie()) .getNameCategorie(), null); Intent i = new Intent(Intent.ACTION_VIEW, Uri .parse("google.navigation:q=" + overlayitem.routableAddress() + "&mode=w")); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(i); } } else { createGpsDisabledAlert(); } } }); //lancement du mode navigation voiture ImageButton boutonNavigationVoiture = (ImageButton) findViewById(R.id.navigationVoiture); boutonNavigationVoiture.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); GeoPoint point = new GeoPoint( Integer.parseInt(b.getLatitude()), Integer.parseInt(b .getLongitude())); OverlayItem overlayitem = new OverlayItem(point, cBDD .getCategorieById(b.getIdCategorie()) .getNameCategorie(), null); Intent i = new Intent(Intent.ACTION_VIEW, Uri

67

.parse("google.navigation:q=" + overlayitem.routableAddress())); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(i); } } else { createGpsDisabledAlert(); } } }); //action pour tlphoner au btiment ImageButton boutonTelephoner = (ImageButton) findViewById(R.id.boutonTelephoner); boutonTelephoner.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); startActivityForResult( new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + numeroTelephone)), 1); cBDD.close(); bBDD.close(); } }); } // Test si le GPS est activ private Boolean isGPSon() { LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { return false; } else { return true; } } // On informe l'utilisateur qu'il doit activer sa 3G ou son Wifi private void createGpsDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Votre GPS est dsactiv! Souhaitez-vous l'activer?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) {

68

Intent gpsOptionsIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(gpsOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } // Test si l'acces internet (WIFI ou 3G) est activ private Boolean is3GorWIFIon() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null) { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (!wifi.isWifiEnabled()) { return false; } else { return true; } } else { return true; } } // On propose l'utilisateur d'activer son gps private void create3GWifiDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( "Veuillez activer votre 3G (manuellement) ou votre WIFI! Souhaitez-vous activer WIFI?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent connectingOptionsIntent = new Intent( android.provider.Settings.ACTION_WIFI_SETTINGS); startActivity(connectingOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel();

69

} }); AlertDialog alert = builder.create(); alert.show(); } //Gestion du menu public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menulistecategorie, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); switch (item.getItemId()) { case R.id.menuAccueil: Intent intent2 = new Intent(ViewBatiment.this, Home.class); startActivity(intent2); this.finish(); break; case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuLocalisation: Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); startActivity(intent); this.finish(); break; case R.id.menuReglages: Intent intent3 = new Intent(ViewBatiment.this, Reglages.class); startActivity(intent3); this.finish(); break; } return true; } } package com.ucampus; import java.util.ArrayList; import import import import import import import import import import import import import android.app.Activity; android.app.AlertDialog; android.content.Context; android.content.DialogInterface; android.content.Intent; android.location.LocationManager; android.net.ConnectivityManager; android.net.NetworkInfo; android.net.Uri; android.net.wifi.WifiManager; android.os.Bundle; android.os.Vibrator; android.util.Log;

70

import import import import import import import import import import import import import import import import import

android.view.Menu; android.view.MenuInflater; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; android.widget.Button; android.widget.ImageButton; android.widget.TabHost; android.widget.TabHost.OnTabChangeListener; android.widget.TabHost.TabSpec; android.widget.TextView; android.widget.Toast; com.google.android.maps.GeoPoint; com.google.android.maps.OverlayItem; com.ucampus.dao.BatimentDAO; com.ucampus.dao.CategorieDAO; com.ucampus.model.Batiment;

public class ViewBatiment extends Activity { private ArrayList<String> lesLieux = new ArrayList<String>(); private String numeroTelephone; private String uriString; private TabHost monTabHost; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.viewbatiment); /** Ajout des onglets **/ monTabHost = (TabHost) findViewById(R.id.TabHost01); monTabHost.setup(); /** Ajout des 3 onglets **/ TabSpec spec = monTabHost.newTabSpec("onglet_info"); spec.setIndicator("",getResources().getDrawable(R.drawable.info)); spec.setContent(R.id.general_info); monTabHost.addTab(spec); monTabHost.addTab(monTabHost.newTabSpec("onglet_loc_maps").setIndicat or("",getResources().getDrawable(R.drawable.map)).setContent(R.id.loc_maps) ); monTabHost.addTab(monTabHost.newTabSpec("onglet_autres").setIndicator ("",getResources().getDrawable(R.drawable.plus)).setContent(R.id.autres)); String batName = this.getIntent().getExtras().getString("BatName"); final BatimentDAO bBDD = new BatimentDAO(this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(this); cBDD.open(); final Batiment b = bBDD.getBatimentWithName(batName); //mise jour du texte dans la fiche du batiment TextView tW = (TextView) findViewById(R.id.name); tW.setText(b.getName()); tW = (TextView) findViewById(R.id.numero);

71

tW.setText(b.getNumero()); numeroTelephone = b.getNumero(); tW = (TextView) findViewById(R.id.ouverture); tW.setText(b.getHoraires()); tW = (TextView) findViewById(R.id.adresse); tW.setText(b.getAdresse()); // url du site internet uriString = b.getSiteInternet(); // Mise jour du label du bouton Button boutonSiteInternet = (Button) findViewById(R.id.siteInternet); //Si c'est un restaurant on changre le texte du bouton if (b.getIdCategorie()==1){ boutonSiteInternet.setText("Menu du RU"); }else{ boutonSiteInternet.setText("Site internet"); } cBDD.close(); bBDD.close(); //Action lors du click sur le bouton de localisation d'un btiment ImageButton boutonLocalise = (ImageButton) findViewById(R.id.localise); boutonLocalise.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { //Test si le GPS est activ if (isGPSon()) { //Test si la 3G est active if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); //Ajout de la catgorie de lieu afficher dans les parametres du intent intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); lesLieux.add(b.getName()); //Ajout des lieux afficher dans les parametres du intent intent.putStringArrayListExtra("lieu", lesLieux); cBDD.close(); bBDD.close(); //Vibrateur pour informer du click ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else {

72

createGpsDisabledAlert(); } } }); //Affichage du site du btiment (ou du menu du RU) boutonSiteInternet.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ Log.e("internet","internet"+uriString); Uri intentUri = Uri.parse(uriString); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(intentUri); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } }); //lancement du mode itinraire piton ImageButton boutonItinerairePieton = (ImageButton) findViewById(R.id.itinerairePieton); boutonItinerairePieton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); intent.putExtra("lieuDestination", b.getName()); intent.putExtra("modeDeplacement", "pieton"); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else {

73

createGpsDisabledAlert(); } } }); //lancement du mode itinraire voiture ImageButton boutonItineraireVoiture = (ImageButton) findViewById(R.id.itineraireVoiture); boutonItineraireVoiture.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); intent.putExtra("categorieDeLieux", cBDD.getCategorieById(b.getIdCategorie()) .getNameCategorie()); intent.putExtra("lieuDestination", b.getName()); intent.putExtra("modeDeplacement", "voiture"); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } } else { createGpsDisabledAlert(); } } }); //lancement du mode navigation piton ImageButton boutonNavigationPieton = (ImageButton) findViewById(R.id.navigationPieton); boutonNavigationPieton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open();

74

final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); GeoPoint point = new GeoPoint( Integer.parseInt(b.getLatitude()), Integer.parseInt(b .getLongitude())); OverlayItem overlayitem = new OverlayItem(point, cBDD .getCategorieById(b.getIdCategorie()) .getNameCategorie(), null); Intent i = new Intent(Intent.ACTION_VIEW, Uri .parse("google.navigation:q=" + overlayitem.routableAddress() + "&mode=w")); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(i); } } else { createGpsDisabledAlert(); } } }); //lancement du mode navigation voiture ImageButton boutonNavigationVoiture = (ImageButton) findViewById(R.id.navigationVoiture); boutonNavigationVoiture.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { if (isGPSon()) { if ( ! is3GorWIFIon()) { create3GWifiDisabledAlert(); }else{ final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); GeoPoint point = new GeoPoint( Integer.parseInt(b.getLatitude()), Integer.parseInt(b .getLongitude())); OverlayItem overlayitem = new OverlayItem(point, cBDD .getCategorieById(b.getIdCategorie()) .getNameCategorie(), null);

75

Intent i = new Intent(Intent.ACTION_VIEW, Uri .parse("google.navigation:q=" + overlayitem.routableAddress())); cBDD.close(); bBDD.close(); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(i); } } else { createGpsDisabledAlert(); } } }); //action pour tlphoner au btiment ImageButton boutonTelephoner = (ImageButton) findViewById(R.id.boutonTelephoner); boutonTelephoner.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); final BatimentDAO bBDD = new BatimentDAO(ViewBatiment.this); bBDD.open(); final CategorieDAO cBDD = new CategorieDAO(ViewBatiment.this); cBDD.open(); startActivityForResult( new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + numeroTelephone)), 1); cBDD.close(); bBDD.close(); } }); } // Test si le GPS est activ private Boolean isGPSon() { LocationManager locManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { return false; } else { return true; } } // On informe l'utilisateur qu'il doit activer sa 3G ou son Wifi private void createGpsDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Votre GPS est dsactiv! Souhaitez-vous l'activer?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() {

76

public void onClick(DialogInterface dialog, int id) { Intent gpsOptionsIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(gpsOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } // Test si l'acces internet (WIFI ou 3G) est activ private Boolean is3GorWIFIon() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null) { WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (!wifi.isWifiEnabled()) { return false; } else { return true; } } else { return true; } } // On propose l'utilisateur d'activer son gps private void create3GWifiDisabledAlert() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( "Veuillez activer votre 3G (manuellement) ou votre WIFI! Souhaitez-vous activer WIFI?") .setCancelable(false) .setPositiveButton("Oui", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent connectingOptionsIntent = new Intent( android.provider.Settings.ACTION_WIFI_SETTINGS); startActivity(connectingOptionsIntent); } }); builder.setNegativeButton("Non", new DialogInterface.OnClickListener() {

77

public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } //Gestion du menu public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menulistecategorie, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); switch (item.getItemId()) { case R.id.menuAccueil: Intent intent2 = new Intent(ViewBatiment.this, Home.class); startActivity(intent2); this.finish(); break; case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuLocalisation: Intent intent = new Intent(ViewBatiment.this, Geolocalisation.class); startActivity(intent); this.finish(); break; case R.id.menuReglages: Intent intent3 = new Intent(ViewBatiment.this, Reglages.class); startActivity(intent3); this.finish(); break; } return true; } }

5.5 GEOLOCALISATION.JAVA : GEOLOCALISATION VIA GOOGLE MAPS


package com.ucampus; import import import import import import import import java.io.IOException; java.net.HttpURLConnection; java.net.MalformedURLException; java.net.URL; java.util.ArrayList; java.util.List; java.util.Timer; java.util.TimerTask;

78

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import com.ucampus.MyItemizedOverlay; import org.w3c.dom.Document; import org.xml.sax.SAXException; import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import import android.app.AlertDialog; android.app.Dialog; android.app.ProgressDialog; android.content.Context; android.content.DialogInterface; android.content.Intent; android.graphics.Color; android.graphics.drawable.Drawable; android.location.Location; android.location.LocationListener; android.location.LocationManager; android.net.ConnectivityManager; android.net.NetworkInfo; android.net.Uri; android.net.wifi.WifiManager; android.os.Bundle; android.os.Vibrator; android.text.Editable; android.text.TextWatcher; android.util.Log; android.widget.ArrayAdapter; android.widget.AutoCompleteTextView; android.widget.Button; android.widget.ImageButton; android.widget.RadioButton; android.widget.Toast; android.view.Menu; android.view.MenuInflater; android.view.MenuItem; android.view.View; android.view.View.OnClickListener; com.google.android.maps.GeoPoint; com.google.android.maps.MapActivity; com.google.android.maps.MapController; com.google.android.maps.MapView; com.google.android.maps.Overlay; com.google.android.maps.OverlayItem; com.ucampus.R; com.ucampus.dao.BatimentDAO; com.ucampus.dao.CategorieDAO; com.ucampus.model.Batiment; com.ucampus.model.Categorie;

public class Geolocalisation extends MapActivity { private MapController mapController; private MapView mapView; private LocationManager locationManager;

79

private private private private private private private private private private private private private private private private

MyItemizedOverlay myItemizedoverlay; MyItemizedOverlay itemizedoverlayMetro; MyItemizedOverlay itemizedoverlayRestaurant; MyItemizedOverlay itemizedoverlaySante; MyItemizedOverlay itemizedoverlaySport; Drawable iconMoi; Drawable metro; Drawable restaurants; Drawable sante; Drawable sport; List<Overlay> mapOverlays; Button lieux; Button reinitialiser; Button localiseMoi; Button itineraire; GeoPoint myPosition=null;

private static String[] batiments ; private OverlayItem myOverlayItem; private static int EARTH_RADIUS_KM = 6371; public static int MILLION = 1000000; private ProgressDialog myProgressDialog; public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.geolocalisation); mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); // Autoriser StreetView mapView.setStreetView(true); // Reprsenter le traffic mapView.setTraffic(true); mapController = mapView.getController(); mapController.setZoom(16); // Icnes de chaque catgorie iconMoi = this.getResources().getDrawable(R.drawable.pegman); metro = this.getResources().getDrawable(R.drawable.metro); restaurants= this.getResources().getDrawable(R.drawable.cook); sante= this.getResources().getDrawable(R.drawable.health); sport = this.getResources().getDrawable(R.drawable.sports); // Liste des btiments que l'utilisateur souhaite afficher myItemizedoverlay= new MyItemizedOverlay(iconMoi,mapView); itemizedoverlayMetro= new MyItemizedOverlay(metro,mapView); itemizedoverlayRestaurant= new MyItemizedOverlay(restaurants,mapView); itemizedoverlaySante = new MyItemizedOverlay(sante,mapView); itemizedoverlaySport = new MyItemizedOverlay(sport,mapView); // On recuperer tous les btiments de la BDD pour l'autocompression dans la popUp d'itineraire et de navigation final BatimentDAO bBDD1 = new BatimentDAO(this); bBDD1.open(); ArrayList<Batiment> allB = bBDD1.getAllBatiment(); final ArrayList<String> allBName = new ArrayList<String>(); for (Batiment b : allB) { allBName.add(b.getName()); }

80

batiments = new String[allBName.size()]; allBName.toArray(batiments); bBDD1.close(); locateMe(); initButton(); // Afficher les lieux choisis try{ addPoint(this.getIntent().getExtras().getString("categorieDeLieux"),t his.getIntent().getStringArrayListExtra("lieu")); }catch (NullPointerException ex){ } // itineraire try{ String destination = this.getIntent().getExtras().getString("lieuDestination"); String categorieDeLieux = this.getIntent().getExtras().getString("categorieDeLieux"); String modeDeplacement = this.getIntent().getExtras().getString("modeDeplacement"); final BatimentDAO bBDD = new BatimentDAO(this); bBDD.open(); Batiment b = bBDD.getBatimentWithName(destination); GeoPoint point = new GeoPoint(Integer.parseInt(b.getLatitude()),Integer.parseInt(b.getLongitude( ))); bBDD.close(); add1Point(categorieDeLieux,destination); //Trace le trait DrawPath(myPosition,point,Color.BLUE,mapView,modeDeplacement); }catch (NullPointerException ex){ } } // Initialisation des buttons private void initButton() { // Afficher la catgorie des lieux this.lieux = (Button)this.findViewById(R.id.lieux); this.lieux.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { Intent intent = new Intent(Geolocalisation.this, CatList.class); ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); startActivity(intent); } }); // Afficher la popup d'itineraire ou de navigation this.itineraire = (Button)this.findViewById(R.id.itineraire); this.itineraire.setOnClickListener(new OnClickListener() {

81

public void onClick(View arg0) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); createPopUpItineraire(); } }); //Me localiser : centrer la carte sur ma position this.localiseMoi = (Button)this.findViewById(R.id.localiseMoi); this.localiseMoi.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); if (myPosition != null){ Toast.makeText(Geolocalisation.this, "Ma position", Toast.LENGTH_SHORT).show(); locateMe(); } } }); //Rinitialiser la carte this.reinitialiser = (Button)this.findViewById(R.id.reinitialiser); this.reinitialiser.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(100); deleteAllPoints(); } }); } // Creer la popup pour l'itineraire ou la naviagation public void createPopUpItineraire() { Context mContext = Geolocalisation.this; final Dialog dialog = new Dialog(mContext); dialog.setContentView(R.layout.itineraire); dialog.setTitle("Dtermination de l'itinraire"); //Auto compression sur les btiments AutoCompleteTextView textView = (AutoCompleteTextView) dialog.findViewById(R.id.autocomplete_country); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, batiments); textView.setAdapter(adapter); Button annuler = (Button) dialog.findViewById(R.id.ButtonAnnuler); annuler.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { dialog.cancel(); }

82

}); //Rcupration des informations pour la navigation mode destination Button navigation = (Button)dialog.findViewById(R.id.ButtonNavigation); navigation.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { RadioButton radioButtonPieton, radioButtonVoiture; radioButtonPieton = (RadioButton)dialog.findViewById(R.id.RadioButtonPieton); radioButtonVoiture = (RadioButton)dialog.findViewById(R.id.RadioButtonVoiture); Editable destination =((AutoCompleteTextView) dialog.findViewById(R.id.autocomplete_country)).getText(); if ((destination == null) ||(destination.length() == 0)){ Toast.makeText(Geolocalisation.this, "Veuillez renseigner la destination!", Toast.LENGTH_LONG).show(); }else{ final BatimentDAO bBDD = new BatimentDAO(Geolocalisation.this); bBDD.open(); Batiment b = bBDD.getBatimentWithName(destination.toString()); if (b != null){ dialog.cancel(); //Lancer Google Navigation (GPS) if(radioButtonPieton.isChecked()){ navigation("pieton",destination); }else{ navigation("voiture",destination); } }else{ destination.clear(); Toast.makeText(Geolocalisation.this, "Destination inconnue! Veuillez slectionner votre destination dans la liste des lieux proposs.", Toast.LENGTH_LONG).show(); } } } }); //Manque : effacer les anciens itineraires! // Afficher itineraire sur la carte via un trait bleu Button itineraireMaps = (Button)dialog.findViewById(R.id.ButtonItineraire); itineraireMaps.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { //Mode de dplacement RadioButton radioButtonPieton, radioButtonVoiture; radioButtonPieton = (RadioButton)dialog.findViewById(R.id.RadioButtonPieton);

83

radioButtonVoiture = (RadioButton)dialog.findViewById(R.id.RadioButtonVoiture); Editable destination =((AutoCompleteTextView) dialog.findViewById(R.id.autocomplete_country)).getText(); if ((destination == null) ||(destination.length() == 0)){ Toast.makeText(Geolocalisation.this, "Veuillez renseigner la destination!", Toast.LENGTH_LONG).show(); }else{ final BatimentDAO bBDD = new BatimentDAO(Geolocalisation.this); bBDD.open(); if (bBDD.getBatimentWithName(destination.toString()) != null){ dialog.cancel(); try{ myProgressDialog = ProgressDialog.show(Geolocalisation.this,"Calcul de l'itinraire en cours...", "Recherche du parcours le plus rapide...", true); Batiment b = bBDD.getBatimentWithName(destination.toString()); GeoPoint point = new GeoPoint(Integer.parseInt(b.getLatitude()),Integer.parseInt(b.getLongitude( ))); bBDD.close(); CategorieDAO cBDD = new CategorieDAO(Geolocalisation.this); cBDD.open(); Categorie categorie = cBDD.getCategorieById(b.getIdCategorie()); cBDD.close(); //Ajout du btiment de destination sur la carte add1Point(categorie.getNameCategorie(),destination.toString()); if(radioButtonVoiture.isChecked()){ DrawPath(myPosition,point,Color.BLUE,mapView,"voiture"); }else{ DrawPath(myPosition,point,Color.BLUE,mapView,"pieton"); } } catch (Exception e) { } // Dismiss the Dialog myProgressDialog.dismiss(); }else{ bBDD.close(); destination.clear(); Toast.makeText(Geolocalisation.this, "Destination inconnue! Veuillez slectionner votre destination dans la liste des lieux proposs.", Toast.LENGTH_LONG).show(); } } } }); dialog.show(); }

84

// Lance google navigation (GPS) avec l'adresse de destination et le mode de dplacement public void navigation(String mode, Editable destination) { Intent i; final BatimentDAO bBDD = new BatimentDAO(Geolocalisation.this); bBDD.open(); Batiment b = bBDD.getBatimentWithName(destination.toString()); GeoPoint point = new GeoPoint(Integer.parseInt(b.getLatitude()),Integer.parseInt(b.getLongitude( ))); bBDD.close(); CategorieDAO cBDD = new CategorieDAO(Geolocalisation.this); cBDD.open(); Categorie categorie = cBDD.getCategorieById(b.getIdCategorie()); cBDD.close(); OverlayItem overlayitem = new OverlayItem(point, categorie.getNameCategorie(),null); if(mode=="pieton"){ i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + overlayitem.routableAddress()+"&mode=w")); }else{ i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + overlayitem.routableAddress())); } startActivity(i); } // Creation du menu public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menugeolocalisation, menu); return true; } //Appeler lors d'un click sur le menu public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menuPlus: Toast.makeText(this, "En construction", Toast.LENGTH_LONG).show(); break; case R.id.menuLieux: Intent intent = new Intent(Geolocalisation.this, CatList.class); startActivity(intent); break; case R.id.menuItineraire: createPopUpItineraire(); break; case R.id.menuReinitialiser: deleteAllPoints(); break; case R.id.menuReglages: Intent intent2 = new Intent(Geolocalisation.this, Reglages.class); startActivity(intent2); break; }

85

return true; } // Localise moi : On enregistre ma position dans le GeoPoint myPosition on met un listener sur le locationManager pour que lorsqu'on bouge de au minimun 2 m // on met jour myPosition [onLocationChanged(Location location)] private void locateMe() { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, new GeoUpdateHandler()); mapOverlays = mapView.getOverlays(); if (locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) != null){ int lat = (int) (locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLati tude() * 1E6); int lng = (int) (locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLong itude() * 1E6); myPosition = new GeoPoint(lat, lng); myOverlayItem = new OverlayItem(myPosition, "Moi",null); myItemizedoverlay.addOverlay(myOverlayItem); mapOverlays.add(myItemizedoverlay); mapController.animateTo(myPosition); } } // Dessine un trait entre 2 points private void DrawPath(GeoPoint src,GeoPoint dest, int color, MapView mMapView01, String modeDeDeplacement) { // connect to map web service StringBuilder urlString = new StringBuilder(); if(modeDeDeplacement.equals("pieton")){ urlString.append("http://maps.google.com/maps?f=d&hl=fr&via=1&dirflg= w"); }else{ urlString.append("http://maps.google.com/maps?f=d&hl=fr&"); } // urlString.append("http://maps.google.com/maps?f=d&hl=fr&"); urlString.append("&saddr=");//from urlString.append( Double.toString((double)src.getLatitudeE6()/1.0E6 )); urlString.append(","); urlString.append( Double.toString((double)src.getLongitudeE6()/1.0E6 ));

86

urlString.append("&daddr=");//to urlString.append( Double.toString((double)dest.getLatitudeE6()/1.0E6 )); urlString.append(","); urlString.append( Double.toString((double)dest.getLongitudeE6()/1.0E6 )); urlString.append("&ie=UTF8&0&om=0&output=kml"); // get the kml (XML) doc. And parse it to get the coordinates(direction route). Document doc = null; HttpURLConnection urlConnection= null; URL url = null; try { url = new URL(urlString.toString()); urlConnection=(HttpURLConnection)url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.connect(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(urlConnection.getInputStream()); if(doc.getElementsByTagName("GeometryCollection").getLength()>0) { //String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getF irstChild().getNodeName(); String path = doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getF irstChild().getFirstChild().getNodeValue() ; String [] pairs = path.split(" "); String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude lngLat[1]=latitude lngLat[2]=height // src GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble( lngLat[0])*1E6)); // mMapView01.getOverlays().add(new MyOverLay(startGP,startGP,1)); GeoPoint gp1; GeoPoint gp2 = startGP; for(int i=1;i<pairs.length;i++) // the last one would be crash { lngLat = pairs[i].split(","); gp1 = gp2; // watch out! For GeoPoint, first:latitude, second:longitude gp2 = new GeoPoint((int)(Double.parseDouble(lngLat[1])*1E6),(int)(Double.parseDouble( lngLat[0])*1E6)); mMapView01.getOverlays().add(new MyOverLay(gp1,gp2,2,color));

87

} // mMapView01.getOverlays().add(new MyOverLay(dest,dest, 3)); // use the default color distanceKm(myPosition, dest); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } } /** * Computes the distance in kilometers between two points on Earth. * * @param lat1 Latitude of the first point * @param lon1 Longitude of the first point * @param lat2 Latitude of the second point * @param lon2 Longitude of the second point * @return Distance between the two points in kilometers. */ public static double distanceKm(double lat1, double lon1, double lat2, double lon2) { double lat1Rad = Math.toRadians(lat1); double lat2Rad = Math.toRadians(lat2); double deltaLonRad = Math.toRadians(lon2 - lon1); return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM; } /** * Computes the distance in kilometers between two points on Earth. * * @param p1 First point * @param p2 Second point * @return Distance between the two points in kilometers. */ public void distanceKm(GeoPoint p1, GeoPoint p2) { double lat1 = p1.getLatitudeE6() / (double)MILLION; double lon1 = p1.getLongitudeE6() / (double)MILLION; double lat2 = p2.getLatitudeE6() / (double)MILLION; double lon2 = p2.getLongitudeE6() / (double)MILLION;

88

double distanceTotale = distanceKm(lat1, lon1, lat2, lon2); String distanceTotaleString= (distanceTotale+"").substring(0, 4); Toast.makeText(this, "Distance : " + distanceTotaleString + " km.", Toast.LENGTH_SHORT).show(); } // Rinitialisation des objetcs contenant les btiments public void deleteAllPoints() { mapOverlays.remove(itemizedoverlayMetro); mapOverlays.remove(itemizedoverlayRestaurant); mapOverlays.remove(itemizedoverlaySante); mapOverlays.remove(itemizedoverlaySport); itemizedoverlayMetro.removeOverlayAll(); itemizedoverlayRestaurant.removeOverlayAll(); itemizedoverlaySante.removeOverlayAll(); itemizedoverlaySport.removeOverlayAll(); super.finish(); Intent intent = new Intent(Geolocalisation.this,Geolocalisation.class); startActivity(intent); } // Ajout des btiments afficher dans la liste public void addPoint(String lieuxAafficher,ArrayList<String> lesLieux) { // On recupere tous les lieux pour les afficher mapOverlays = mapView.getOverlays(); OverlayItem overlayitem ; GeoPoint point = null ; final BatimentDAO batBDD = new BatimentDAO(this); batBDD.open(); for (String lieu : lesLieux) { Batiment b = batBDD.getBatimentWithName(lieu); point = new GeoPoint(Integer.parseInt(b.getLatitude()),Integer.parseInt(b.getLongitude( ))); if(lieuxAafficher.equals("metros")){ overlayitem = new OverlayItem(point, "Mtro",lieu); itemizedoverlayMetro.addOverlay(overlayitem); }else if(lieuxAafficher.equals("Restaurants")){ overlayitem = new OverlayItem(point, "Restaurant",lieu); itemizedoverlayRestaurant.addOverlay(overlayitem); }else if (lieuxAafficher.equals("Sant")){ overlayitem = new OverlayItem(point, "Sant",lieu); itemizedoverlaySante.addOverlay(overlayitem); }else if (lieuxAafficher.equals("Salle de sport")){ overlayitem = new OverlayItem(point, "Salle de sport",lieu); itemizedoverlaySport.addOverlay(overlayitem); } } batBDD.close(); if(lieuxAafficher.equals("metros")){ mapOverlays.add(itemizedoverlayMetro);

89

}else if(lieuxAafficher.equals("Restaurants")){ mapOverlays.add(itemizedoverlayRestaurant); }else if(lieuxAafficher.equals("Sant")){ mapOverlays.add(itemizedoverlaySante); }else if(lieuxAafficher.equals("Salle de sport")){ mapOverlays.add(itemizedoverlaySport); } if (point != null){ mapController.animateTo(point); } } // Ajouter le lieu de la destination de l'itineraire public void add1Point(String lieuxAafficher,String leLieu) { // On recupere le lieu pour l'afficher mapOverlays = mapView.getOverlays(); OverlayItem overlayitem ; final BatimentDAO bBDD = new BatimentDAO(this); bBDD.open(); Batiment b = bBDD.getBatimentWithName(leLieu); GeoPoint point = new GeoPoint(Integer.parseInt(b.getLatitude()),Integer.parseInt(b.getLongitude( ))); //Ajout du batiment de destination dans la bonne liste if(lieuxAafficher.equals("metros")){ overlayitem = new OverlayItem(point, "Mtro",leLieu); itemizedoverlayMetro.addOverlay(overlayitem); }else if(lieuxAafficher.equals("Restaurants")){ overlayitem = new OverlayItem(point, "Restaurant",leLieu); itemizedoverlayRestaurant.addOverlay(overlayitem); }else if(lieuxAafficher.equals("Sant")){ overlayitem = new OverlayItem(point, "Sant",leLieu); itemizedoverlaySante.addOverlay(overlayitem); }else if (lieuxAafficher.equals("Salle de sport")){ overlayitem = new OverlayItem(point, "Salle de sport",leLieu); itemizedoverlaySport.addOverlay(overlayitem); } if(lieuxAafficher.equals("metros")){ mapOverlays.add(itemizedoverlayMetro); }else if(lieuxAafficher.equals("Restaurants")){ mapOverlays.add(itemizedoverlayRestaurant); }else if(lieuxAafficher.equals("Sant")){ mapOverlays.add(itemizedoverlaySante); }else if(lieuxAafficher.equals("Salle de sport")){ mapOverlays.add(itemizedoverlaySport); } bBDD.close(); //Centrer la carte sur le btiment de destination mapController.animateTo(myPosition); } @Override protected boolean isRouteDisplayed() { return false; } // Classe interne qui permet de mettre jour sa position quand les coordones GPS changent

90

public class GeoUpdateHandler implements LocationListener { // Mise jour de myPosition public void onLocationChanged(Location location) { mapOverlays = mapView.getOverlays(); if (myPosition != null) { myItemizedoverlay.removeOverlay(myOverlayItem); mapOverlays.remove(myItemizedoverlay); } int lat = (int) (location.getLatitude() * 1E6); int lng = (int) (location.getLongitude() * 1E6); myPosition = new GeoPoint(lat, lng); myOverlayItem = new OverlayItem(myPosition, "Moi",null); myItemizedoverlay.addOverlay(myOverlayItem); mapOverlays.add(myItemizedoverlay); // mapController.animateTo(myPosition); mapController.setCenter(point); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } }

5.6 MYITEMIZEDOVERLAY.JAVA : CONTIENT LES OVERLAY DUNE CATEGORIE


package com.ucampus; import java.util.ArrayList; import android.content.Context; import android.graphics.drawable.Drawable; import android.widget.Toast; import com.google.android.maps.MapView; import com.google.android.maps.OverlayItem; import com.ucampus.BalloonItemizedOverlay; // Liste des OverlayItem d'une categorie // 1 catgorie = 1 MyItemizedOverlay donc = 1 liste d'OverlayItem public class MyItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> m_overlays = new ArrayList<OverlayItem>(); private Context c; public MyItemizedOverlay(Drawable defaultMarker, MapView mapView) { super(boundCenter(defaultMarker), mapView); c = mapView.getContext();

91

//

} add OverlayItems to the ArrayList public void addOverlay(OverlayItem overlay) { m_overlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { return m_overlays.get(i); }

//

remove OverlayItems to the ArrayList public void removeOverlay(OverlayItem overlay) { m_overlays.remove(overlay); populate(); } remove all OverlayItems to the ArrayList public void removeOverlayAll() { m_overlays.clear(); populate(); } @Override public int size() { return m_overlays.size(); } @Override protected boolean onBalloonTap(int index) { Toast.makeText(c, "onBalloonTap for overlay index " + index, Toast.LENGTH_LONG).show(); return true; }

//

// //

5.7 BALLOONITEMIZEDOVERLAY.JAVA : APPARAIT LORS DUN CLICK SUR UN BATIMENT

package com.ucampus; import java.lang.reflect.Method; import java.util.List; import import import import import import import import import import import android.graphics.drawable.Drawable; android.util.Log; android.view.MotionEvent; android.view.View; android.view.View.OnTouchListener; android.view.ViewGroup.LayoutParams; com.google.android.maps.GeoPoint; com.google.android.maps.ItemizedOverlay; com.google.android.maps.MapController; com.google.android.maps.MapView; com.google.android.maps.Overlay;

92

import com.google.android.maps.OverlayItem; public abstract class BalloonItemizedOverlay<Item> extends ItemizedOverlay<OverlayItem> { private MapView mapView; private BalloonOverlayView balloonView; private View clickRegion; private int viewOffset; final MapController mc; /** * Create a new BalloonItemizedOverlay * * @param defaultMarker - A bounded Drawable to be drawn on the map for each item in the overlay. * @param mapView - The view upon which the overlay items are to be drawn. */ public BalloonItemizedOverlay(Drawable defaultMarker, MapView mapView) { super(defaultMarker); this.mapView = mapView; viewOffset = 0; mc = mapView.getController(); } /** * Set the horizontal distance between the marker and the bottom of the information * balloon. The default is 0 which works well for center bounded markers. If your * marker is center-bottom bounded, call this before adding overlay items to ensure * the balloon hovers exactly above the marker. * * @param pixels - The padding between the center point and the bottom of the * information balloon. */ public void setBalloonBottomOffset(int pixels) { viewOffset = pixels; } /** * Override this method to handle a "tap" on a balloon. By default, does nothing * and returns false. * * @param index - The index of the item whose balloon is tapped. * @return true if you handled the tap, otherwise false. */ protected boolean onBalloonTap(int index) { return false; } /* (non-Javadoc) * @see com.google.android.maps.ItemizedOverlay#onTap(int) */

93

@Override protected final boolean onTap(int index) { boolean isRecycled; final int thisIndex; GeoPoint point; thisIndex = index; point = createItem(index).getPoint(); if (balloonView == null) { balloonView = new BalloonOverlayView(mapView.getContext(), viewOffset); clickRegion = (View) balloonView.findViewById(R.id.balloon_inner_layout); isRecycled = false; } else { isRecycled = true; } balloonView.setVisibility(View.GONE); List<Overlay> mapOverlays = mapView.getOverlays(); if (mapOverlays.size() > 1) { hideOtherBalloons(mapOverlays); } balloonView.setData(createItem(index)); MapView.LayoutParams params = new MapView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, point, MapView.LayoutParams.BOTTOM_CENTER); params.mode = MapView.LayoutParams.MODE_MAP; setBalloonTouchListener(thisIndex); balloonView.setVisibility(View.VISIBLE); if (isRecycled) { balloonView.setLayoutParams(params); } else { mapView.addView(balloonView, params); } mc.animateTo(point); return true; } /** * Sets the visibility of this overlay's balloon view to GONE. */ private void hideBalloon() { if (balloonView != null) { balloonView.setVisibility(View.GONE); } } /**

94

* Hides the balloon view for any other BalloonItemizedOverlay instances * that might be present on the MapView. * * @param overlays - list of overlays (including this) on the MapView. */ private void hideOtherBalloons(List<Overlay> overlays) { for (Overlay overlay : overlays) { if (overlay instanceof BalloonItemizedOverlay<?> && overlay != this) { ((BalloonItemizedOverlay<?>) overlay).hideBalloon(); } } } /** * Sets the onTouchListener for the balloon being displayed, calling the * overridden onBalloonTap if implemented. * * @param thisIndex - The index of the item whose balloon is tapped. */ private void setBalloonTouchListener(final int thisIndex) { try { @SuppressWarnings("unused") Method m = this.getClass().getDeclaredMethod("onBalloonTap", int.class); clickRegion.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { View l = ((View) v.getParent()).findViewById(R.id.balloon_main_layout); Drawable d = l.getBackground(); if (event.getAction() == MotionEvent.ACTION_DOWN) { int[] states = {android.R.attr.state_pressed}; if (d.setState(states)) { d.invalidateSelf(); } return true; } else if (event.getAction() == MotionEvent.ACTION_UP) { int newStates[] = {}; if (d.setState(newStates)) { d.invalidateSelf(); } // call overridden method onBalloonTap(thisIndex); return true; } else { return false; } }

95

}); } catch (SecurityException e) { Log.e("BalloonItemizedOverlay", "setBalloonTouchListener reflection SecurityException"); return; } catch (NoSuchMethodException e) { // method not overridden - do nothing return; } } }

5.8 BALLOONOVERLAYVIEW.JAVA : REPRESENTE LE MARKER LORS DUN CLICK SUR UN BATIMENT


package com.ucampus; import import import import import import import import import import import android.app.ListActivity; android.content.Context; android.content.Intent; android.view.Gravity; android.view.LayoutInflater; android.view.View; android.widget.FrameLayout; android.widget.ImageView; android.widget.LinearLayout; android.widget.TextView; android.widget.Toast;

import com.google.android.maps.OverlayItem; /** * A view representing a MapView marker information balloon. * */ public class BalloonOverlayView extends FrameLayout { private LinearLayout layout; private TextView title; private TextView snippet; private TextView detail; private Context c; /** * Create a new BalloonOverlayView. * * @param context - The activity context. * @param balloonBottomOffset - The bottom padding (in pixels) to be applied * when rendering this view. */ public BalloonOverlayView(Context context, int balloonBottomOffset) { super(context); c= context; setPadding(10, 0, 10, balloonBottomOffset); layout = new LinearLayout(context); layout.setVisibility(VISIBLE);

96

LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.balloon_overlay, layout); title = (TextView) v.findViewById(R.id.balloon_item_title); snippet = (TextView) v.findViewById(R.id.balloon_item_snippet); ImageView close = (ImageView) v.findViewById(R.id.close_img_button); close.setOnClickListener(new OnClickListener() { public void onClick(View v) { layout.setVisibility(GONE); } }); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.NO_GRAVITY; addView(layout, params); } /** * Sets the view data from a given overlay item. * * @param item - The overlay item containing the relevant view data * (title and snippet). */ public void setData(final OverlayItem item) { layout.setVisibility(VISIBLE); if (item.getTitle() != null) { title.setVisibility(VISIBLE); title.setText(item.getTitle()); } else { title.setVisibility(GONE); } if (item.getSnippet() != null) { snippet.setVisibility(VISIBLE); if (title.getText().equals("Moi")){ snippet.setText(item.getSnippet()); }else{ snippet.setText(item.getSnippet()+ " "+ ">> Plus de dtails"); snippet.setOnClickListener(new OnClickListener() { public void onClick(View v) { //Ouvre la fiche dtaille Intent intent = new Intent(c, ViewBatiment.class); intent.putExtra("BatName", item.getSnippet()); c.startActivity(intent); } }); } } else { snippet.setVisibility(GONE); }

97

} }

5.9 MYOVERLAY.JAVA : REPRESENTE UNE SUPERPOSITION SUR LA CARTE


package com.ucampus; import import import import import import import import import import import android.graphics.Bitmap; android.graphics.Canvas; android.graphics.Color; android.graphics.Paint; android.graphics.Point; android.graphics.RectF; android.util.Log; com.google.android.maps.GeoPoint; com.google.android.maps.MapView; com.google.android.maps.Overlay; com.google.android.maps.Projection;

// Base class representing an overlay which may be displayed on top of a map. public class MyOverLay extends Overlay { private GeoPoint gp1; private GeoPoint gp2; private int mRadius=6; private int mode=0; private int defaultColor; private String text=""; private Bitmap img = null; public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E) { this.gp1 = gp1; this.gp2 = gp2; this.mode = mode; defaultColor = 999; // no defaultColor } public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor) { this.gp1 = gp1; this.gp2 = gp2; this.mode = mode; this.defaultColor = defaultColor; } public void setText(String t) { this.text = t; } public void setBitmap(Bitmap bitmap) {

98

this.img = bitmap; } public int getMode() { return mode; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { Projection projection = mapView.getProjection(); if (shadow == false) { Paint paint = new Paint(); paint.setAntiAlias(true); Point point = new Point(); projection.toPixels(gp1, point); // mode=1&#65306;start if(mode==1) { if(defaultColor==999) paint.setColor(Color.BLUE); else paint.setColor(defaultColor); RectF oval=new RectF(point.x - mRadius, point.y - mRadius, point.x + mRadius, point.y + mRadius); // start point canvas.drawOval(oval, paint); } // mode=2&#65306;path else if(mode==2) { if(defaultColor==999){ paint.setColor(Color.RED); }else{ paint.setColor(defaultColor); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(5); paint.setAlpha(120); canvas.drawLine(point.x, point.y, point2.x,point2.y, paint); } } /* mode=3&#65306;end */ else if(mode==3) { /* the last path */ if(defaultColor==999){ paint.setColor(Color.GREEN); }else{ paint.setColor(defaultColor); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(5); paint.setAlpha(120);

99

canvas.drawLine(point.x, point.y, point2.x,point2.y, paint); RectF oval=new RectF(point2.x - mRadius,point2.y mRadius, point2.x + mRadius,point2.y + mRadius); /* end point */ paint.setAlpha(255); canvas.drawOval(oval, paint); } } } return super.draw(canvas, mapView, shadow, when); } }

100

6. TUTORIAL
6.1 CREER UNE CATEGORIE DE BATIMENT
Procdure suivre lors de lajout dune catgorie dans la base de donnes: (En rouge ce quil faut ajouter):

1. Creer la catgorie dans la classe InsertBDD.java

if (cBDD.getAllCategories() == null) { Categorie cat; ... cat = new Categorie("Salle de sport","sports"); cBDD.insertCategorie(cat); cat = new Catgorie (NOM CATEGORIE, NOM ICONE); cBDD.insertCategorie(cat); } Il faut ajouter licne renseign lors de la cration dans les rpertoires res \drawable-hdpi , res\drawable-ldpi et res\drawable-mdpi 2. Affecter des btiments cette catgorie

if (bBDD.getAllBatiment()== null) { Batiment b; // Restaurants Universitaire b = new Batiment(1,1,"Le Barrois","03 20 33 61 23","11h15 13h30 ","imgM5","Cit Scientifique","50611027","3144468","http://www.crous-lille.fr/adminsite/restauration_menu_print_w.php?ru=26&midi=1&soir=1&nb_w=2"); bBDD.insertBatiment(b); b = new Batiment(ID_DE LA CATEGORIE,ID DU BATIMENT ,NOM,TELEPHONE,HORAIRES,IMAGE,ADRESSE,LATITUDE GPS,LONGITUDE GPS,SITE INTERNET); bBDD.insertBatiment(b); } 3. Cration des objets dans la classe Golocalisation.java

Dans les variables de la classe, il faut crer un objet Drawable et un objet MyItemizedOverlay .

Dans la mthode onCreate, il faut renseigner les valeurs de ces objets : iconCategorie= this.getResources().getDrawable(R.drawable.ICONE CATEGORIE);

101

myItemizedoverlay= new MyItemizedOverlay(iconCategorie,mapView); Il faut complter les mthodes addPoint et add1Point p ar lajout du MyItemizedOverlay cre : if(lieuxAafficher.equals("metros")){ overlayitem = new OverlayItem(point, "Mtro",lieu); itemizedoverlayMetro.addOverlay(overlayitem); }else if(lieuxAafficher.equals("NOM CATEGORIE")){ overlayitem = new OverlayItem(point, "NOM CATEGORIE",lieu); myItemizedoverlay.addOverlay(overlayitem); } } if(lieuxAafficher.equals("metros")){ mapOverlays.add(itemizedoverlayMetro); }else if(lieuxAafficher.equals("NOM CATEGORIE")){ mapOverlays.add(myItemizedoverlay); } Et pour finir il faut ajouter deux lignes dans la mthode deleteAllPoints() pour supprimer les lieux: mapOverlays.remove(myItemizedoverlay); myItemizedoverlay.removeOverlayAll();

102