Aplicație mobilă pentru “Campus virtual” Coordonator științific: Lect. Dr. Iulian ILIE-NEMEDI Absolvent: Adina-Ioana STAN București 2018 Cuprins:… [308961]

[anonimizat] “Campus virtual”

Coordonator științific:

Lect. Dr. [anonimizat]: [anonimizat]-Ioana STAN

București

2018

Cuprins:

Introducere……………………………………………………………………………………………………………3

Descrierea problemei…………………………………………………………………………………..3

Prezentarea funcțiilor de bază ale unei aplicații tipice pentru problema aleasă……4

Prezentarea unor soluții consacrate existente pe piață………………………………………6

Proiectarea aplicației………………………………………………………………………………………………9

Diagrama cazurilor de utilizare……………………………………………………………………..9

Diagrame de secvență………………………………………………………………………………..10

Diagrame de stare……………………………………………………………………………………..12

Diagrame de activitate……………………………………………………………………………….13

Diagrama de pachete………………………………………………………………………………….14

Diagrama de clase……………………………………………………………………………………..14

Modelul de date al aplicației……………………………………………………………………….16

Securizarea aplicației…………………………………………………………………………………16

Implementarea aplicației……………………………………………………………………………………….20

Prezentarea tehnologiilor utilizate……………………………………………………………….20

Detalii privind algoritmii folosiți…………………………………………………………………28

Concluzii…………………………………………………………………………………………………………….40

Sintetizarea funcțiilor oferite de aplicația implementată…………………………………40

Raportarea la soluțiile consacrate în domeniu……………………………………………….41

Identificarea unor direcții de dezvoltare viitoare a aplicației……………………………41

Bibliografie…………………………………………………………………………………………………………43

Anexe…………………………………………………………………………………………………………………45

Anexa 1: Lista figurilor………………………………………………………………………………45

Anexa 2: Listare de cod sursă……………………………………………………………………..46

Introducere:

1.1 [anonimizat]-[anonimizat]. [anonimizat]-a lungul anilor și au devenit o [anonimizat]. [anonimizat] petrecut în fața unui computer. Acest lucru se datorează faptului că telefoanele mobile nu mai sunt obișnuitele dispozitive pe care le foloseam doar pentru comunicare, ci acum avem acces la internet de mare viteză și la o interfață comunicativă, motiv pentru care folosirea telefonului s-a transformat într-un ansamblu de experiențe inovatoare aflate doar la un click distanță.

Așadar, am ales să dezvolt o aplicație Android intitulată “Campus Virtual”. Principalul motiv pentru alegerea temei a pornit de la idea de a le oferi studenților o modalitate interactivă de a interacționa cu universitatea.

Aplicația este destinată cu precădere studenților din primul an de facultate care vor să descopere cât mai multe informații despre noul mediu și să fie cât mai familiari cu viața unui student. Pe lângă îmbunătățirea experienței studenților deja înscriși la facultate, aplicația îi ajută pe viitorii candidați care sunt interesați de a trimite aplicația, să afle informații despre facultatea dorită, înainte de a se înscrie.

Deseori studenții simt constrângerea timpului, astfel trebuie să își stabilească prioritățile împărțindu-se între familie, studiu și obligațiile din viața de zi cu zi. O dată cu dezoltarea tehnologiei, este mult mai ușor pentru ei să țină pasul cu organizarea activităților. Elevii caută o opțiune mobilă de a-și îndeplini obiectivele, una care completează experiența desktop-ului, iar acest lucru m-a făcut să mă gândesc la dezvoltarea acestui tip de aplicație.

Această aplicație îi va ajuta pe studenți să fie mai organizați, să își gestioneze mai bine timpul și să afle tot ceea ce se petrece în cadrul facultății, de la evenimente, conferințe, până la workshopuri în timp real.

Multe universități din America sau Marea Britanie au ales să dezvolte propria aplicație mobilă pentru a capta atenția studenților și celor ce sunt interesați să aplice la programul respectiv de studii, iar în timp acest lucru s-a extins, ajungând la un număr vast de țări din Europa. Este mult mai facil pentru studenți să fie la curent cu toate update-urile care se petrec în facultate având la dispoziție propriul device.

Luând toate aceste lucruri împreună, aplicațiile mobile din campus au devenit rapid modul preferat al studenților pentru implicarea în învățământul superior, iar adăugarea unui design personalizat aplicației, va crește această tendință.

Elevii îndeplinesc sarcini pe smart-phone, care, în trecut, ar fi necesitat o vizită la biroul de informații pentru a le oferi direcții în campus sau păstrarea unui carnet unde să noteze orarul și toate evenimentele la care vor să participe. Dar, în prezent, utilizarea termenului de “campus virtual” pe care foarte multe universități îl folosesc și l-au implementat, vine în ajutorul studenților de pretutindeni. Existența unei soluții digitale pentru problema prezentată, diminuează timpul petrecut pentru a face toate aceste lucruri la doar câteva minute printr-o apăsare pe buton.

1.2 Prezentarea funcțiilor de bază ale unei aplicații pentru problema aleasă

O aplicație de acest tip trebuie să includă funcționalități practice și informații de care studenții au nevoie și pe care le pot accesa în mod rapid pentru o desfășurare cât mai agreabilă a activității din timpul ciclului de licență cât și în cel de master. Fie că este vorba despre o universitate de stat sau una privată sunt anumite cerințe care necesită implementate pentru ca aplicația să își îndeplinească obiectivele.

Primul contact cu aplicația este cel ce îl va face pe utilizator să decidă dacă o va folosi în continuare și corespunde așteptărilor sale, sau aceasta nu este întocmai lucrul de care el avea nevoie. De accea, o aplicație mobilă are nevoie de un design care să capteze atenția utilizatorului și să îl facă să își mențină dorința de a descoperi toate funcționalitățile acesteia. De asemenea, aplicația trebuie să fie cât mai ușor de folosit, practică, interfața cu utilizatorul trebuind să fie cât mai intuitivă.

Aplicația va conține funcționalități diferite în funcție de statutul ocupat de fiecare utilizator. Dacă cel care își face cont este deja student la universitate și i s-a atribuit o adresă de e-mail instituțională, va putea să folosescă toate facilitățile de care aplicația dispune, însă dacă este vorba despre un viitor student care urmează să se înscrie la universitatea respectivă și caută mai multe detalii, acesta va avea acces restricționat la o parte din funcționalități și va putea vedea doar informații cu privire la facultate, în mod special detalii privind cursurile dar și un feedback oferit de studenții care deja au absolvit.

Aplicația va dispune de o hartă interactivă care îi va ajuta pe studenți să găsească într-un timp util clădirile din cadrul universității, doar printr-un singur click pe locația dorită. O altă funcționalitate a acestei hărți se adresează în special studenților din primul an pentru care acomodarea într-un oraș nou este destul de dificilă. Mai exact, aceștia pot să selecteze din mai multe opțiuni fie restaurante, parcări sau biblioteci și vor fi afișate acele locații care sunt cele mai apropiate de locația lor curentă. De asemenea, fiecare marker de pe hartă va conține detalii despre locul respectiv atunci când utilizatorul îl selectează. Această hartă a fost dezvoltată astfel încât să permită și calcularea distanței între două puncte de interes pentru utilizator, cu afișarea unui traseu optim între cele două markere.

O altă funcționalitate de care dispune aplicația este aceea a existenței unui planificator, unde studenții își pot adauga examenele pentru a se organiza într-un mod eficient pe tot parcursul sesiunii și a păstra într-un singur loc toate detaliile referitoare la data sau ora desfășurării examenului respectiv.

Mai mult, având în vedere că nu doar perioada din timpul sesiunii este cea mai aglomerată, înaintea acesteia, studenții își pot nota toate proiectele, lucrările și taskurile pe care le au pe parcursul semestrului la activitatea de seminar pentru a nu omite informațiile cheie cu privire la acestea.

De asemenea, pot fi vizualizate informații despre programa facultății. Viitorilor studenți li se adresează în mare parte această funcție care conține detalii despre locul unde decid să își continue studiile, secțiile ce se regăsesc în cadrul facultății, informații despre fiecare materie studiată cât și o părere de ansamblu venită ca un feedback din partea celor care au terminat ciclul de licență, ce îi va ajuta pe candidați să analizeze avantajele și dezavantajele aplicării la un anumit profil.

