Aplicație mobilă pentru gestionarea programărilor Coordonator științific: Conf.dr. Alin Ștefănescu Absolvent: Sandu Daniela Teodora BUCURESTI 2020 1… [613648]
UNIVERSITATEA DIN BUCUREȘTI
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ
LUCRARE DE LICENȚĂ
Aplicație mobilă pentru gestionarea programărilor
Coordonator științific:
Conf.dr. Alin Ștefănescu
Absolvent: [anonimizat]
2020
1
CUPRINS
1 Introducere
2 Tehnologii folosite
2.1 Paradigma programării orientate obiect
2.2 Limbajul Java
2.3 Sistemul de operare – Android
2.3.1 Paradigma Android
2.3.2 Structura unei aplicații Android
2.4 Analiza aplicației
2.4.1 Scopul aplicației
2.4.2 Cerințe
2.4.3 Exemplu de utilizare
2.5 Stocarea datelor
2.5.1 ObjectBox
2.5.2 SharedPreferences
2.6 Interfața grafică
2.6.1 Fișierele XML
2.6.2 Activități
2.6.3 Fragmente
2.6.4 RecyclerView și Adapter
2.6.4.1 Furnizori
2.6.4.2 Servicii
2.6.4.3 Programări
2.6.5 Picasso
2.6.6 Navigation
2.6.6.1 Principii
2.6.6.2 Graful de navigare al aplicației
2.6.7 GridLayout
2.7 Google API
2.7.1 Google Sign in
2.7.2 Calendar Provider
2
2.7.3 Google Pay
2.8 Serviciile pentru trimiterea notificărilor
3 Funcționalitățile aplicației
3.1 Înregistrarea în aplicație și crearea contului
3.2 Perspectiva clientului
3.2.1 Ecranul principal
3.2.2 Pașii pentru a iniția o programare
3.2.3 Gestionarea și vizualizarea programărilor
3.3 Perspectiva furnizorului
3.3.1 Ecranul principal
3.3.2 Gestionare profilului
3.3.3 Gestionarea și vizualizarea programărilor
3.4 Perspectiva programatorului
4 Concluzii
5 Listă de figuri
6 Bibliografie
3
1 INTRODUCERE
În ultimii anii, omul a devenit din ce în ce mai grăbit în activiățile sale de zi cu zi. Cu toții ne
dorim să petrecem cât mai puțin timp: stând la coadă pentru diverse lucruri, sunând o mulțime de
doctori înainte ca unul dintre ei să aibă timp pentru o masea cariată sau să ajungem la service-ul auto și
să ne dăm seama că programarea a fost anulată.
Astfel, prin această lucrare de licență detaliez modul de dezvoltare și funcționare al soluției
găsite – ”Easy Appointment” – o aplicație mobilă ce dorește să medieze legătura dintre clienți și
furnizori, minimizând timpul petrecut pentru a gestiona o programare. Aceasta permite clienților să
găsească detalii despre fiecare furnizor împreună cu serviciile oferite de către aceștia, având la
dispoziție toate informațiile necesare pentru a lua o decezie precum: locație, informații de contact sau
perioadele de timp în care un furnizor este disponbil.
Pentru a dezvolta acest proiect am utilizat numeroase tehnologii și principii populare în ultimii
ani. Sistemul de operare pe care rulează aplicația este Android fiind ales pentru că resursele oferite sunt
open-source, ușor de integrat și de personalizat, punând la dispoziție o multitudine informații
disponibile prin API-urile și contul Google. Ca limbaj de programare am ales Java deoarece este
orientat obiect, poate fi rulat pe orice fel de mașină și beneficiază de o plajă largă de API-uri. Pentru
stocarea datelor am folosit ObjectBox – o bază de date rapidă, NoSQL, dedicată aplicațiilor mobile;
este orientată obiect, iar codul este ușor mentanabil și sustenabil.
Aplicația se bazează pe autentificarea printr-un cont Google, existent pe orice telefon mobil cu
Android, deoarece în momentul în care o programare este inițiată de client și acceptată de furnizor, va
fi creat câte un eveniment specific în calendarul personal prin intermediul Calendar Provider, pentru
ambii utilizatori. Astfel, aceștia beneficiază de sistemul de notificări pus la dispoziție prin Google
Calendar, dar și de apariția programării în planul de activitate zilniă a fiecăruia, automat, fără a necesita
intervenție umană.
În următoarele pagini, voi descrie pe larg componentele aplicației din punctul de vedere al
dezvoltării, dar și din perspectiva utilizării acesteia. Următorul capitol va oferi detalii amănunțite
despre procesul prin care a evoluat proiectul de la idee la aplicția finală prin intermediul tehnologiilor
alese, dar și modul de implementare al acestora. Cel de al treilea capitol va urmări funcționalitățile
4
oferite de aplicație: autentificarea și alegerea tipului de cont, utilizarea din perspectiva clientului,
furnizorului dar și a programatorului.
Pentru a dezvolta această aplicație sunt necesare diferite cunoștiințe precum: gestionarea
sarcinilor și organizarea timpului, alegerea funcționalităților astfel încât să răspundă nevoilor
utilizatorilor, crearea unei interfețe grafice intuitive și ușor de utilizat, scrierea de cod mentenabil și
sustenabil.
5
2 TEHNOLOGII FOLOSITE
Această aplicație folosește diverse tehnologii îmbinate pentru a îmbunătăți experiența
utilizatorului prin viteza de rulare a codului, micșorarea spațiului de memorie utilizat sau posibilitatea
de a crea servicii pentru a nu îngreuna firul de execuție principal. De asemenea, dezvoltarea aplicației
urmărește ca navigarea de la o activitate la alta sau de la un fragment la altul să fie intuitiva, conform
funcționalităților oferite.
În următoarele subcapitole, vor relata amănunțit modul în care s-au realizat: arihitectura,
implementarea, limbajul și principiile care stau la baza acestui proiect.
2.1 Paradigma programării orientate obiect
Programarea orientată obiect a luat naștere ca un concept nou de programare la începutul anilor
1960. Este o paradigmă bazată pe obiecte, ce conțin atât date cât și metode, aceasta țintește să
încorporeze avantajele codului modularizat și reutilizabil. [1]
În continuare voi explica cele patru principii ale programării orientate pe obiecte:
•Încapsularea – mecanismul prin care ”ascundem” detalii ale implementarii, limitând accesul la
metodelor publice, iar instanțele variabilelor sunt declarate ca fiind private. [2]
•Abstractizarea – procesul în care reprezentările similare, care nu sunt necesare contextului, sunt
ascunse cu scopul de simplifica implementarea. [2]
•Moștenirea – modalitatea prin care un obiect beneficiază de proprietățile și comportamentul
unui alt obiect de tip diferit, dar imbunătățindu-le cu propriile sale însușiri, creând astfel o relție
copil – părinte între cele două. [2]
•Polimorfismul – abilitatea de a crea funcții și refrenția variabile care se comportă diferit în
funcție de contextul oferit de program. [2]
Tehnologiile folosite, în dezvoltarea aplicației, au fost alese având la baza programarea orientată
obiecte pentru a beneficia de însușirile acesteia relate mai sus, fiind motivul principal pentru care am
utilizat ObjectBox pentru crearea bazei de date, fiind un API orientat obiect și NoSQL.
2.2 Limbajul Java
Java este un limbaj de programare cu scop general, bazat pe clase și este orientat obiect; acesta
este proiectat astfel încât să conțină cât mai puține dependințe de implementare pe cât posibil. [3] A fost
6
dezvoltat pe baza principiului WORA – ”write once, run anywhere”, ce permite ca codul Java compilat
al unei aplicații să fie suportat de orice mașină indiferent de sistem de operare, fară a necesita
recompilare.
În momentul dezvoltării acestui limbaj de programare s-a urmărit respactarea principiilor:
1)”Trebuie să fie simplu, orientat-obiect și familiar.”
2)”Trebuie să fie robust și sigur.”
3)”Trebuie se fie neutru din punctul de vedere al arhitecurii și portabil.”
4)”Trebuie să execute cu performanțe ridicate.”
5)”Trebuie să fie interpreat, să permită crearea a mai multe fire de execuție și dinamic.” [4]
Prima variantă a acestui limbaj a fost JDK 1.0, a apărut în 23 Ianuarie 1996, iar ultima sa
versiune este Java SE 13, apărută la data de 17 Septembrie 2019.
Pentru limbajul de programare Java să creeza cod portabil, acesta utilizează Java Virtual
Machine(JVM). Aceasta este o mașină virtuală care permite unui calculator să ruleze aplicații Java la
fel ca și alte programe scrise în alte limbaje, dar care sunt compilate în bytecode Java. [5]
Acest limabaj de programare se ocupă automat de gestionarea memoriei pentru ciclul de viață al
obictelor, programatorul nefiind nevoit să elibereze memoria explicit ca în alte limbaje de programare.
Un alt beneficiu ar fi sintaxa simplă, asemănătoare cu a limbajelor C/C++, fiind cunoscut și utilizat la
nivel mondial.
Datorită multiplelor beneficii aduse de Java, acesta este unul dintre principalele limbaje în care
se dezvoltă aplicațiile Android, alături de Kotlin.
Pentru realizarea acestui proiect s-a folosit Java SE 8 2019.
2.3 Sistemul de operare – Android
Android este un sistem de operare specific telefoanelor mobile sau tabletelor cu touchscreen,
având la baza o versiune modificată de kernel de Linux, unul dintre cele mai mari avanteje fiind faptul
ca este open-source. [6] Acesta este dezvoltat de Google, fapt ce pune la dispoziție o plajă largă de
componente ușor utilizabile și integrabile.
7
2.3.1 Paradigma Android
Sistemul Android implementează ”principiul celui mai mic privilegiu” – fiecare aplicație are
access doar la componentele și informațiile care îi sunt necesare rulării și funcționării. Prin această
modalitate se crează un mediu securizat, iar aplicațiile nu vor putea accesa mai mult decât le este
permis.[7]
Astfel, pentru a putea accesa calendarul unui utilizator cu scopul de a crea un eveniment,
aplicația are nevoie ca utilizatorul să accepte cererea pentru permisiunea: ” WRITE_CALENDAR", în
caz contrar nu se va efectua acțiunea.
2.3.2 Structura unei aplicații Android
O aplicație Android are 4 componente de bază, fiecare având scopuri diferite, bine definite:
•Activitățile – ecrane responsabile de interacțiunea cu utilizatorul.
•Servciile – modalitate prin care o aplicație poate rual ”în spate” fără ca utilizatorul să aibă
aplicația deschisă.
•Receptorii – permite sistemului să fie notificat când anumite evenimente se întâmplă.
•Furnizorii de conținut – livrează date de la o aplicație către altele prin cereri, își pot stoca datele
în baze de date.[8]
Pentru ca sistemul de operare Android să poată deschide oricare dintre componentele meționate
mai sus, acesta trebuie să le cunoască – trebuie declarate în fișierul manifest al aplicației. De asemenea,
aici vor fi menționate și permisiunile de care are nevoie aplicația, nivelul minim de Android API pe
care poate rula, hardware-ul și software-ul utilizat, dar și toate librăriile folosite în întreg proiectul. [9]
Aplicația ”Easy Appointment” utilizează ca nivel pentru Android API 29, iar pentru gestionarea
dependițelor: Android Gradle Plugin Version 3.5.3 și Gradle Version 5.4.1.
2.4 Analiza aplicației
2.4.1 Scopul aplicației
Aplicația Android ”Easy Appointment” dorește sa ușureze modalitatea de a gestiona
programările atât pentru beneficiari cât și pentru frunizorii de servicii, oferind o platforma comună.
Aceasta are ca scop să simplifice acest proces prin activități de căutare pentru clienți, notificări
8
gestionate de Calendar Provider sau accesarea Google Maps direct din detaliile unei programări pentru
a ajunge la locația furnizorului.
2.4.2 Cerințe
Comune celor două tipuri de cont:
•crearea conturilor printr-un cont de Google
•adăugarea de evenimente în calendar prin Calendar Provider, în momentul în care programarea
este acceptată de ambele părți
•existența unei activități ”acasă” care să conțină un meniu lateral din care vor fi accesate diferite
acțiuni specifice fiecarui tip de cont
Din perspectiva clientului:
•separea programărilor astfel: viitoare și istoric
•căutarea unui anumit furnizor sau a unui anumit serviciu
•afișarea furnizorilor pe categorii
•accesarea profilului unui furnizor ce conține detalii de contact și toate serviciile acestuia
•capacitatea de a iniția o programare pentru un anumit furnizor și serviciu doar în perioadele de
timp care sunt disponibile
•notificare când programarea este acceptată de către furnizor
Din perspectiva furnizorului:
•gestionarea programăriolor – acceptare/ anulare
•vizualizarea programărilor în așteptare separat de cele acceptate
•gestionarea serviciilor – stergerea/ editare/ adăugare
•vizualizarea contului unui client
•editarea profilului – detalii pesonale/ program zilnic/ categoria din care face parte
•notificare atunci când o nouă programare se află în așteptare
9
2.4.3 Exemplu de utilizare
Fig. Exemplu de utilizare
2.5 Stocarea Datelor
2.5.1 ObjectBox
ObjectBox este o bază de date rapidă construită special pentru aplicații mobile, care permite
stocarea și procesare datelor de la senzor la server pentru o gestionare fiabilă, rapidă și sigură. [10]
Aceasta oferă un API NoSQL care utilizează cod minimal și ușor de întreținut, rezolvă problemele de
sincronizare și nu necesită conexiune la internet.
ObjectBox este o soluție ”code-first” care ne permite crearea claselor și a relațiilor dintre ele
prin cod, pe baza căruia se va realiza automat baza de date locală. Pentru a atenționa librăria că o clasă
va face parte din baza de date ca și tabel aceasta va fi declarată cu anotarea ”@Entity”, iar pentru
definirea unui câmp ca fiind cheie primară va avea anotarea ”@Id”. Dacă baza de date se va schimba
pe parcursul dezvoltării aplicației, ObjectBox va face actualizările cu minimul de informații necesare
de la programator.
10
Structura Bazei de Date
Fig. Structura Bazei de Date
2.5.2 SharedPreferences
SharedPrefereces este o interfață prin care putem stoca date comune tuturor utilizatorilor. Pentru
a face modicări asupra lor trebuie utilizat un Editor, obiect care are rolul de asigura consistența
valorilor și controlul asupra schimbărilor acestora. [11] Pentru ca datele stocate să fie modificate trebuie
efectuată acțiunea de ”commit” asupra editorului. Unul dintre dezavantajele utilizării acestei clase este
faptul că poate să încetinească foarte mult aplicația.
Una din modalitățile prin care putem vedea datele stocate în acest mod este de a folosi metoda
Context.getSharedPreferences() care va întoarce toate informațiile stocate, sub forma: (cheie, valoare).
Aplicația ”Easy Appointment” utiliezază SharedPreferences cu scopul de a asocia fiecărei
categorii o imagine, astfel: (nume_categorie, id_imagine). Aceastea cor fi afișate în cadrul activitatății
”acasă” pentru conturile clienților.
11
2.6 Interfața grafică
În acest subcapitol, voi prezenta detalii despre interfața grafică a aplicației dar și depsre
experiența utilizatorului, pornind de la componente triviale precum fișierele XML până la componente
complexe precum navigarea în aplicație.
De menționat, este faptul că aplicația poate fi utilizată atât din modul ”portret” cât și din modul
”peisaj” și nu depinde de mărimea ecranului, elementele având o mărime potrivită. De asemenea,
componentele sunt accesibile, armonios așezate și oferă funcționalități intuitive.
2.6.1 Fișierele XML
Extensible Markup Language (XML) este un limbaj de marcare care definește un set de reguli
pentru codificarea documentelor într-un anumit format care permite citirea atât de către om cât și de
mașină.[12]
Acest limbaj a fost creat ca o modalidate simplă și generală, cu suport puternic prin Unicode.
Un fișier XML este un șir de caractere, putând fi găsit aproape orice caracter Unicode. Acesta are în
componența sa: tag-uri, elemente, atribute și o parte de declare.
Acesta simplifică transportul datelor, schimbările de platformă și valabilitatea datelor; nu
conține tag-uri predefinite, autorul fiind responsabil să definească tag-urile, conținutul și structura
fișierului.
Câteva diferențe dintre HTML și XML sunt:
•XML a fost creat să transporte date – se concentrează asupra tipului datelor
•HTML a fost creat să afișeze date – se concentreză asupra modului de vizualizare a datelor
•XML nu conține tag-uri predefinite ca în cazul HTML. [13]
Pentru crearea interfeței grafice, în dezvoltarea aplicațiilor Android, utilizând Android Studio,
se vor folosi fișiere de tip XML. Pentru a ușura dezvoltarea aplicațiilor, Android vine cu o serie de
librării predefinite specifice acestui tip de fișiere. Fiecare activitate și fragment va avea asociat un fișier
XML, dar se pot crea și altele, de exemplu un ”layout” pentru un element dintr-un Adapter.
12
2.6.2 Activități
În cadrul unei aplicații Android, activitățile au rolul de a afișa informația către utilizator, de a
prelua date de la acesta și de a stabile acțiunile ce se vor lua în cazul diferitelor evenimente declanșate
de acesta.
O activitate are asociate două fișiere: unul pentru interfața grafică de tip xml și o clasă Java
pentru definerea acțiunilor ce va extinde clasa AppCompatActivity.
Următoarele rânduri vor descrie activitățile utilizate de aplicația ”Easy Appointment”, în
dezovltarea cărei s-a dorit ca acestea să fie cât mai puține, având mai multe fragmente. Astfel numărul
de activități utilizate este 4, iar numărul de fragmente folosite este 14.
O primă activitate cu care face cunoștiință un utilizator este LoginActivity, aceasta construind
ecranul de înregistrare în aplicație. Aceasta are ca scop crearea unei sesiuni de autentificare bazate pe
un cont Google. La nivelul acesteia se vor prelua datele necesare oferite de către contul Google.
Activitatea va verifica în prealabil dacă contul ales s-a mai înregistrat în cadrul aplicației; dacă da se va
accesa activatea ”acasă”, dacă nu se va accesa activitatea pentru alegerea tipului de cont. Tot
LoginActivity, va gestiona un serviciile pentru trimiterea de notificări, în cazul înregistrării cu succes.
Activitatea ChooseTypeActivity este răspunzătoare pentru alegerea unui tip de cont pentru un
utilizator nou și anume: client sau furnizor. De asemnea, un utilizator nehotărât ce nu mai dorește
crearea contului poate renunța prin apăsarea butonul ”Sign Out”.
CustomizeProviderActivity are ca scop preluarea divereselor detalii specifice unui furnizor prin
încărcarea mai multor fragmente. Navigarea între fragmente este creată cu ajutorul claselor
FragmentManager și FragmentTransaction. La crearea activității, fragmentele vor fi încărcate dar
ascunse, fiind înlocuite la apăsarea butoanelor ”Next” sau ”Back”, ce asigură navigarea
corespunzătoare. În momentul în care toată informația necesară a fost completată se va apăsa butonul
”Submit”, care va crea contul și va adauga actualiza baza de date. Aceste butoane fac parte din
activitate.
Cea mai complexă dintre activități este HomePageActivity care corespunde ecranelor principale
atât pentru client cât și pentru furnizor. Aceasta este creată utilizând Navigation Drawer pentru a crea
meniul lateral și graful de navigare, componentă ce va fi discutată în capitolele ce urmează. În
interiorul acesteia vor fi încărcate toate fragmentele ce fac parte din graful de navigare. Aceasta conține
13
câte un Float Action Button pentru client și furnizor, este răspunzătoare pentru asocierea acțiunilor
pentru acestea.
De asemenea, HomePageActivity este răspunzătoare pentru afișarea opțiunilor corespunzătoare
tipului de cont în meniul lateral și pentru asocierea deschiderii unui fragment fiecărui element. Tot aici
se va implementa acțiunea pentru elementul meniului lateral ”Sign Out”.
2.6.3 Fragmente
Fragmentele sunt porțiuni ale interfeței cu utilizatorul ce trebuie încărcate într-o activitate.
Acestea pot fi gândite ca o secțiune modulară a unei activități, care are propriul ciclu de viață, primește
propriile sale evenimente și poate fi șters sau adăugat în orice moment în care activitaea rulează. [14]
Fragmentele trebuie să fie întotdeauna găzduite de către o activitate; pot fi gestionate fie din cod
prin clasele FragmentManager, FragmentTransaction, din layout prin tag-ul <fragment> sau prin
componenta Navigation.
Un fragment are asociat două fișiere asemănătoare activităților: unul pentru interfața grafică a
acestuia de tip xml și o clasă Java care definește acțiunile specifice acestuia care va extinde clasa
Fragment.
În cadrul aplicației ”Easy Appointment”, fragmentele sunt împărțite în trei pachete, după tipul
contului care le va accesa, astfel: ClientSpecific, Common și ProviderSpecific.
Fragmentele specifice unui client sunt:
•AppointmentHistoryFragment – este responsabil cu afișarea tuturor programărilor din istoric, cu
statusul ”acceptată” și care s-a petrecut deja, de aici un client poate accesa contul unui furnizor
prin apăsarea în interiorul dedicat programării sau poate accesa Google Maps prin accesarea
”Get Directions”.
•FutureAppointmentsFragment – va afișa o listă cu programările viitoare, indiferent de status,
”acceptată” sau ”în așteptare”, în plus față de fragmentul precedent va avea butonul ”Cancel”,
responsabil cu anularea programării respective.
•ShowProvidersFragment – va prezenta o listă de furnizori, de unde va putea fi accesat profilul
acestora, acesta va fi utilizat atât pentru căutare cât șin pentru afișarea pe categorii.
•ProviderProfileFragment – va fi responsabil cu afișarea detaliilor profilului unui furnizor; este
format din două părți: detalii furnizor (poză de profil nume, detalii de contact și adresă) și
14
detalii servicii (listă cu serviciile furnizorului și posibilitatea de a face o programare prin
butnoul ”New”).
•NewAppointmentFragment – afișează un formular ce conține un calendar pentru alegerea datei,
un selector pentru alegerea orei și un buton ”Book” care va accesa fragmentul
FutureAppointmentsFragment și va crea noua programare în cazul în care datele sunt valide.
Fragmentele comune celor două conturi sunt:
•HomeFragment – responsabil cu încărcarea ecranelor ”acasă” atât pentru client cât și pentru
furnizor: afișarea categoriilor din care pot face parte furnizorii, respectiv afișarea programărilor
acceptate de către un furnizor.
•SignOutFragment – conține un singur buton cu acțiune ce are ca scop deconectarea din cont; va
fi folosit în diverse activități precum: ChooseTypeActivity sau CustomizeProviderActivity .
Fragmentele specifice unui furnizor sunt:
•AddServiceFragment – va afișa un formular, va prelua datele din acesta la apăsare un butonului
”Submit” și va crea un nou serviciu asociat furnizorului cu toate detalii necesare; utilizat atât la
crearea contului unui furnizor dar și din Float Button Action de câte ori va fi nevoie de un nou
serviciu.
•ClientProfileFragment – va prezenta profilul unui client, din perspectiva unui furnizor, va
conține poza de profil, numele și adresa email ale clientului.
•PendingAppointmentsFragment – este responsabil cu afișarea tutoror programărilor cu statusul
”în așteptare”; de aici un furnizor va putea să accepte sau să anuleze o astfel de programare prin
intermediul butoanelor ”Accept” și ”Cancel”, de aici poate accesa profilurile clienților cu care
are fiecare programare.
•PersonalDetailsFragment – creează un fomular pentru completarea detaliilor personale (număr
de telefon și adresă), va modifica din baza de date la apăsarea butonului ”Submit”; este utilizat
atât la completarea detalii pentru un cont nou de furnizor, dar și pentru editarea detaliilor
actuale, caz în care acestea vor fi afișate în câmpurile prezente.
15
•ProviderSetScheduleFragment – afișează un formular pentru completarea orelor de lucru pentru
fiecare zi a săptămânii, la apăsarea butonului ”Submit” va prelua datele și va popula
corespunzător baza de date; este utilizat atât la crea unui cont de furnizor, dar și atunci când
acesta va dori să modifice informațiile existente în baza de date.
•SelectCategoryFragment – permite alegerea unei categorii de către un furnizor, conține un
selector predefinit de tipul ”Dropdown”, ce va conține categoriile existente în baza de date,
modificarea se va face la apăsarea butonului ”Submit”.
•ServicesFragment – este fragmentul responsabil cu afișarea listelor de servicii specifice unui
anumit furnizor; în funcție de activitatea sau fragmentul care le gazduiește fiecare serviciu poate
avea asociat diverse butoane precum: ”Edit” ce va permite modificarea datelor existente,
”Submit” ce va trimite modificările către baza de date, ”Delete” va șterge un anumit serviciu și
”New” este specfic unui client, va apărea doar în cazul afișării listei serviciilor în interiorul
profilului unui furnizor, din perspectiva clientului și va fi responsabil cu crearea ueni
programări noi.
După cum s-a putut observa în prezentarea de mai sus a fragmentelor utilizate în dezvoltarea
acestui proiect, unul dintre cele mai mari beneficii a utilizării lor este reutilizarea codului prin
capacitatea lor de a fi încărcate atât în interiorul unei activități cât și în interiorul altui fragment gazdă.
2.6.4 RecyclerView și Adapter
RecyclerView este o modalitate de a afișa o listă de elemente care pot fi ”scroll-ate” și fac parte
din seturi de date mari care se schimbă frecvent. [15] Acesta este un widget avansat și flexibil care se
folosește de diferite componente pentru a afișa datele dorite. Unul dintre aceste componente este
Adapter, care are ca scop încarcare cu elemente RecyclerView-ului.
Adapter este un obiect care se comportă ca o legătură între interfața grafică și date astfel: crează
o modalitate de vizualizare pentru fiecare element din RecyclerView și oferă access asupra datelor. [16]
Aplicația ”Easy Appointment” utilizează aceste modalități în afișarea listelor de furnizori,
servicii și programări, fiecare având anumite particularități specifice funcționalităților dorite.
Următoarele secțiuni vor prezenta detaliat fiecare Adapter utilizat de aplicație, din punctul de
vedere al vizualizării, dar și al funcționalităților oferite.
16
2.6.4.1 Furnizori
Pentru afișarea mai multor furnizori în cadrul aplicație am utilizat
cele două componente descrise mai sus: atât penru rezultatele căutarii cât și
pentru afișarea lor în funcție de categoria din care fac parte. Astfel, am
uilizat același Adapter, ListProvidersAdapter, în mai multe componente
RecycleView care aparțin de fragmente diferite.
Aceasta clasă va crea câte o afișare pentru fiecare furnizor
conținând poza profilului, numele și categoria din care face parte. De
asemenea, dacă accesăm unul dintre elementele din RecyclerView se va
deschide fragmnetul ce conține profilul furnizorului respectiv.
În figura alăturată, este facută o captură de ecran în cazul afișării
furnizorilor pe categorii, și anume – ”Women’ s Beauty Salon”.
Fig. RecyclerView & Adapter – Furnizori
2.6.4.2 Servicii
În cazul serviciilor, am utilizat un Adapter, ListServicesAdapter,
care va crea o vizualizare specifică fiecărui serviciu. Acesta va fi utilizat în
mai multe contexte, de exemplu: în fragmentul Services, accesat din meniul
lateral al unui cont de furnizor, în care se dorește ca un serviciu să poată fi
editat sau șters ca în figura alăturată.
De asemenea, acesta va fi utilizat și în crearea fragmentului pentru
vizualizarea profilului unui furnizor din perspectiva unui client, unde vor fi
afișate toate serviciile pe care acesta le oferă. Aici, butoanele de Edit/
Delete vor fi înlocuite cu un singur buton New care acceseaza un fragment
pentru crearea unei programări.
O altă utilizare, este cea în care rezultatele căutării din fragmentul
Search vor fi servicii.
Fig. RecyclerView & Adapter – Servicii
17
2.6.4.3 Programări
Pentru afișarea programărilor, am folosit un Adapter,
ListAppointmentsAdapter, care crează o vizualizare pentru fiecare
programare, oferind detalii despre aceasta precum: numele serviciului,
numele clientului sau al frunizorului, după caz, statusul (acceptată sau în
așteptare), data și ora la care va avea loc, dar și butoane precum: Cancel
sau Accept pentru a anula sau a accepta o programare.
Imaginea alăturată reprezintă un fragment ce conține toate
progrmările acceptate din perspectiva furnizorului. Acesta dacă va atinge
ecranul în dreptul unei programări, va fi dus către profilul clientului care a
inițiat programarea. Acest Adapter va fi folosit în toate fragmentele ce
necesită afișarea mai multor programări precum: istoric, programări
viitoare sau în așteptare.
Fig. RecyclerView & Adapter – Programări
2.6.5 Picasso
Android Picasso este o librărie pentru încarcare și procesare de imagini dezvoltată, întreținută
de Square Inc.[17] Aceasta este ușor de folosit, API-ul având o sintaxă simplă, oferind o mulțime de
transformări și filtre disponibile printr-o singură linie de cod.
Una dintre cele mai dese utilizări ale acestei librării este încărcarea de imagini din diferite surse
precum: URL sau resursă locală.
Aplicația ”Easy Appointment” folosește funcționalitățile acestei librării pentru a încărca pozele
de profil, indifrent de activitate sau fragment astfel: în momentul înregstrării în contul Google, aplicația
va prelua numele, email și URL-ul pozei de profil specifice contului și le va stoca în baza de date; iar
librăria Picasso intervine pentru încarcarea prin URL a acestor imagini de fiecare dată când este nevoie.
Astfel, sunt afișate imaginile din cadrul umătoarelor fragmente sau activități: în meniul latera al
profilului actual, profilul unui client sau al unui furnizor, în rezultatele căutării unui furnizor sau în lista
furnizorilor afișați după categorie.
18
2.6.6 Navigation
Prin navigare înțelegem modalitatea prin care un utilizator trece de la o activitate la alta sau de
la un fragment la altul, având capacitatea de a se întoarce la ecranul precendent. Pentru a implementa
acest lucru, Android oferă ca soluție componenta Navigation care asigură utilizatorului o experință
consistentă și previzibilă.
Componenta Navigation se bazează pe crearea unui graf de navigare, care conține un fragment
de start, fixat și toate destinațiile posibile, reținând modul în care se ajunge la fiecare. În plus, acest graf
va conține detalii despre animațiile și tranzițiile dintre fragmente sau despre argumentele transmise. De
obicei, există o activitate ”acasa” ce se numește gazda grafului de navigare; în interiorul acesteia, vor fi
înlocuite diferite fragmente.
Pentru a facilita navigarea de la un fragment la altul, componenta Navigation utilizează
Navigation Controller, clasă care se ocupă de gestionarea fragmentelor. Acesta reține structura grafului
de navigare, stiva destinațiilor și are metode specifice pentru a naviga către o anumită destinație sau
pentru a modifica structura acestuia. Acesta gestionează și întoarcea la fragmentele precedente prin
stiva destinațiilor.
Componenta Navigation oferă multiple beneficii dezvoltatorului aplicației, acesta nefiind nevoit
să se ocupe de tranzacțiile dintre fragmente sau de modul în care se face parcurgerea activităților
”înainte” sau ”înapoi”. În plus, aceasta ne furnizează resurse standardizate pentru crearea de animații și
tranziții sau modele de navigare precum Navigation Drawer.
Navigation Drawer este un model de navigare predefinit în cadrul Android Studio care ne
creează o activitate ”acasă” cu un meniu lateral customizabil, care apare la atingerea unui buton și
dispare odată ce este aleasă o opțiune din meniu. În interiorul acesteia se vor încărca diferite fragmente
accesate prin opțiunile din meniu sau prin diferite acțiuni din interiorul acestora. Navigation Drawer
conține și un Float Action Button, opțional, prezent în activitate indiferent de fragmentul conținut de
gazdă.
Această activitate predefinită a fost implementată și în cadrul aplicației ”Easy Appointment”,
creând ecranul ”acasă” atât pentru client cât și pentru furnizor, împreună cu meniul lateral. De
asemenea, au fost adăugate diferite fragmente schimbând opțiunile meniului, dar și adăugând acțiune
pe Float Action Button în funcție de tipul contului și de proprietățile dorite.
19
2.6.6.1 Principii
Componenta Navigation este construită pe baza a mai multor principii ce au rolul de a
îmbunătăți exepriența utilizatorului, acestea fiind:
•Destinația de start este fixată.
•Starea de navigare este reprezentată ca o stivă de destinații. Astfel, starea curentă se alfă la
vârful stivei, iar la începutul stivei se alfă acitivitatea de bază (în cazul aplicației ”Easy
Appointment” fragmentul ”acasă”), utilizatorul putând astfel să parcurgă înapoi, pâna la
destinația de start, toate fragmentele prin care a trecut pentru a ajunge la starea curentă.
•Butonul ”înapoi” din bara aplicației este identic cu cel al dispozitivului ca funcționalitate în
interiorul task-ului aplicației pentru a putea parcurge stiva de destinații.
•Butonul ”înapoi” din bara aplicației nu poate să iasă din aplicație, aceasta poate ajunge doar
până la începutul stivei – destinația de bază.
•Legătura în adâncime simulează navigarea manuală. În cazul apăsării butonului ”Home” al
dispozitivului, urmată de accesarea aplicației, sistemul va fi capabil să recreeze stiva de
destinații a aplicației.
20
2.6.6.2 Graful de navigare al aplicației
Fig. Graful de navigare pentru client
Pentru a simplifica ințelegerea imaginii de mai sus voi oferi urmatoarele detalii:
•din orice fragment se poate ajunge în fragmentul destinat căutării printr-un Float Action Button
prezent în toate destinațiile grafului de navigare
•din fragmentul ”acasa” pot fi accesate cele patru fragmente corespunzătoare fiecărei categorii
din care pot face parte furnizorii
•rezultatele unei căutări pot fi atât furnizori cât și servicii de acceea puteam ajunge într-un profil
al unui furnizor sau direct în fragmentul destinat unei noi programări
•fragmentele Programări Viitoare și Istoricul Programărilor vor fi accesate din meniul lateral
•când o programare este inițiată vom ajunge la fragmentul Programări Viitoare
21
Fig. Graful de navigare pentru furnizor
Pentru a explica informațiile găsite în imaginea de mai sus voi oferi umătoarele detalii:
•din orice fragment se poate ajunge la fragmentul Adăugare Serviciu, printr-un Float Action
Button prezent în toate destinațiile grafului de navigare
•activitatea acasă doar va afișa programările acceptate, acestea putând fi anulate și putem accesa
profilul unui client la fel ca în cazul Programărilor în așteptare, prin atingerea numelui
clientului
•fragmentele: Editare detalii personale, Programări în așteptare, Servcii, Schimbă categoria,
Editează programul sunt accesate din meniul lateral
22
2.6.7 GridLayout
GridLayout este o componentă de afișare asemănătoare cu RecyclerView, care imbracă
elementele sale sub forma unei matrici, cu numar specificat de linii și de coloane. Contrar modului de
utlizarea al RecyclerView, GridLayout va putea fi populat elemente atât prin cod, dar și prin fișierul
XML ce îl conține.
Prin cod elementele sale vor fi adăugate, prin parcurgerea celulelor din GridLayout și prin
apelarea metodei addView(elem), care va adauga în interiorul unei celule vizualizarea lui elem. Fiecare
celulă are parametrii săi proprii pentru definarea modului de afișare; aceștia sunt de tipul
GridLayout.LayoutParams.
Clasa GridLayout extinde clasa ViewGroup, fapt care îl face să se comporte asemănător, de
exemplu GridLayout poate conține text, imagini, butoane dar poate fi de asemenea gazda unui
fragment.
Am utilizat această modalitate de afișare pentru capacitatea sa de crea o matrice cu număr
variabil de rănduri și coloane, propritățile RecyclerView fiind insuficiente în acest caz.
Astfel, pentru crearea ecranului ”acasă” în cazul unui cont de client, am folosit GridLayout
pentru afișarea tuturor categoriilor din care pot face parte furnizorii. Fiecare celulă are asociată o
imagine sugestivă și o acțiune la atingere ce va accesa un fragment care va afișa toți furnizorii din
categoria respectivă.
Pentru a realiza ecranul ”acasă” având aceste proprietăți am efectuat următorii pași:
•în fișierul XML al fragmentului adăugăm GridLayout și îi asociem un id
•în clasa Java a fragmentului, preluăm prin id GridLayout-ul adăugta la pasul precedent
•preluăm din baza de date categoriile și din SharedPreferences preluăm id-urile imaginilor
specifice fiecărei categorii
•calculăm și setăm numărul de linii și de coloane
•parcurgem celule din GridLayout, setăm ca text numele categoriei cu imaginea asociată
•fiecare imagine va avea asociată acțiunea pentru deschidere fragmentului ce conține lista de
furnizorilor din categoria respectivă.
23
2.7 Google API
2.7.1 Google Sign in
Aplicația ”Easy Appointment” integrează înregistrarea cu un cont Google, pentru a facilita
utilizarea calendarului acestuia. Mai exact utilizează GoogleSignInOptions și GoogleSignIn pentru a
obține informațiile contului precum: nume, email și imagine de profil, ce vor fi reținute în baza de date
a aplicației.
Acestă funcționalitate este implementată în cadrul activității ”login”, fiind și activitatea de star a
aplicației, care are ca scop accesarea unui cont existent sau crearea unui cont nou în cadrul aplicației,
începând o sesiune de autentificare.
De asemenea, dacă este un cont înregistrat în cadrul aplicației se va deschide aplicația cu
ecranul ”acasă” ce va dispune de un meniu lateral creat prin Navigation Drawer. Bara acestui meniu va
conține detalii despre sesiunea curentă de autentificare: poza de profil, nume și email, corespunzătoare
contului de Google asociat.
Pentru ca înregistrarea cu un cont Google să fie completă, este implementat și un buton de
”Sign Out” prin care părasim sesiunea de autentifcare. Acesta este prezent ca ultimă opțiune în cadrul
meniului, dar și în activitățile și fragmentele specifice creării unui cont de furnizor.
2.7.2 Calendar Provider
Calendar Provider este un API care permite gestionarea calendarelor și a evenimentelor deținute
de un cont Google. Pentru a putea accesa sau modifica aceste informații, trebuie adăugate permisiuni
specifice în cadrul manifestului aplicației.
În cadrul acestui proiect, am utilizat crearea de evenimente asociate unei programări atât pentru
client cât și pentru furnizor, pentru a utiliza diversele beneficii oferite precum: accesarea evenimentelor
din calendar de pe orice dispozitiv prin înregistrarea cu contul de Google asociat, crearea de notificări
customizabile și integrarea cu diverse calendare ce aparțin de conturi diferite.
Un eveniment este adaugat, automat, în momentul în care un furnizor acceptă o programare;
această modificare va avea loc atât asupra calendarului unui client cât și a unui furnizor. Evenimentul
astfel creat va conține informații privind numele serviciului, partea opusă cu care are loc programarea,
locația, data și ora.
24
Pentru a beneficia de această funcționalitate utilizatorul trebuie să accepte cererea de permisiune
pentru scriere a calendarului, primită în momentul în care deschide prima dată aplicația după crearea
contului. În caz contrar, evenimentele nu vor fi adăugate în calendar, dar se va putea bucura de celelalte
funcționalități ale aplicației.
2.7.3 Google Pay
2.8 Serviciile pentru trimiterea notificărilor
Un serviciu este o componentă a aplicației care poate rula pe o perioadă lungă ”în spate”, acesta
nu are o interfață grafică și funcționează indiferent de aplicația în care se află utilizatorul până când
aceasta va fi oprită forțat. [18]
În acest proiect, am utilizat două servicii cu scopul de a trimite notificări: unul pentru furnizor
care verifică dacă a apărut o nouă programare ”în așteptare”, caz în care furnizorul va primi o notificare
și unul care verifică dacă statusul unei programări s-a schimbat din ”în așteptare” în ”acceptată”, caz în
care clientul va primi o notificare.
În ambele cazuri serviciile rulează o dată la cinci minute pentru a face verificările necesare. Ele
sunt create la începerea unei sesiuni de autentificare, în funcție de tipul contului: va fi aciv un singur
serviciu specific furnizorului sau clientului. Acestea sunt omorâte odată cu aplicația sau în momentul în
care se încheie o sesiune de autentificare.
Notificările trimise deschid aplicația la activitatea ”acasă”, iar în funcție de serviciul care le-a
trimis va alege fragmentul conținut astfel: în cazul serviciului asociat unui cont de furnizor va încărca
fragmentul ce conține programările în așteptare, iar în cazul serviciului asociat unui cont de client va
încărca fragmentul de conține programările viitoare specifice acestuia.
25
3 FUNCȚIONALITĂȚILE APLICAȚIEI
3.1 Înregistrarea în aplicație și crearea contului
Fig. Ecranul de înregistrare Fig. Ecranul pentru alegerea contului
Pentru ca un utilizator nou să se poată înregistra în aplicația ”Easy Appointment” este necesar
ca în prealabil să dețină un cont Google, accesat prin butonul ”Sign in”. După accesarea unei astfel de
sesiuni de autentificare, acesta își va alege tipul contului: Client sau Provider (furnizor), având
posibilitatea să renunțe la înregistrare prin butonul ”Sign Out”, fară a se fi creat contul. Aceste două
ecrane sunt reprezentate în figurile de mai sus.
Dacă se va alege primul tip atunci se va accesa direct activitatea ”acasă” a aplicației, contul
fiind astfel creat.
În cazul în care un utilizator are un cont Google asociat aplicației, acesta va accesa butonul
”Sign In” prezen în ecranul de înregistrare, își va alege contul respectiv din lista de conturi Google
disponibile și va trimis către activitaea acasă specifică contului său.
Următoarele imagini reprezintă fromularul pe care un furnizor trebuie să îl completeze pentru a-
și putea crea contul. Acestea sunt afișate în ordinea accesului din aplicație.
26
Fig. Editare detalii personale Fig. Alegere categorie Fig. Editare program zilnic
În cazul alegerii celei de a doua opțiuni, și anume Provider, atunci
acesta va fi nevoit să completeze un formular cu informații corespunzătoare
depsre: detaliile personale, categoria din care dorește să facă parte,
programul său de lucru pe zile și să își creeze un prim serviciu.
Odată completate aceste informații și acționat butonul ”Submit”,
contul său va fi creat și se va accesa activitatea ”acasă” specifică unui
furnizor. Din acest moment, el va putea fi contact de orice client
Pentru crearea logicii și navigării între fragmente pentru crearea
acestui formular, am utilizat FragmentManager și FragmentTransaction.
Acestea au fost încărcate o dată la crearea activității, ascunse și vor apărea
pe rând succesiv. Astfel, la aceesarea butonul ”Back”, se va afișa informația
completată anterior.
Fig. Adăugare serviciu
În următoarele subcapitole, voi prezenta fucționalitățile caracteristice fiecărui tip de cont
pornind de la ecranul ”acasă”.
27
3.2 Perspectiva clientului
3.2.1 Ecranul principal
În figura alăturată este prezentat ecranul principal pentru contul
unui client. Putem observa că acesta conține cele patru categorii din care
fac parte furnizorii, accesând una dintre acestea, el va putea vizualiza toți
furnizorii ce fac parte din această categorie.
Pentru crearea acestui ecran, a fost utilizat GridLayout cu scopul
de a-l împărți într-o matrice de două linii cu două coloane.
De asemenea, este prezent un Float Button Action care ne va
trimite către un fragment pentru căutarea de servicii și furnizori, iar prin
butonul din partea din stânga sus, va fi accesat meniul lateral. Opțiunile
acestuia au ca scop gestionarea programărilor și va fi prezentat ulterior.
Fig. Ecran ”acasă” client
3.2.2 Pașii pentru a iniția o programare
Un client poate iniția o programare prin două modalități: fie va căuta un serviciu sau numele
unui furnizor sau va accesa una dintre categoriile prezente în ecranul ”acasă”, mai apoi va accesa
profilul acestuia. În următoarele imagini voi exemplifica prima modalitate, parcurgând următorii pași:
a)accesăm Float Action Button prezent în orice ecran ce ne va trimite la un fragment pentru
căutarea unui furnizor sau a unui serviciucăutăm numele unui furnizor și apăsăm pe butonul
”Search”
b)accesăm un profil prin alegerea unui furnizor din lista rezultatelor
c)alegem un serviciu și apăsăm pe butonul ”New” pentru a crea o nouă programare
d)alegem ziua în care dorim programarea și ora (o să fie afișate doar orele la care un furnizorul va
fi disponibil în ziua respectivă) și apăasăm pe butonul ”Book”
e)programarea va fi trimisă către furnizor, clientul va aștepta să fie acceptată sau anulată
28
Fig. Căutare furnizor Fig. Profil furnizor Fig. Programare nouă
În prima figură putem observa bara și butonul de căutare. Rezultatele căutarii, în acest caz, sunt
mai multe conturi de furnizori, fiecare fiind reprezentat prin poza de profil, nume și categoria din care
face parte.
În urma alegerii unui furnizor utilizatorul va fi trimis către profilul acestuia care conține de
asemenea poza de profil, nume, detalii personale (sunt făcute vizibile prin apăsarea ”Show details”, dar
și o listă cu servicii. Fiecare dintre aceste servicii va avea asociat un buton ”New” pentru crearea unei
noi programări.
Ultima figura reprezintă fragmentul asociat pentru crearea unei noi programări, în urma
alegerilor descrise mai sus. Aici rămâne de ales o dată din calendarul afișat și o oră. Perioadele de timp
afișate sunt doar acelea în care furnizorul va fi disponibil, calculate în funcție de durata serviciului ales.
Atunci când va fi apăsat butonul ”Book”, programarea va fi creată cu statusul ”în așteptare”, fiind
necesar un răspuns de la furnizor pentru a fi acceptată.
De menționat este faptul că punctele a) și b) po fi înlocuite astfelȘ accesăm una din categoriile
afișate pe ecranul principal, de exemplu: ”Women’ s Beauty Salon” și vom fi direcționați către o listă de
furnizor ce fac parte din această categorie. Restul pașilor rămân la fel.
29
3.2.3 Gestionarea și vizulizarea programărilor
Fig. Meniu lateral client Fig. Istoric programări Fig. Programări viitoare
Gestionarea programărilor se face prin accesarea din meniul lateral a celor două fragmente
specifice: Istoricul programărlor și Programări Viitoare, reprezentate în figurile de mai sus.
În fragmentul Istoricul programărilor, vor putea fi vizualizate toate programările trecute care au
fost acceptate de furnizor. Aici vom găsi detalii despre serviciul de care clientul a beneficiat, furnizor,
locație, ora și data la care a avut loc programarea.
Fragmentul Programări viitoare are ca scop atât vizualizarea cât și gestionarea programărilor
conținând detalii despre: serviciu, furnizor, locație, status, dată și oră. De asemenea, din cadrul acestui
fragment, clientul are posibilitatea de a anula o programare indiferent de statusul acesteia.
Dacă clientul v-a accesa ”Get Directions” acesta va fi redirecționat către Google Maps a cărui
hartă va conține adresa furnizorului specific fiecărei programări.
Dacă v-a apăsa în interiorul afișării unei programări, se va deschide profilul furnizorului,
prezentat anterior.
30
3.3 Perspectiva furnizorului
3.3.1 Ecranul principal
În figura alăturată este prezentat ecranul principal, acesta se va
deschide atunci când un furnizor își va accesa contul. Se poate observa
faptul că ecranul conține informații despre programările acceptate.
Pentru fiecare dintre programările afișate, acesta va putea să le
anuleze, iar acestea conțin informații despre serviciu, client data și oră.
Dacă va fi accesat numele unui client sau programarea, frunizorul va putea
vizualiza profilul unui client.
Acest ecran mai conține un Float Action Button prezent în toate
fragmentele specifice unui furnizor cu scopul de a accesa ecranul specific
pentru adăugarea unui serviciu. De asemenea, prin accesarea butonului din
colțul stânga, sus, se va deschide meniul lateral cu diferite opțiuni.
Fig. Ecran "acasă” furnizor
3.3.2 Gestionare profilului
Prin gestionarea profului unui frunizor putem înțelege modificarea
informației actuale sau adăugarea de servicii noi, asociate contului
acestuia, dar care nu implică informație comună cu un alt cont
(programări).
Pentru ca un furnizor să își poată gestiona profilul, aplicația vine
cu multiple fragmente accesibile din meniul lateral (figura alăturată) sau
prin accesarea Float Button Action.
În imaginile următoarea vor fi descrise acțiunile posibile în cadrul
aplicației precum: gestionarea serviciilor, vizualizare meniului lateral și a
opțiunilor posibile, editarea detalii personale, schimbarea categoriei din
care face parte sau editarea programului de lucru zilnic.
Fig. Meniu lateral furnizor
31
Fig. Editare detalii personale Fig. Vizualizare și editare servicii Fig. Schimbare categorie
Fig. Editare program de lucru Fig. Adăgare serviciu
În cadrul fragmentul ce au ca scop modificarea datelor existente, se poate observa că câmpurile
sunt completate cu informațiile actuale pentru a ușura editarea.
Fragmentul destinat vizualizării și modificării serviciilor conține toate informațiile fiecăruia
împreună cu butoanele pentru editare și ștergere pentru fiecare serviciu.
32
3.3.3. Gestionarea și vizualizarea programărilor
În acest subcapitol, voi prezenta detaliat cum un furnizor își poate gestiona și vizualiza
programările în cadrul aplicației. Acesta are la dispoziție două fragmente: unul specific programărilor
acceptate și unul pentru cele în așteptare.
Fig. Programări acceptate Fig. Programări în așteptare Fig. Profil client
Prima figura reprezintă fragmentul destinat progrmărilor acceptate și al ecranului principal
pentru un furnizor, iar cea de a doua figură reprezintă fragmentul asociat programărilor în așteptare.
Acestea au câteva elemente comune, fiind folosit același Adapter pentru crearea vizulizărilor lor.
În primul rând, în ambele cazuri, vom putea regăsi: numele serviciului, numele clientului,
butonul de anulare, data și ora. De asemenea prin apăsare pe câmpul unei programări, furnizorul va
putea accesa profilul unui client.
În plus, fragmentul specific programărilor în așteptare conține butonul pentru acceptare a unei
programări, dar și statusul acesteia.
Un furnizor nu va putea iniția programări ci doar să le accepte sau să le anuleze, după ce au fost
inițiate de către un client. De asemenea, acesta va primi o notificare atunci când se va face o nouă
programare.
33
3.4 Perspectiva programatorului
În cadrul aplicației ”Easy Appointment”, programatorul îndeplinește diverse roluri. Acesta se va
ocupa cu administrarea bazei de date și va fi responsabil cu gestionarea categoriilor specifice
furnizorilor. Pentru a face acestui lucru acesta va trebui să aibă cunoștiințe depsre limbajul Java, despre
modul de lucru în cazul programării orientate pe obiecte și despre dezvoltarea aplicațiilor utilizând
Android Studio.
Pentru a putea gestioana baza de date, programatorul va trebui sa cunoască structura acesteia
dar și API-ul utlizat în dezvoltarea aplicației, ObjectBox, detaliate în capitolul 2.
De asemenea, acesta trebuie să se ocupe de mentența codului sau eventualele modificări impuse
de viitoarele depricări și schimbări de sintaxă ale versiunilor de API utilizate. Pentru a ușura munca
acestuia, proiectul conține comentarii sugestive și este împărțit în cinci pachete principale: Activities,
BackgroundServices, Fragments, GoogleApi și data, împărțite la rândul lor în subpachete.
Un alt rol pe care programatorul va trebui să și-l asume este cel de a actualiza vizualizările
asociate activităților și fragmentelor, pentru a fi în concordanță cu cerințele utilizatorilor și cu logica
creată prin cod. Pentru a face acest lucru, el va trebui să fie familiar cu fișierele de tip XML și cu
librăriile specifice Android.
Pentru a facilita înțelegerea codului de către alte persoane, programatorul are obligația să lase
comentarii sugestive și să scrie cod modularizat respectând modul de spațiere și aranjare în pagină
precedente.
Tehnologiile și librăriile folosite în dezvoltarea aplicației sunt detaliate în acest document în
capitolul 2, dar pentru informații amănunțite sau neclarități, pot fi accesate documențiile originale prin
accesarea referințelor din capitolul 6 Biblografie.
34
4 CONCLUZII
Prin modul de dezvoltare a aplicației ”Easy Appointment”, dar și prin tehnologiile alese, aceasta
oferă diverse beneficii cum ar fi:
•Rapiditate – accesul la baza de date se face utilizând ObjectBox ce oferă utilizatorului o
experiență de 10 ori mai rapidă
•Puțin spațiu de memorie utilizat – apoximativ 50MB
•Siguranță și Accesibilitate – utilizarea sesiunii de autentificare Google și preluarea informațiilor
necesare creării contului
•Automatizare – crearea de evenimente prin Calendar Provider în momentul în care programarea
a fost acceptată, atât pentru client cît și pentru furnizor
•Interfață grafică intuitivă și placută– existența meniului lateral, posibilitatea de a căuta un
furnizor sau serviciu, existența unui istoric al programărilor unui client și posibilitatea unui
client de a accesa Google Maps direct din aplicație pentru a vizualiza pe hartă adresa
furnizorului, pentru orice programare
•Navigarea logică între activități și fragmente – componenta Navigation și graful de navigare
Comparativ cu alte aplicații disponible la momentul actual, acest proiect oferă în plus o gamă
largă de categorii din care pot face parte furnizorii, care se poate extinde, dar și o modalitate simplă
pentru gestionarea programărilor.
35
5 Listă de Figuri
Exemplu de utilizare …………………………………………………………………………………………………………………. 9
Structura Bazei de Date ……………………………………………………………………………………………………………. 10
RecyclerView & Adapter – Furnizori …………………………………………………………………………………………. 11
RecyclerView & Adapter – Servicii ……………………………………………………………………………………………. 12
RecyclerView & Adapter – Programări ………………………………………………………………………………………. 12
Graful de navigare pentru client ………………………………………………………………………………………………… 15
Graful de navigare pentru furnizor …………………………………………………………………………………………….. 16
Ecranul pentru alegerea contului ……………………………………………………………………………………………….. 19
Ecranul de înregistrare …………………………………………………………………………………………………………….. 19
Editare detalii personale …………………………………………………………………………………………………………… 20
Alegere categorie……………………………………………………………………………………………………………………. 20
Editare program zilnic ……………………………………………………………………………………………………………… 20
Adăugare serviciu…………………………………………………………………………………………………………………… 20
Ecran ”acasă” client ………………………………………………………………………………………………………………… 21
Căutare furnizor……………………………………………………………………………………………………………………… 22
Profil furnizor…………………………………………………………………………………………………………………………. 22
Programare nouă…………………………………………………………………………………………………………………….. 22
Meniu lateral client …………………………………………………………………………………………………………………. 23
Istoric programări……………………………………………………………………………………………………………………. 23
Programări viitoare …………………………………………………………………………………………………………………. 23
Ecran "acasă” furnizor …………………………………………………………………………………………………………….. 24
Meniu lateral furnizor ……………………………………………………………………………………………………………… 24
Editare detalii personale …………………………………………………………………………………………………………… 25
Vizualziare și editare servicii ……………………………………………………………………………………………………. 25
Schimbare categorie ………………………………………………………………………………………………………………… 25
Editare program de lucru ………………………………………………………………………………………………………….. 25
Adăgare serviciu…………………………………………………………………………………………………………………….. 25
Programări acceptate ……………………………………………………………………………………………………………….. 26
Programări în așteptare ……………………………………………………………………………………………………………. 26
36
6 Bibliografie
1: Tutorials Point India Limited, OOAD – Object Oriented Paradigm, 2020, Martie,
https://www.tutorialspoint.com/object_oriented_analysis_design/ooad_object_oriented_paradigm.htm
2: Lokesh Gupta, Java OOPs Concepts – Object Oriented Principles, 2020, Martie,
https://howtodoinjava.com/oops/object-oriented-principles/
3: Wikipedia, Java, 2020, Martie, https://en.wikipedia.org/wiki/Java_(programming_language)
4: Wikipedia, Principiile Java, 2020, Martie,
https://en.wikipedia.org/wiki/Java_(programming_language)
5: Wikipedia, JVM, 2020, Martie, https://en.wikipedia.org/wiki/Java_virtual_machine
6: Wikipedia, https://en.wikipedia.org/wiki/Android_(operating_system), 2020, Martie,
https://en.wikipedia.org/wiki/Android_(operating_system)
7: Google Developers, Principiul celui mai mic privilegiue, 2020, Martie
8: Tutorials Point India Limited, Furnizor de conținut, 2020, Martie,
https://www.tutorialspoint.com/android/android_content_providers.htm
9: Google Developers, The manifest file, 2020, Martie,
https://developer.android.com/guide/components/fundamentals#Manifest
10: ObjectBox Limited, ObjectBox, 2020, Martie, https://objectbox.io/
11: Google Developers, SharedPreferences, 2020, Martie,
https://developer.android.com/reference/android/content/SharedPreferences
12: Wikipedia, XML, 2020, Martie, https://en.wikipedia.org/wiki/XML
13: WWW3 School, The Difference Between XML and HTML, 2020, Martie,
https://www.w3schools.com/xml/xml_whatis.asp
14: Google Developers, Fragment, 2020, Martie,
https://developer.android.com/guide/components/fragments
15: Google Developers, RecyclerView, 2020, Martie,
https://developer.android.com/guide/topics/ui/layout/recyclerview
16: Google Developers, , 2020, Martie,
https://developer.android.com/reference/android/widget/Adapter
17: JournalDev, Android Picasso, 2020, Martie, https://www.journaldev.com/13759/android-picasso-
tutorial
18: Google Developers, Servicii, 2020, Martie,
https://developer.android.com/guide/components/services
37
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicație mobilă pentru gestionarea programărilor Coordonator științific: Conf.dr. Alin Ștefănescu Absolvent: Sandu Daniela Teodora BUCURESTI 2020 1… [613648] (ID: 613648)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