Fiind o facultate pe domeniul IT, au loc numeroase evenimente și workshopuri organizate de companii ce doresc să le prezinte studenților cum sunt aplicate aspectele teoretice învățate pe parcursul acestor ani de studiu într-un mediu concret de pe piața muncii. Studenții trebuie să vizualizeze în timp real când se desfășoară aceste întâlniri, toți trebuie să aibă acces la aceste informații, iar pentru acest lucru, aplicația permite gestionarea activităților din cadrul facultății. Cu alte cuvinte, sunt afișate evenimentele și workshop-urile iar utilizatorii își pot rezerva un loc și de asemenea pot citi detalii despre ceea ce se va prezenta și condițiile de desfășurare. De asemenea, ei pot să țină o evidența a acestor evenimente, având posibilitatea să le salveze la secțiunea “favorite”, pentru o vizualizare ulterioară.

Atât notele din timpul sesiunii cât și notele de pe parcursul semestrului pot fi vizualizate de studenți în cadrul aplicației în secțiunea dedicată acestora. Utilizatorii își pot vizualiza punctajul la fiecare materie, iar dacă profesorul are anumite remarci adresate studentului le poate lăsa la secțiunea de comentarii unde acesta le poate vizualiza pentru o mai bună înțelegere a punctajului.

1.3 Prezentarea unor soluții consacrate existente pe piață

În prezent, multe dintre universitățile cunoscute din lume au văzut drept avantaj dezvoltarea unei aplicații care asigură o mai bună interacțiune cu campusul universitar.

Studenții doresc astăzi să aibe acces imediat, personal, facil, la informațiile de care au nevoie în orice moment – și pe dispozitivele mobile. Cu funcționalitatea și platforma mobilă Oracle pentru PeopleSoft Campus Solutions, instituțiile de învățământ superior pot oferi o experiență și mai bogată studenților, având o bază mai puternică pe care să le-o pună la dispoziție utilizatorilor finali, mai multe informații și funcționalități.

PeopleSoft Campus Solutions este construită pe o fundație tehnologică flexibilă utilizând Oracle Application Development Framework (ADF) Mobile. Oracle ADF Mobile permite, de asemenea, utilizarea funcțiilor de securitate deja integrate în PeopleSoft Campus Solutions, precum și furnizarea de informații prin SMS sau e-mail, cum ar fi notele finale.

Caracteristicile mobile permit studentului să acționeze și să gestioneze procesele cheie printr-o aplicație nativă, sigură. Facilitățile existente oferă studenților posibilitatea de a se înscrie, a adăuga și a renunța la cursuri, de a vizualiza programul cursurilor, accesul la note, primirea de notificări, monitorizarea progresului academic cât și vizualizarea contului financiar, inclusiv plățile recente, taxele datorate și bursele primite.

Toate aceste lucruri contribuie la îndrumarea studenților spre obținerea cu succes a rezultatelor academice spre care aspiră. Ca rezultat, Oracle continuă să investească în Campus Solutions, făcându-l cel mai puternic, mai inovator și mai performant sistem de pe piață.

Un exmplu de aplicație este NorthRidge App de la California State University. Aplicația mobilă CSUN a fost introdusă pentru ca studenții să navigheze mai ușor prin campus. Aceasta oferă studenților numeroase funcții avansate, inclusiv hărti interioare, cu navigație detaliată având, de asemenea, integrat PeopleSoft. În plus, fată de caracteristicile principale ale aplicației campus, aplicația CSUN include un tur ghidat prin campus cu videoclipuri atașate.

Aplicația continuă să evolueze datorită feedback-urilor primite. Aceasta permite în prezent ca studenții să acceseze modulul “Ask Matty” unde pot pune diferite întrebări despre CSUN și primesc răspuns în timp util. De asemenea, studenții pot efectua plăți de taxe către facultate direct din aplicație.

Aplicația mobilă TAMU a universității din Texas este o suită de aplicații mobile care asigură o varietate de informații despre facultate. Aplicația are un modul care permite conectarea user-ului cu oricine deține aplicația din campus. Aceasta are, de asemenea, modulele cursurilor care ajută studenții să caute și să își planifice orarul într-un mod optim.

Mai mult, aplicația ghidează studenții în ceea ce privește rutele de transport folosind tehnologia GPS pentru o navigare mai facilă prin campus. O hartă interactivă a campusului ajută studenții să ajungă acolo unde au nevoie, cu indicatori pentru clădiri și locații cheie în și în jurul campusului. Calendarele pentru evenimente ușurează găsirea de la concerte la oportunități de voluntariat sau termene de înregistrare pentru anumite cursuri. Feed-urile social media păstrează studenții conectați, trimițându-le notificări în timp real.

iLancaster este o aplicație mobilă gratuită care oferă servicii, resurse și informații despre universitatea din Lancaster, Marea Britanie. Aceasta se adresează studenților care deja frecventează cursurile universității, celor care aplică pentru un viitor program, vizitatorilor care vor să se acomodeze cu orașul, dar și rezidenților, care pot accesa fie evenimentele din oraș, fie harta interactivă. Pentru viitorii studenți, cei care au dezvoltat aplicația au planificat ca aceștia să aibă acces la un blog unde pot să citească articolele studenților care deja au experiența necesară anilor de studiu, despre diverse probleme din facultate. De asemenea, aplicația le permite un tur “360” de acomodare în care pot să vizualizeze cazarea în campus și împrejurimile.

Aplicația include diferite module, printre care “My Degree”, unde studenții pot să acceseze informații despre cursuri direct de la departamentul respectiv, “Book a Visit” , în special pentru viitorii studenți care pot rezerva un loc la ziua porților deschise, “Library” pentru a căuta în catalogul bibliotecii sau a verifica disponibilitatea cărților și calculatoarelor din spațiul dedicat studiului.

“My Study Life” este o platformă de planificare pentru elevi și profesori, proiectată pentru a face mai ușor de gestionat și de memorat activitățile pe care aceștia le desfășoară. Aplicația permite stocarea temelor, examenelor și orele la care aceștia trebuie să fie prezenți. Informațiile odată introduse pot fi accesate de oriunde chiar și fără acces la internet.

Spre deosebire de un planificator clasic, pe hartie, aplicația “My Study Life” integrează toate ariile vieții academice, precum termene limită și notificări trimise utilizatorului atunci când data desfașurării examenului se apropie. Aplicația sincronizează datele între diferite device-uri astfel încât utilizatorul poate să adauge examene sau task-uri pe telefon sau tabletă și să fie instant vizibile pe aplicația web.

2. Proiectarea aplicației:

2.1 Diagrama cazurilor de utilizare:

Figura 2.1: Diagrama cazurilor de utilizare

2.2 Diagrame de secvență:

Figura 2.2 : Diagrama de secvență pentru “Planificare”

Figura 2.3 : Diagrama de secvență pentru “Harta”

2.3 Diagrame de stare :

Figura 2.4 : Diagrama de stare pentru “Înregistrare”

Figura 2.5: Diagrama de stare pentru “Evenimente”

2.4 Diagrame de activitate:

Figura 2.6: Diagrama de activitate pentru “Planificare”

Figura 2.7: Diagrama de activitate pentru “Hartă”

2.5 Diagrama de pachete:

Figura 2.8: Diagrama de pachete

2.6 Diagrama de clase:

Figura 2.9: Diagrama de clase pentru “Evenimente”

Figura 2.10: Diagrama de clase pentru “Înregistrare” și “Hartă”

2.7 Modelul de date al aplicației:

Figura 2.11: Diagrama modelului de date

2.8 Securizarea aplicației:

Conform celor mai recente studii, dispozitivele Android prezintă o creștere de 1.4 milioane de device-uri pe zi. Cu acest tip de creștere, este absolut necesar ca dezvoltatorii să creeze aplicații Android sigure. Datorită faptului că platforma Android este open-source, aceasta oferă o arhitectură de securitate solidă.

Android are caracteristici de securitate încorporate în sistemul de operare care reduc în mod semnificativ frecvența și impactul problemelor legate de securitatea aplicațiilor și este proiectat să construiască aplicații care sunt bazate pe permisiunile de fișiere Linux. Mai mult, aplicațiile Android sunt “sandbox”, ceea ce înseamnă că datele din aplicație și execuția codului sunt izolate de alte aplicații.

Permisiuni:

Sistemul Android are un mecanism de securitate denumit "permisiune", care protejează resursele utilizatorului, cum ar fi contactele, dar și serviciile GPS, de un program malware. Atunci când o aplicație dorește acces la astfel de informații care sunt protejate prin sistemul de operare Android, aplicația trebuie să declare în mod explicit o permisiune pentru a le accesa. Începând cu versiunea Android 6.0, acordarea sau refuzul permisiunilor utilizatorilor nu mai apare atunci când aplicația urmează a fi instalată, ci în timpul rulării, atunci când aplicația solicită permisiuni. Permisiunile nu trebuie alocate decât dacă sunt necesare.

Intent:

Folosirea socket-urilor sau a fișierelor distribuite pentru a comunica cu alte aplicații sunt de obicei greu de implementat și predispuse la pericole. O abordare mai usoară și mai sigură a comunicării între procesele în sistemul de operare Android este de a folosi obiectele de tip Intent. Pentru a asigura securitatea aplicației este recomandat să fie folosit un intent explicit. Folosirea unui intent implicit de a începe un serviciu este un pericol de securitate deoarece utilizatorul nu poate vedea ce serviciu va răspunde la intent-ul transmis, spre deosebire de folosirea unui intent explicit.

Securizarea activităților:

Securizarea activitătilor Android este simplă deoarece putem impune anumite permisiuni pentru a începe o activitate. Declarăm permisiunile prin adăugarea anumitor atribute la activitatea specifică din AndroidManifest.

Activitățile private sunt cele mai sigure și nu pot fi lansate de alte aplicații, iar atât timp cât folosim intent-uri explicite nu trebuie să ne facem griji că se vor trimite accidental date altei aplicații. Activitățile publice trebuie să accepte intent-urile returnate din surse care nu sunt de încredere, astfel încât atunci când accesăm o activitate publică este posibil ca intent-urile returnate să fie trimise de programe rău intenționate. Pentru a specifica o activitate privată, atributului “exported” îi trebuie setată valoarea “false”.

Date personale:

Confidențialitatea utilizatorilor are o importanță majoră, de aceea dacă aplicația nu prezintă o infrastructură foarte sigură pentru colectarea, stocarea și transmiterea informațiilor personale despre utilizatori, trebuie să evităm să le cerem în mod direct în aplicație. O alternativă sigură a autentificării utilizatorilor și cererii de informații pentru profilul acestuia este utilizarea serviciului Firebase.

Datele pe care le procesează aplicația pot fi stocate în memorie mai mult decât este necesar, ceea ce face aplicația mai susceptibilă la un atac. Astfel, numele utilizatorului, parolele și alte date confidențiale pot fi accesate ușor. Se recomandă o analiză mai atentă a claselor ce au ca input aceste infomații. În caz contrar, dacă valorile nu sunt șterse din memorie după utilizare, datele din memoria aplicației pot fi obținute de un program rău intenționat.

Chiar dacă Android dispune de “garbage collector”, dezvoltatorul trebuie să considere gestionarea memoriei, iar acest tip de informații, după ce utilizatorul se deconectează din aplicație ar trebui să fie înlocuite cu valori reziduale. Deconectarea unui utilizator dintr-o aplicație Android se face, de obicei, numai pe partea clientului. Id-ul sesiunii sau datele confindențiale nu trebuie trimise în adresele URL ale request-urilor. Aplicația ar trebui să trimită o cerere de log-out explicită la server pentru a termina sesiunea. Datele introduse prin aplicațiile mobile sunt adesea persistente pe partea de backend.

API:

Fiecare cerere către un API trebuie să includă un identificator unic. Identificatorii unici permit consolei să proceseze cererile pentru anumite proiecte pentru a monitoriza traficul și a impune restricții. Google abordează două perspective pentru a crea identificatori unici: API KEY și OAuth2.0.

1. API KEY:

Atunci când se utilizează tehnici de criptare pentru securitatea (confidențialitatea și integritatea) datelor, manipularea corectă a cheilor este printre cele mai importante elemente de luat în considerare. Aceste chei servesc la identificarea proiectului care face apelul către API și astfel i se permite platformei Google să respingă apelurile din alte proiecte.

Cheile API nu sunt la fel de sigure ca un token, dar identifică aplicația sau proiectul care apelează un API.

2. OAuth 2.0:

OAuth este un standard pentru autorizare pe care dezvoltatorii îl pot folosi pentru a furniza clienților un acces securizat la aplicație. Acesta lucrează peste protocolul HTTP și autorizează device-uri, API-uri, servere, furnizând un token de acces, pentru a da anumite permisiuni utilizatorului.

Ceea ce face OAuth2 mai bun din punct de vedere al securității este că nu necesită să stocăm token-ul într-un mediu nesigur. În schimb, acesta va genera token-uri de acces care pot fi stocate într-un mediu de încredere temporar.

Securizarea bazei de date:

Firebase oferă un set de instrumente pentru gestionarea securizării aplicației. Aceste instrumente ușurează autentificarea utilizatorilor, impunerea permisiunilor și validarea intrărilor pentru a proteja informațiile de accesul nedorit. Baza de date este securizată folosind reguli ( read, write și validate) din fișierul în format JSON, acesta fiind puternic și flexibil.

Figura 2.12: Reguli pentru citirea și scrierea în baza de date

De asemenea, se pot scrie reguli personalizate pentru fiecare utilizator în parte, prin care acesta poate să introducă date doar pe nodul pe care îl deține. Odată ce un utilizator se autentifică, variabila auth va fi populată cu informațiile utilizatorului.

Figura 2.13: Reguli de citire și scriere în baza de date pentru un anumit utilizator conectat.

3. Implementarea aplicației

3.1 Prezentarea tehnologiilor utilizate:

Android :

Android este o stivă de software open source care include sistemul de operare, middleware și aplicații mobile cheie, împreună cu un set de biblioteci API pentru scrierea de aplicații care pot modela aspectul și funcțiile dispozitivelor pe care rulează. De asemenea, are o interfață intuitiva și flexibilă cu multe opțiuni puse la dispozitia utilizatorilor.

Aplicațiile reprezintă stratul superior al arhitecturii Android, toate fiind scrise în limbajul de programare Java. Sub stratul de aplicații se află frameworkul de aplicații, un set de “blocuri” high-level pentru dezvoltarea aplicațiilor, fiind preinstalat pe device-urile Android. Acesta are următoarele componente: Activity Manager( asigură ciclul de viață al unei aplicații și menține o stivă de activități comună pentru a naviga în interiorul și între aplicații), Content Providers ( încapsulează date, cum ar fi bookmark-urile de la browser, care pot fi partajate între aplicații), Location Manager, Notification Manager, Package Manager( permite aplicației să descopere pachetele altor aplicații ce sunt deja instalate pe device), Resource Manager, Telephony Manager, View System( această componentă administrează interfața utilizator și generarea de evenimente orientate pe interfață), Window Manager( alocă suprafețele pentru desenat și organizează ecranul).

Componentele cadrului de aplicație se bazează pe un set de biblioteci C/C++ pentru a-și îndeplini scopul. Android oferă un mediu de execuție care constă în biblioteci de bază și Dalvik Virtual Machine, o mașină virtuală non-Java care este bazată pe registre de procesoare. Fiecare aplicație Android rulează pe propriul proces Linux, care găzduiește o instanță de Dalvik Virtual Machine. DVM a fost dezvoltată astfel încât pe dispozitive să poată rula mai multe mașini virtuale în mod eficient. Această eficiență se datorează formatului DEX( Dalvik Executable) care este optimizat pentru o folosire minimă a memoriei. Chiar dacă o mașină virtuală non-Java este prezentă, Android transformă codul Java compilat( de diferite tool-uri, cum ar fi Jack) în format DEX( bytecode), acest rezultat fiind executat de DVM.

Fișierele de cod rezultate împreună cu alte date și resurse necesare sunt apoi incluse într-un App PacKage( APK), fișier identificat prin sufixul .apk. Ultimul strat al arhitecturii se referă la nucleul aplicației. Bibliotecile și mediul de execuție Android se bazează pe un kernel Linux. Acesta acționează precum un layer abstract între hardware și restul stivei de software.

Figura 3.1: Arhitectura Android

Mediul cel mai utilizat pentru dezvoltarea aplicațiilor, Android Studio, grupează fișiere în funcție de cele mai importante părți ale unei aplicații : scripturi, fișiere java, resurse și gradle. Resursele sunt fișiere adiționale cu un conținut static pe care le folosim la dezvoltarea aplicației. Trebuie să externalizăm întotdeauna resursele de aplicație, cum ar fi imaginile și șirurile de caractere din cod, pentru a fi păstrate independent. De asemenea, trebuie să furnizăm resurse alternative pentru configurații specifice ale dispozitivelor, grupându-le în directoare de resurse. În timpul rulării, Android utilizează resursa corespunzătoare pe baza configurației curente.

Orice aplicație Android este alcătuită din următoarele componente: activități, servicii, furnizori de conținut și receptori de mesaje care rulează într-un proces Linux și sunt administrate de Android. Aplicația are drept componente fișiere sursă .xml sau .java, câteva fiind predefinite. Android Manifest, fișierul de tip .xml este prezent în orice aplicație Android, conținând detalii despre proiect, cum ar fi numele autorului, numele pachetului și versiunea pentru care este dezvoltată aplicația.

Activitățile sunt o componenta importantă a aplicației Android,fiind o fereastră care interacționează cu utilizatorul, asigurând funcționalități, iar modul cum sunt realizate este fundamental pentru modelul aplicației. Clasa Activity dispune de anumite callback-uri care informează activitatea atunci când se schimbă o stare: sistemul reia o activitate, creează, oprește sau distruge procesul curent în care se află activitatea.

Figura 3.2: Ciclul de viață al unei activități

Metoda onCreate() se declasează atunci când sistemul creează pentru prima dată activitatea. În această metodă sunt de preferat să fie incluse instanțieri ale anumitor variabile și tot în cadrul acestei metode sunt asociate activitățile cu un ViewModel. Apelul metodei onStart(), face vizibilă activitatea utilizatorului, în timp ce metoda onResume() este starea în care aplicația interacționează cu utilizatorul. Aplicația se va afla în această stare până când se va declanșa un eveniment cum ar fi primirea unui apel telefonic și atunci starea va fi onPause(). În cazul în care activitatea se va întoarce la activitatea anterioară, va fi apelată starea onResume(). Atunci când activitatea nu mai este vizibilă utilizatorului, se află în starea onStop().

Prima versiune comercială a fost lansată pe 23 septembrie 2008, Android 1.0. Android este continuu dezvoltat de Google și Open Handset Alliance și surprinde o serie de actualizări ale sistemului de operare încă de la lansarea inițială. În prezent, Android a lansat o nouă versiune, Android 9.0. Aceasta aduce optimizări cu privire la durata de viață a bateriei și de asemenea un Dashboard îmbunătățit care arată un rezumat la timpul petrecut pe telefon, numărul de notificări primite, procentul de memorie utilizat pentru fiecare aplicație, etc. Atunci când Google lansează o nouă versiune de Android, apare de asemenea, un SDK( Software Development Kit) corespunzător.

Un kit de dezvoltare software permite dezvoltatorilor să creeze aplicații pentru platforma Android. Acesta include exemple de proiecte, emulator pentru dispozitive, biblioteci necesare pentru a dezvolta aplicația și un program de depanare.

Java:

Aplicațiile Android sunt dezvoltate folosind limbajul de programare high-level, Java, dezvoltat de Sun Microsystems. Java are o influență puternică din partea limbajelor C( de unde a împrumutat sintaxa) și C++( modelul obiectelor este adaptat conform acestui limbaj). Acest limbaj de programare este robust și în totalitate orientat pe obiect, fiind foarte sigur. Întregul cod sursă este scris mai întâi în fișier text care se termină cu extensia .java. Aceste fișiere sursă sunt apoi compilate în fișiere .class de către compilatorul javac. Fișierul .class nu conține cod care este nativ procesorului; în schimb conține bytecodes( limbajul mașinii virtuale Java). Faptul că un program Java este executat de către JVM ajută la o mai bună securitate a aplicației, deoarece JVM este în control, previne programul de la a genera efecte secundare în afara sistemului. Tool-ul de lansare în execuție rulează aplicația cu o instanță de JVM. Deoarece Java VM este disponibilă pe mai multe sisteme de operare, aceleași fișiere .class pot funcționa pe Windows, Linux sau Mac OS, ceea ce denotă caracterul de portabilitate al limbajului. Java analizează codul la momentul compilării, dar și la run-time, ceea ce reduce apariția bug-urilor care în alte limbaje sunt “hard-to-track”. Managementul memoriei și tratarea excepțiilor sunt mult mai ușor de realizat în Java decât în limbajele de programare precum C sau C++, deoarece Java elimină aceste probleme prin introducerea conceptului de “garbage collector”, care dezalocă automat memoria.

Există mai multe motive pentru care Java este un limbaj preferat de dezvoltatorii de aplicații Android. Java este un limbaj frecvent utilizat și mulți programatori îl cunosc, poate rula pe o masină virtuală (VM), astfel încât nu este nevoie să fie recompilat pentru diferite telefoane, o mai bună securitate, multe instrumente de dezvoltare disponibile pentru Java, iar multe telefoane mobile sunt compatibile cu acesta. Deși Google pune la dispoziție Java API, Android nu utilizează JVM pentru a executa fișierele .class, ci folosește propria mașină virtuală, Dalvik. Fișierul .class dispune de o singură clasă, în timp ce fișierul cu extensia .dex poate conține una sau mai multe clase. Instrucțiunile executate de Java bytecode sunt pe 8 biți, mașina virtuală Dalvik folosește un set propriu de instrucțiuni pe 16 biți, având un impact important la creșterea performanței aplicației.

Firebase :

Firebase este o platformă de dezvoltare a aplicațiilor mobile și web care oferă utilizatorilor o multitudine de instrumente și servicii pentru a-i ajuta să dezvolte aplicații de înaltă calitate. Serviciile Firebase pot fi divizate în 2 categorii: servicii de dezvoltare a aplicației și servicii pentru promovare în cadrul utilizatorilor.

Cunoașterea identității unui utilizator permite unei aplicații să salveze în siguranță datele utilizatorului în cloud și să îi ofere acestuia date personalizate. Firebase Authentication oferă servicii backend, SDK-uri ușor de folosit și biblioteci UI gata de utilizare pentru a autentifica utilizatorii în aplicație. Se pot autentifica la aplicație prin următoarele metode : e-mail și parolă, număr de telefon, Google, Facebook sau Twitter. Firebase Authentication este în stransă legătură cu alte servicii Firebase și utilizează standarde precum OAuth 2.0 și OpenID Connect.

Baza de date Firebase Realtime este o bază de date găzduită în cloud. Baza de date Realtime este o bază de date NoSQL și ca atare are diferite optimizări și funcționalități în comparație cu o bază de date relațională. API-ul bazei de date Realtime este conceput pentru a permite doar operațiuni care pot fi executate rapid. Acest concept permite o experiență în timp real, care poate servi milioane de utilizatori fără a compromite răspunsul din partea bazei de date.

Datele sunt stocate ca JSON și sincronizate în timp real cu fiecare client conectat. Aplicațiile Firebase rămân disponibile chiar și atunci când sunt offline, deoarece fișierul SDK pentru baza de date în timp real Firebase persistă pe disc. Odată ce conexiunea este restabilită, dispozitivul client primește toate modificările făcute în aplicație, sincronizând-o cu starea curentă a serverului.

Datele din baza de date Firebase sunt stocate optim din punct de vedere al memoriei, astfel încât fiecărui obiect îi este atribuit o cheie unică, “push key”. Conceptul de “push key” este fundamental în acest tip de bază de date. Dacă un utilizator adaugă o nouă postare, acesta va fi stocată ca / posts / 1. Acest lucru ar funcționa dacă numai un singur autor adaugă postări, dar în cele mai multe dintre aplicațiile dezvoltate în ziua de azi, mulți utilizatori pot adăuga postări în același timp. Dacă doi utilizatori scriu în / posts / 2 simultan, atunci unul dintre posturi va fi șters de celălalt. Astfel, aceste chei generate în mod unic ne permit să salvăm colecții de date și să le sortăm după data creării, fără coliziuni în ceea ce privește cheia( nu mai apar conflicte de scriere la o anumită cale din baza de date).

De asemenea, Firebase permite sesiuni de conectare anonime, care sunt utilizate de obicei pentru a stoca cantități nu foarte mari de date, în timp ce se așteaptă ca un client să se autentifice cu o metodă permanentă. Aceste sesiuni anonime pot fi configurate să dureze zile, luni sau chiar ani, până când utilizatorul se înregistrează cu o metodă permanentă sau își șterge memoria cache. Pentru a lucre cu Firebase, trebuie folosit tool-ul pus la dispoziție de Android Studio.

JSON( JavaScript Object Notation) :

JSON este un format de text care este complet independent de un limbaj de programare, dar utilizează convenții care sunt familiare programatorilor de C, C ++, C# sau Java. JSON este folosit pentru schimbul de date cu serverul (operații CRUD).

În comparație cu XML este mult mai ușor de folosit deoarece este mai rapid pentru operațiile de scriere și citire și nu trebuie să fie parsat de o funcție JavaScript standard, spre deosebire de XML care are nevoie de un XML parser.

JSON este construit pe baza a 2 structuri: o colecție de perechi cheie/valoare ( în multe limbaje de programare acest lucru este realizat sub forma unui obiect, sau o structură – hash table) și o listă ordonată de valori( în progrmare acest lucru se realizează printr-un vector). Cheile JSON sunt în partea stângă; acestea trebuie să fie reprezentate în ghilimele duble, iar valorile din partea dreaptă pot fi șiruri de caractere, numere, valori de adevărat/fals sau null, obiecte sau array. De asemenea, structurile pot fi imbricate. Cel mai important atribut este că poate fi ușor transferat între limbajele de programare într-un format cu care toate pot lucra.

Google Maps API :

Un API este un set de metode și instrumente care pot fi utilizate pentru construirea de aplicații software. Cu SDK-ul pentru hărți din Android, pot fi adăugate hărți pe baza datelor Google Maps în aplicație. Acest API gestionează automat accesul la serverele hărților de la Google, descarcă date, afișează hărțile și pot fi utilizate apelurile către API pentru a adăuga pe hartă diferite markere pentru anumite locații, poligoane și suprapuneri și pentru a modifica vizualizarea utilizatorului pentru o anumită zonă a hărții.

Geocoding este procesul de conversie a adreselor în coordonate geografice (latitudine și longitudine), iar apoi aplicația poate folosi acest lucru pentru a plasa marcaje pe hartă sau pentru a poziționa harta.

Google Directions API este un serviciu care calculează direcțiile între locații utilizând o cerere HTTP. Acesta desenează o cale între 2 puncte (origine și destinație). Utilizatorul poate să vizualizeze diferite rute în funcție de modul de transport pe care îl selectează. Acest API returnează cele mai eficiente rute. Timpul de deplasare este principalul factor care se ia în considerare, dar API-ul pentru direcții mai poate analiza și alți factori, cum ar fi distanța, numărul de viraje și multe altele atunci când returnează un răspuns.

API-ul pentru vizualizarea locațiilor este un serviciu care returnează informații( răspunsul este în format JSON sau XML) despre acel loc, utilizând cereri HTTP. Pe baza acestui request, Google Maps API dispune de mai multe tool-uri, printre care: Place Search (returnează o listă de locuri bazată pe locația curentă a utilizatorului), Place Details( returnează informații detaliate despre o anumită locație), Place Add( adaugă în baza de date Google Maps, date din aplicația utilizatorului).

Toate solicitările către un serviciu de localizare trebuie să utilizeze protocolul https: // și să includă o cheie API. Pot fi returnate date cu ajutorul longitudinii sau latitudinii sau printr-o adresă. Utilizarea anumitor API-uri implică autentificarea și autorizarea prin protocolul OAuth 2.0.

Fiecare aplicație care este instalată pe un dispozitiv Android dispune de o cheie unică, astfel încât să se țină o evidență în legătură cu cine a realizat aplicația. În background, Android Studio a creat o cheie implicită, numită cheie de depanare. Astfel, Android Studio, “semnează” fișierul APK cu cheia de depanare de fiecare dată înainte ca aplicația să ruleze.

Retrofit:

În versiunile mai vechi de Android, se folosea de obicei AsyncTask pentru a lua date de pe server, iar apelurile paralele către API-uri erau greu de realizat. View-uri care solicitau mai multe apeluri de acest fel rulau destul de greu, uneori execuția putea să dureze multiple secunde. De aici a apărut necesitatea de dezvoltare a unor noi biblioteci care să dețină un suport pentru fire de execuție concurente ce se desfășoară în background.

Diferența dintre AsyncTask și celelalte biblioteci noi apărute este despre faptul cum se specifică endpoint-ul și ceea ce returnează acesta în mod concret. De fapt, începând de la Android 3.0 (Honeycomb), a fost obligatoriu să se efectueze operațiunile de rețea într-un thread separat.

Retrofit este o bibliotecă dezvoltată de Square pentru Android și Java, fiind open-source. Acesta poate transforma API-ul HTTP într-o interfață Java și folosește OkHTTP pentru a face cereri peste HTTP. Pentru a serializa obiectele JSON, este recomandat ca aplicația să folosească librăria Gson( datele din JSON sunt parsate în clase POJO). Retrofit este clasa prin care interfețele API se transformă în obiecte care pot fi apelate.

Pentru a trimite cereri către un anumit API, trebuie folosit un builder pentru clasa Retrofit, unde să se specifice URL-ul de bază folosit în aplicație. Endpoint-urile sunt specificate în interiorul unei interfețe utilizând adnotări speciale pentru a codifica detalii despre parametri și de metoda de solicitare către server. În plus, tipul returnat este întotdeauna un obiect parametru Call <T>. Pentru fiecare endpoint este specificată o adnotare a metodei HTTP (GET, POST, PUT, DELETE). Metodei ce conține una din adnotările menționate îi putem trimite drept parametru adnotarea @Url(în definiția endpoint-ului), fiind un Url dinamic; se va concatena cu Url-ul trimis ca parametru metodei baseUrl().

Gson:

Gson este o bibliotecă oferită de Google care dispune de un framework puternic pentru conversia între fișiere de tip JSON și obiecte Java. Această bibliotecă ajută dezvoltatorul la evitarea scrierii de cod “boilerplate” și de a analiza structura fișierului JSON sau răspunsul primit de la server. Biblioteca Gson poate fi folosită cu orice bibliotecă de rețea, inclusiv cu Android Async HTTP Client și OkHttp.

3.2 Detalii privind algoritmii folosiți:

Aplicația Android “Campus Virtual” se va deschide cu o activitate de autentificare a utilizatorului (LogIn) pentru a accesa funcționalitățile acesteia. În cazul în care utilizatorul nu are deja un cont activ pentru a intra în aplicație, acesta poate să utilizeze formularul de SignUp, care trimite utilizatorul într-o altă activitate. De asemenea, aplicația oferă funcționalități diferite pentru utilizatori diferiți. Dacă cel care va accesa aplicația este deja student la Academia de Studii Economice, acesta va putea vizualiza toate funcțiile, în schimb dacă urmează să depună aplicația la această universitate, are acces condiționat, deoarece încă nu dispune de o adresă instituțională.

Revenind la formularul de autentificare, utilizatorul trebuie să completeze câmpurile cu e-mailul și parola corespunzătoare în text view-urile din cadrul aplicației. Pentru realizarea acestei funcționalități am ales să folosesc Firebase Authentication.

Astfel, în fișierul .java pentru activitata menționată am creat o instanță a clasei FirebaseAuth prin metoda statică getInstance(), în interiorul metodei onCreate(). Apoi, am utilizat evenimentul de click pentru butonul de LogIn, căruia i-am atașat un listener( setOnClickListener), iar la apăsarea acestuia se va deschide activitatea “Meniu”.

Înainte ca utilizatorul să efectueze acest eveniment, am ales să validez datele pe care acesta le va introduce, astfel încât accesarea meniului nu va fi posibilă până când toate câmpurile nu sunt completate corect, conform condițiilor impuse( câmpurile nu trebuie să aibă spații libere, parola trebuie să fie mai mare de 5 caractere și să conțină cel puțin o valoare numerică, iar adresa de e-mail nu trebuie să conțină caractere speciale și este necesar să se termine cu un domeniu valid). Parola și adresa de e-mail ale utilizatorului sunt trimise ca parametri metodei signInWithEmailAndPassword().

Am utilizat addOnCompleteListener() care este apelată atunci când task-ul a fost complet. Acest listener va fi apelat în firul de execuție principal al aplicației. Dacă task-ul este deja terminat, apelul la listener este imediat “programat”, altfel dacă sunt adăugați mai mulți listen-eri, aceștia vor fi apelați în ordinea în care au fost adăugați. Am folosit această metodă pentru a trata succesul sau nereușita execuției operației de SingIn, prin suprascrierea metodei onComplete().

Procesul de SignUp are un mod similar de implementare precum cel descris la operația de SignIn. Atunci când un utilizator dorește să își creeze un cont, completează formularul de înregistrare urmând pașii necesari de validare ai conținutului, cum ar fi îndeplinirea cerințelor de complexitate în alegerea parolei. Noul cont de utilizator este creat prin apelarea metodei createUserWithEmailAndPassword(), căreia îi sunt transmiși drept parametri e-mailul și parola. Atunci când utilizatorul a finalizat acest proces, îi este afișat un mesaj corespunzător dacă a efectuat sau nu cu succes task-ul, iar apoi datele sunt introduse în baza de date. Acest cont nou este stocat ca o parte a proiectului Firebase și poate fi folosit pentru a identifica un utilizator în fiecare aplicație din proiect, indiferent de metoda de înregistrare pe care o utilizează.

Înainte de a realizata toate lucrurile menționate mai sus, trebuie adăugată o dependență pentru Firebase Authentication la nivelul aplicației, în fișierul build.gradle, precum și dependența pentru fișierul json “google-services”, prin care Firebase gestionează setările pentru API și credențiale.

Odată ce utilizatorul este autentificat, acesta are acces la meniul aplicației, de unde poate să acceseze diferite funcționalități implementate. Dacă dorește să se deconecteze din aplicație, poate accesa această funcție prin apăsarea unui buton de pe side-meniul din aplicație, din activitatea “Meniu”. Similar, este adăugat un listener pentru evenimentul de click pe butonul de SignOut : este creată o instanță de FirebaseAuth, prin care apelăm metoda signOut(). La apăsarea butonului, userul va putea reveni la activitatea principală de LogIn.

Pentru folosirea acestui serviciu, FirebaseAuth, am adăugat în fișierul AndroidManifest.xml permisiunea pentru utilizarea internetului.

Odata accesată activitatea”Meniu”, în urma autentificării, utilizatorul dispune de mai multe opțiuni, printre care: accesarea unei hărți pentru a găsi mai ușor anumite locații din campus, planificator de examene pentru gestionarea mai eficientă a timpului, informații despre facultate și cursuri, evenimentele și workshop-urile care se vor desfășura în cadrul facultății. Selectarea opțiunilor se face printr-un meniu circular.

Una dintre modalitătile cele mai intuitive de a furniza un context pentru o locație sau o adresă fizică este utilizarea unei hărți. Folosind un MapView, pot fi create activități care includ o hartă interactivă. MapView oferă un control complet al afișării hărții, permițând controlul zoom-ului, locației și modurilor de afișare. Pentru a avea acces la hartă, fișierul AndroidManifest trebuie să conțină anumite permisiuni: INTERNET, ACCESS_COARSE_LOCATION (permisiune folosită pentru a determina locația aproximativă a clientului folosind WiFi), ACCESS_FINE _LOCATION( permisiune folosită pentru a determina locația exactă a clientului folosind GPS). De asemenea, trebuie adăugate numite dependențe în fișierul build.gradle( sunt necesare dependențe pentru a integra serviciul Google Play și pentru a adăuga biblioteca de fișiere Android, Retrofit).

Una dintre funcționalitățile hărții este aceea de a arăta diferite categorii de locuri din apropierea facultății( restaurante, parcări sau biblioteci). Pentru a realiza acest lucru, Google Maps ne va întoarce un fișier JSON. Datele din fișier trebuie aduse în aplicație în mod corespunzător și adăugat un marker pe fiecare locație. Pentru a accesa aceste locații folosind librăria Retrofit, trebuie realizate clase POJO( aceste clase cuprind doar metode get și set pentru atributele existente în interiorul clasei). Clasele sunt utilizate pentru a extrage date din URL. Aplicația conține următoarele clase POJO: Geometry, Location și MyPlaces.

În interfața IGoogleApiService, metoda getNearbyPlaces() este folosită pentru a obține detalii despre coordonatele returnate de serverul Google, iar MyPlaces este clasa POJO care va stoca acest răspuns. Adnotarea @GET este folosită pentru a face un apel către server.

Clasa RetrofitClient este folosită pentru a transforma datele din fișierul JSON în date accesibile, folosind GsonConverterFactory.

În metoda sincronizată din clasa MapActivity, buildGoogleApiClient(), am accesat API-ul de la Google prin crearea unei instanțe de GoogleApiClient. Astfel se gestionează conexiunea la rețea între serviciul Google și dispozitivul utilizatorului.

În clasa MapActivity, prin metoda enqueue() se trimit cereri către API care notifică apoi callback-ul de datele primite sau dacă se întâmplă o eroare în cadrul procesului, crearea cererii sau procesarea răspunsului. Dacă a fost primit un răspuns, atunci metoda onResponse() va fi automat apelată. În caz contrar, dacă răspunsul nu a fost trimis cu succes, metoda onFailure() va fi apelată iar motivul pentru întâmpinarea erorii va fi afișat.

Atunci când metoda getNearbyPlaces() din interfața menționată este apelată în cadrul metodei nearbyPlaces din clasa MapActivity, se trimite ca parametru URL-ul pentru a retrage datele. Apoi, o buclă este inițiată pentru a lua toate locurile învecinate și evidențiate rând pe rând cu un obiect de tip Marker. Coordonatele (longitudinea și latitudinea) pentru fiecare loc din apropiere se obțin prin metodele get ale clasei POJO, Results.java, getLat() și getLng().

De asemenea, atunci când utilizatorul selectează o anumită locație sunt afișate detalii despre aceasta. Utilizatorul are posibilitatea să aleagă mai multe tipuri de locații învecinate printr-un NavigationView situat în layout-ul activității, cu pictograme personalizate pentru fiecare categorie.

Atunci când harta este pregătită pentru a fi afișată, metoda onMapReady() din activitate este apelată. De asemenea, aceasta va fi apelată și atunci când harta se reîncarcă. Locația curentă a utilizatorului va fi afișată pe hartă prin obținerea unei referințe ale unui obiect GoogleMap și prin apelul metodei setMyLocationEnabled() al acelei instanțe, trimițând valoarea true drept parametru. Tot în această metodă se va constui Google API Client prin apelul metodei buildGoogleApiClient().

La finalul metodei sunt tratate cazurile pentru apăsarea pe diferite opțiuni din NavigationView prin atribuirea unui listener obiectului de tip BottomNavigationView.

De asemenea, utilizatorul poate să vadă distanțele dintre două locații și timpul în care poate să parcurgă acest drum. Pentru început, utilizatorul trebuie să adauge câte un marker pentru fiecare dintre cele două puncte. În consecintă, se va trasa o rută între ele, indicând distanța și timpul necesar pentru a ajunge de la un punct la altul. De asemenea, distanța și timpul afișate vor fi în funcție de modul de transport ales de utilizator: mers pe jos sau cu mașina personală. Cu scopul de a realiza acest lucru am folosit librăria Retrofit pentru a prelua date de la server, mecanismul de implementare este asemănător cu funcționalitate de afișare a locurilor învecinate. Răspunsul pe care îl va primi de la server va fi în format JSON. Pentru a capta aceste date folosind Retrofit Android, am implementat clase POJO. Aceste clase POJO sunt folosite pentru a obține valorile atributelor de la server.

În interfața RetrofitMaps am folosit adnotarea @GET cu URL-ul corespunzător (doar ultima parte a URL-ului a fost adăugată, inclusiv cheia pentru accesul la API-ul Google). Spre deosebire de algoritmul implementat pentru “locuri invecinate”, de data aceasta am folosit în loc de “browser key”, “server key”. Restul variabilelor (unităti de măsură, origine, mod de transport și destinație) vor fi transmise la run-time folosind Query în getDistanceDuration ().

Metoda getDistanceDuration() este utilizată pentru a obține detalii despre punctele returnate de la server, iar Example este o clasă POJO pentru a stoca acel răspuns. De asemenea, originea și destinația vor fi furnizate conform coordonatelor pentru care utilizatorul face click pe hartă și modul va fi furnizat în funcție de opțiunea pe care o alege ( “Driving” sau “Walking”).

Metoda build_retrofit_and_get_response() va fi apelată atunci când utilizatorul face click pe butonul Walking sau Driving. După aceea, am folosit interfața RetrofitMaps pentru a obține detaliile. Apoi se face apelul și afișarea distanței și a timpului în funcție de modul selectat. Apelurile pot fi executate în mod sincron cu execute () sau asincron cu enqueue ().

După primirea răspunsului de la server, metoda onResponse() se apelează automat. În această metodă, mai întâi eliminăm orice rută anterioară folosind line.remove (). Apoi, o buclă este initiată pentru a obține distanța și durata călătoriei. Obținem toate datele prin metodele getter definite în clasele POJO. De exemplu, pentru a obține distanța, am folosit metodele getRoutes (), getLegs () și getDistance (). De asemenea, traseul este desenat între origine și destinație folosind mMap.addPolyline ().

Desenul rutei este făcut pe baza unui obiect de tip Polyline. Un astfel de obiect este o pereche de coordonate care au fost transformate într-un șir de caractere ASCII, pentru a reduce semnificativ dimensiunea totală a datelor (fiecare caracter ASCII deține opt biți de date). Acest algoritm primește diferența dintre două puncte și o tranforma apoi în cod ASCII. Prima dată este calculată distanța primului punct față de origine. Pentru a trasa segmentul trebuie apoi să găsim diferența dintre coordonatele primului punct și coordonatele celui de-al doilea punct. Cu scopul de a asigura afișarea corectă a acestor caractere, valorile codificate sunt însumate cu 63 (caracterul ASCII "?") înainte de a le converti.

.

Figura 3.3: Obiectul Json returnat de server și evidentierea codificării coordonatelor dintre cele două puncte

O altă funcționalitate de care dispune această hartă este accea a vizualizări locațiilor fiecărei clădiri din cadrul facultății. Utilizatorul poate accesa această opțiune printr-un side-menu implementat în partea stânga a activității MapActivity. Lista clădirilor este afișată într-o altă activitate, iar pentru afișarea acestora am utilizat un ListView. Acesta este un container care grupează elementele și le afișează pe o listă derulată vertical. Inserarea elementelor în listă se face prin folosirea unui adapter, de accea am ales să folosesc un adapter simplu, ArrayAdapter, fiind vorba doar despre o lista de string-uri cu denumirile clădirilor. Un adapter construiește de fapt o legătură între componentele interfeței grafice și sursa de date care populează ListView-ul. Atunci când utilizatorul selectează o anumită clădire din listă, printr-un Intent, aplicația se întoarce automat la activitatea MapActivity și va pune un marker pe hartă cu clădirea selectată de utilizator.

Opțiunea “Planificare examene” permite studentului care utilizează aplicația să își organizeze timpul într-un mod mai eficient pe toată durata ciclului de studiu. Această opțiune este diferențiată pentru fiecare utilizator în parte și este vizibilă doar utilizatorilor care dețin o adresă de e-mail instituțională.

Am adăugat la proiect următoarele clase: AdaugareExamen, AdaugareTaskSeminar și AdaugareEvaluareSeminar care conțin atribute ce descriu fiecare activitate în parte. Acestea sunt clase de tip POJO. Fiecare clasă are asociată o activitate pentru a implementa interfața. De asemenea, activitățile PlanificareExamen, PlanificareTaskSeminar, respectiv PlanificareEvaluare Seminar conțin un ListView în care sunt afișate datele introduse de utilizator pentru fiecare dintre cele 3 categorii.

Activitatea PlanificareExamene conține un container de tip ListView și un buton pt a naviga către activitatea de AdaugareExamen. Afișarea elementelor în listă am ales să o realizez prin utilizarea unui adapter personalizat, întrucât este vorba de mai multe câmpuri ale unei singure clase. Adapterul personalizat este foarte flexibil și permite dezvoltatorului să afișeze datele în formatul și în ordinea dorită.

În primul rând, pentru a implementa acest concept am creat un layout cu elemente din paletă, pusă la dispoziție de Android Studio ce va descrie structura unui element din listă. Pentru a folosi adapterul, trebuie creată o clasă (AdaugareExamenAdapter) care să extindă ArrayAdapter<T>, parametru T fiind clasa AdaugareExamen. În această clasă trebuie suprascrisă metoda getView(), care va fi apelată atunci când un element este creat și trebuie să populeze ListView-ul. LayoutInflater primește drept parametru un layout XML și îl folosește pentru a construi reprezentarea vizuală a acestuia.

Implementarea prezentată mai sus am folosit-o pentru activitatea PlanificareExamene. În primul rând, afișarea personalizată a rezultatelor din baza de date în funcție de utilizatorul conectat am realizat-o printr-un obiect de tipul DatabaseReference, această clasă fiind punctul de start pentru toate operațiile cu baza de date Firebase. O referință Firebase reprezintă o locație particulară în bază de date și poate fi folosită pentru a citi sau scrie anumite informații la locația respectivă.

În metoda onStart() din această activitate am implementat soluția pentru afișarea elementelor din listă în interfața utilizator. Dat fiind faptul că fiecare utilizator are propriile examene, metoda getCurrentUser() îmi returnează o instanță a utilizatorului înregistrat pentru care pot să văd examenele din baza de date, cheia unică fiind id-ul acestuia.

Datele pe care utilizatorul le primește de la baza de date sunt încapsulate într-un obiect de tip DataSnapshot, apoi datele din listă sunt trimise către adapter pentru a putea fi afișate. Dacă utilizatorul dorește să șteargă un item din listă, această funcție poate fi folosită printr-un click pe respectivul element. Se va deschide o fereastră de tip AlertDialog care îl va informa pe utilizator că urmează să fie șters un item din ListView cât și din baza de date, care se va actualiza în timp real. Atunci când este șters un item, adapterul este și el notificat astfel încât să efectueze modificările pentru interfața aplicației, prin metoda notifyDatasetChanged().

Similar cu pașii descriși mai sus va fi și algoritmul de implementare pentru celelalte două activități, PlanificareTask-uri și PlanificareActivitateSeminar, diferența fiind faptul că în clasele POJO asociate, atributele vor fi diferite ( în clasa PlanificareTask-uri va fi introdus ca atribut și termenul limită de predare al proiectului și ponderea pe care o va avea la nota finală).

O altă opțiune pe care utilizatorul o poate accesa este aceea a vizualizării de evenimente, fie ele worksop-uri sau diferite prezentări. Modul de implementare al acestora este similar și ambele dispun de aceleași funcționalități.

Am creat o clasă „Prezentari” care va stoca atributele ce descriu un eveniment de acest tip: denumire, detalii desfășurare, sală desfășurare, număr de locuri. Aceste prezentări preluate din baza de date vor fi afișate într-un ListView pe care îl voi popula folosind un adapter personalizat. Atunci când utilizatorul apasă pe un element din interfață, printr-un singur click, are la dispoziție două opțiuni: efectuare rezervare sau anulare rezervare. Astfel , se va deschide o fereastră de tip AlertDialog prin internediul căreia sunt anunțate cele două opțiuni.

În primul rând, am luat o referință către locația din baza de date unde am salvat prezentările, printr-un obiect de tipul DatabaseReference, pentru a putea citi datele. Atunci când un utilizator face o rezervare, se salvează în baza de date e-mailul utilizatorului și numele evenimentului, pentru a ține evidența rezervărilor.

De asemenea, am pus și o validare cu privire la numărul de locuri disponibile, utilizatorul va primi o notificare dacă nu mai este posibilă rezervarea ( numărul de locuri este mai mic ca 0). Pentru a putea vedea dacă utilizatorul a făcut deja o rezervare la evenimentul selectat de acesta, am suprascris metoda onDataChange() din interfața ValueEventListener cu ajutorul căreia am parcurs toată lista de rezervări și am verificat dacă e-mailul utilizatorului împreună cu numele evenimentului (pereche cheie-valoare ce trebuie să fie unică) se regăsesc în acea locație. Dacă această condiție este îndeplinită, un mesaj va fi trimis utilizatorului, iar dacă nu, se poate efectua rezervarea locului pentru participare.

Numărul de locuri de la locația “prezentari” se va actualiza prin apelarea metodei updateChildren(). Pentru a putea modifica o valoare de la o anumită locație din baza de date Firebase, trebuie construit un Map ce are drept cheie numele nodului pentru care se va face modificarea și valoarea va fi cea cu care se dorește a fi înlocuită informația deja existentă. Acest obiect de tip Map va fi trimis metodei updateChildren().

Pentru anularea rezervării, algoritmul implementat este asemănător cu cel descris mai sus. Utilizatorul va primi o notificare în cazul în care nu este posibilă anularea. Rezervarea va fi ștearsă și din locația a cărui nod principal are denumirea „rezervări” și, de asemenea, numărul de locuri va fi actualizat și în locația de la nodul „prezentări” prin metodele removeValue() respectiv updateChildren(). Utilizatorul poate selecta din lista de prezentări anumite item-uri și adăugarea lor la secțiunea „Favorite” pentru o vizualizare ulterioară. Acestea sunt salvate în baza de date și fiecare utilizator atunci când accesează activitatea „Prezentări favorite” poate vedea evenimentele proprii.

La sfârșitul fiecărei opțiuni din AlertDialog, adapterul va fi notificat pentru a face schimbări corespunzătoare în interfața utilizatorului, în ceea ce privește locurile disponibile.

4.Concluzii:

4.1 Sintetizarea funcțiilor oferite de aplicația implementată

Aplicația descrisă în această lucrare a fost realizată cu scopul de a facilita accesul studenților la informații cu privire la facultate, într-o eră în care individul este tot mai dependent de tehnologie și prin urmare, de folosirea telefonului mobil. Astfel, utilizatorii pot vedea toate informațiile adunate într-un singur loc, fără a mai fi nevoiți să acceseze multiple pagini web pentru a ajunge la rezultatul dorit. Termenul de “Campus Virtual” nu este des întalnit la universitățile din țara noastra, el fiind foarte des utilizat însă în Mare Britanie sau America. Am decis, prin urmare, implementarea unei astfel de soluții de organizare a activității unui student și de adaptare a acestora la un nou mediu.

Printre funcțiile de bază ale acestei aplicații se numără: existența unui planificator unde studenții au șabloane separate pentru înregistrarea tuturor examenelor și modurile de evaluare pe parcursul seminarului, existența unei hărți interactive cu ajutorul căreia studenții pot găsi mult mai ușor clădirile atunci când se grăbesc la un curs dar și anumite tipuri de locuri( restaurante,parcări sau biblioteci) în vecinătatea locației curente. De asemenea, harta le permite calcularea distanței de la locația curentă la locul unde doresc să ajungă și le arată o rută între două puncte selectate. Aceștia pot vizualiza evenimentele și worksop-urile care urmează să se desfășoare în cadrul facultații, dar și un mic ghid despre fiecare. Aplicația are o secțiune dedicată și studenților care doresc să urmeze cursurile facultății, pentru aceștia fiind expuse informații despre programa facultății cât și feedback-uri din partea studenților care deja frecventează ciclul de licență, pentru a se decide care este cel mai potrivit program.

De asemenea, am ales să implementez această aplicație pentru a fi mai familiară cu tehnologiile prezentate pe parcursul lucrării, iar astfel am decis să adaug serviciul de hărți prin intermediul unei tehnologii care ajută la construirea rapidă a unui API și accelerarea timpului pentru descărcarea resurselor, librăria Retrofit. Cât despre baza de date, am decis că cea mai potrivită este Firebase Realtime Database, deoarece această platformă mobilă permite dezvoltarea rapidă a aplicațiilor.

Am decis să optez pentru folosirea sistemului Android la dezvoltarea aplicației întrucât în perioada actuală este tehnologia cea mai des întâlnită pe dispozitivele mobile, fiind o tehnologie intuitivă și bine documentată.

4.2 Raportarea la soluțiile consacrate în domeniu:

În acest domeniu au fost dezvoltate multiple aplicații, de fiecare universitate în parte, oferind diverse facilități studenților. Analizând aceste soluții am încercat să dezvolt o aplicație care să înglobeze câteva dintre aceste funcționalități, iar ulterior să fie îmbunătățită din mai multe puncte de vedere.

Implementarea hărții interactive și tuturor funcționalităților sale am regăsit-o și în aplicațiile universităților precum cea din Texas (TAMU) și cea din Lancaster (iLancaster), ambele având o machetă a campusului cu evidențierea fiecărei cladiri importante din interiorul acestuia, printr-un marker și de asemenea calcularea rutei optime între două locații.

În ceea ce privește informarea studenților cu privire la evenimentele organizate în facultate, aplicațiile iLancaster și TAMU dispun, de asemenea, de un calendar de evenimente și workshop-uri precum aplicația descrisă în prezenta lucrare.

Activitatea care pune la dispoziția utilizatorilor un planificator util pentru păstrarea într-un singur loc a tuturor atribuțiilor și îndatoririlor din timpul facultății se regasește și în cadrul aplicației “My Study Life”, care are, de asemenea, incluse formulare cu câmpuri personalizate pentru adăugarea de examene și task-uri.

4.3 Identificarea unor direcții de dezvoltare viitoare a aplicației:

Aplicațiile universităților au ca scop, de obicei, să ofere studenților acces la programarea examenelor, orar pentru transportul în campus, afișarea notelor sau hărți care asigură ghidarea în campus. Dar câteva universități au încercat să abordeze o altă perspectivă pentru această problemă. Multe dintre aceste aplicații au căutat să ofere o singură funcționalitate cum ar fi securitatea în cadrul campusului.

Un exemplu de aplicație axată pe viața studenților este Harvard Shoestring Strategies, o aplicație a Universității Harvard, dezvoltată în întregime de studenți. Această aplicație împărtășește sfaturi practice de elaborare a bugetului pentru studenții de la Harvard cu privire la diverse lucruri cum ar fi studiul în străinătate, găsirea unui loc de muncă, materialele auxiliare pentru cursuri, cursuri opționale cât și alocarea finanțelor pentru timpul liber.

Cambridge Experience este o aplicație de realitate augmentată de către Cambridge University Press, care pretinde că aduce cărți de curs și materiale de clasă la viată. Cu aplicația de pe telefoanele lor, studenții universității trebuie doar să îndrepte camera spre materialul cursului pentru a accesa mai multe videoclipuri și fotografii legate de subiect. Interesant este faptul că platforma care exploatează experiența Cambridge Experience, Aurasma, este dezvoltată intern, în cadrul Universității.

Principala direcție spre care doresc să dezvolt aplicația este implementarea unui modul pentru afișarea notelor studenților cât și acordarea de feedback din partea profesorilor asupra lucrărilor examinate. De asemenea aplicația va avea o secțiune unde profesorii pot anunța modul de evaluare pe parcursul semestrului, anumite schimbări legate de desfășurarea seminarului și datele pentru susținerea examenului la materia respectivă sau testele din cadrul seminarului.

Un alt obiectiv viitor al aplicației este acela de a da posibilitatea studenților să își înregistreze prezența la orele la care este solicitată. Pentru a funcționa acest lucru, studenții trebuie să utilizeze Geolocation pentru a-și înregistra prezența. Datele sunt de asemenea destinate să permită studenților să-și auto-monitorizeze angajamentul față de studiile lor.

Drept notă finală, aș dori să menționez faptul că acest gen de aplicație aduce multe beneficii atât studenților cât și profesorilor deoarece reduce cu mult timpul pe care aceștia l-ar fi petrecut dacă funcționalitățile aplicației descrise cât și direcțiile sale de dezvoltare ar fi implementate în aplicații diferite. De asemenea, aplicația poate fi dezvoltată și pentru alte universități din țară cu implementarea de funcționalități care să corespundă cu nevoile studenților din cadrul acelei universități

5. Bibliografie:

Phillips, Bill; Stewart , Chris; Marsicano,  Kristin (2017), Android Programming: The Big Nerd Ranch Guide, Editura  Big Nerd Ranch Guides, Arizona

Meier, Reto (2013), Professional Android 4 Application Development, Editura John Wiley & Sons, Indianapolis

Boja, Catalin; Ciurea, Cristian; Doinea, Mihai (2015), Android mobile applications : a practical development guide, Editura ASE, București

Pocatilu, Paul; Ivan, Ion; Visoiu, Adrian; Alecu, Felician; Zamfiroiu , Alin; Iancu, Bogdan (2015), Programarea aplicațiilor Android, Editura ASE, București

Elenkov, Nikolay (2014), Android Security Internals, Editura  No Starch Press, San Francisco

http://www.oracle.com/us/corporate/press/1946490

https://www.raywenderlich.com/110452/java-for-android

https://firebase.google.com/docs/android/setup

https://firebase.google.com/docs/auth/

https://firebase.google.com/docs/database/android/read-and-write

https://firebase.google.com/docs/database/android/structure-data

https://developers.google.com/maps/documentation/android-sdk/start

https://developers.google.com/places/web-service/intro

https://developers.google.com/places/web-service/supported_types

https://developers.google.com/maps/documentation/utilities/polylinealgorithm

https://developer.android.com/guide/components/fundamentals

https://developer.android.com/guide/topics/manifest/manifest-intro

https://developer.android.com/training/permissions/usage-notes

https://developer.android.com/guide/components/intents-filters

https://developer.android.com/guide/components/activities/activity-lifecycle

http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/

https://code.tutsplus.com/articles/how-to-secure-an-android-app–cms-26385

https://developer.android.com/training/id-auth/authenticate

https://firebase.google.com/docs/storage/security/user-security

https://developer.android.com/guide/platform/

https://blog.udemy.com/java-for-android/

https://material.io/design/color/

https://developer.android.com/reference/android/content/Intent

https://developer.android.com/reference/android/Manifest.permission

https://medium.com/@dftaiwo/understanding-the-power-of-firebase-security-rules-part-1-f46aae773a24

https://developer.android.com/guide/topics/resources/providing-resources

https://developer.android.com/guide/background/

https://developer.android.com/training/location/

https://developer.android.com/training/location/receive-location-updates

http://square.github.io/retrofit/

https://github.com/google/gson

https://developers.google.com/maps/documentation/android-sdk/marker

6. Anexe:

6.1 Anexa 1:

Lista figurilor:

Figura 2.1: Diagrama cazurilor de utilizare

Figura 2.2: Diagrama de secvență pentru “Planificare”

Figura 2.3: Diagrama de secvență pentru “Hartă”

Figura 2.4: Diagrama de stare pentru “Înregistrare”

Figura 2.5: Diagrama de stare pentru “Evenimente”

Figura 2.6: Diagrama de activitate pentru “Planificare”

Figura 2.7: Diagrama de activitate pentru “Hartă”

Figura 2.8: Diagrama de pachete

Figura 2.9: Diagrama de clase pentru “Evenimente”

Figura 2.10: Diagrama de clase pentru “Înregistrare” și “Hartă”

Figura 2.11: Diagrama modelului de date

Figura 2.12: Reguli pentru citirea și scrierea din baza de date

Figura 2.13: Reguli de citire și scriere în baza de date pentru un anumit utilizator conectat.

Figura 3.1: Arhitectura Android

Figura 3.2: Ciclul de viață al unei activități

Figura 3.3: Obiectul Json returnat de server și evidentierea codificării coordonatelor dintre cele două puncte

6.2 Anexa 2:

Listarea codului sursa:

Similar Posts