Șef Lucr.Dr.Ing.Rădulescu Virginia Maria IULIE 2020 CRAIOVA ii UNIVERSITATEA DIN CRAIOVA FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI ELECTRONICĂ… [631635]
i
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
PROIECT DE DIPLOMĂ
DASC ĂLU VLAD -FLORIN
COORDONATOR ȘTIINȚIFIC
Șef Lucr.Dr.Ing.Rădulescu Virginia Maria
IULIE 2020
CRAIOVA
ii
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI
ELECTRONICĂ
DEPARTAMENTUL DE AUTOMATICĂ ȘI ELECTRONICĂ
MANAGEMENTUL CHELTUIELILOR ȘI VENITURILOR ,
APLICAȚIE WEB -ANDROID
DASC ĂLU VLAD -FLORIN
COORDONATOR ȘTIINȚIF IC
Șef Lucr.Dr.Ing.Rădulescu Virginia Maria
IULIE 2 020
CRAIOVA
iii
„Învățătura este o comoară care își urmează stăpânul pretutindeni .”
Proverb popular
iv
DECLARAȚIE DE ORIGINALITATE
Subsemnatul DASC ĂLU VLAD -FLORIN , student: [anonimizat], Calculatoare și Electronică a Universit ății din
Craiova, certific prin prezenta că am luat la cunoșt ință de cele prezentate mai jos și că î mi asum, în
acest context, origi nalita tea proiectului meu de licență :
cu titlul MANAGEMENTUL CHELTUIELILOR SI VENITURIL OR, APLICA ȚIE WEB –
ANDROID ,
coordonată de ȘEF LUCR. DR. ING. RĂDULESCU VIRGINIA MARIA ,
prezentată în sesiunea IULIE 2020
La elaborarea proiectului de licență, se consideră plag iat una dintre următoarele acțiuni:
reproducerea exactă a cuvintelor unui alt autor, dintr -o altă lucrare, în limba română sau prin
traducere dintr -o altă limbă, dacă se omit ghilimele și referința precisă,
redarea cu alte cuvinte, reformularea prin cuvi nte proprii sau rezumarea ideilor din alte
lucrări , dacă nu se indică sursa bibliografică,
prezentarea unor date experimentale obținute sau a unor aplicații realizate de alți autori fără
menționarea corectă a acestor surse,
însușirea totală sau parțială a unei lucrări în care regulile de mai sus sunt respectate, dar care
are alt autor.
Pentru evitarea acest or situații neplăcute se recomandă:
plasarea într e ghilimele a citatelor directe și indicarea referinței într -o listă corespunzătoare la
sfărșitul lu crării,
indicarea în text a reformulării unei idei, opinii sau teorii și corespunzător în lista de referințe
a sursei originale de la care s -a făcut preluarea,
precizarea sursei de la care s -au preluat date experimentale, descrieri tehnice, figuri, imagi ni,
statistici, tabele et caetera ,
precizarea referințelor poate fi omisă dacă se folosesc informații sau teorii arhicunoscute, a
căror paternitate este unanim cunoscută și acceptată.
Data , Semnătura candidat: [anonimizat] ,
v
UNIVERSITATEA DIN CRA IOVA
Facultatea de Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică Aprobat la data de
…………………
Șef de departament,
Prof. dr. ing.
Prenume NUME
PROIECTUL DE DIPLOMĂ
Numele și prenumele student: [anonimizat]/ -ei:
DASCĂLU VLAD -FLORIN
Enunțul temei:
MANAGEMENTUL CHELTUIELILOR SI VENITURIL OR,
APLICA ȚIE WEB -ANDROID
Datele de pornire:
Realizarea unei aplica ții web-android care să permita
administrarea mai ușoară a cheltuielilor si veniturilor.
Conținutul proiectului :
1. Introduc ere
2. Sistemul Android
3. Firebase
4. Prezentarea aplicației
5. Concluzii
6. Bibliografie
7. Referințe web
A. Codul sursă
B. Site-ul web al proiectului
C. CD / DVD
Material grafic obligatoriu:
Consultații:
Lunare
Conducătorul științific
(titlul, nume și prenume, semnătura): Șef lucrări dr. ing. Rădulescu Virginia Maria
Data eliberării temei :
xx.xx.xxxx
Termenul estimat de predare a
proiectului :
xx.xx.xxxx
Data predării proiectului de către
student și semnătura acestuia:
xx.xx.xxxx
vi
UNIVERSITATEA DIN CRAIOVA
Facultatea d e Automatică, Calculatoare și Electronică
Departamentul de Automatică și Electronică
REFERATUL CONDUCĂTORULUI ȘTIINȚIFIC
Numele și prenumele candida tului/ -ei: DASCĂLU VLAD -FLORIN
Specializarea: INGINERIA SISTEMELOR MULTIMEDIA
Titlul proiec tului: MANAGEMENTUL CHELTUIELILOR SI
VENITURIL OR, APLICA ȚIE WEB -ANDROID
Locația în care s -a realizat practica de
documentare (se bifează una sau mai
multe din opțiunile din dreapta): În facultate □
În producție □
În cercetare □
Altă locație:
În urma analizei lucrării candidatului au fost constatate următoarele:
Nivelul documentării Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Tipul proiectului Cercetare
□ Proiectare
□ Realizare
practică □ Altul
Aparatul matematic utilizat Simplu
□ Mediu
□ Complex
□ Absent
□
Utilitate Contract de
cercetare □ Cercetare
internă □ Utilare
□ Altul
Redactarea lucrării Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Partea grafică, desene Insuficient ă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Realizarea
practică Contribuția autorului Insuficientă
□ Satisfăcătoare
□ Mare
□ Foarte mare
□
Complexitatea
temei Simplă
□ Medie
□ Mare
□ Complexă
□
Analiza cerințelor Insuficient
□ Satisfăcător
□ Bine
□ Foarte bine
□
Arhite ctura Simplă Medie Mare Complexă
vii
□ □ □ □
Întocmirea
specificațiilor
funcționale Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Implementarea Insuficientă
□ Satisfăcătoare
□ Bună
□ Foarte bună
□
Testarea Insuficientă
□ Satisfăcăto are
□ Bună
□ Foarte bună
□
Funcționarea Da
□ Parțială
□ Nu
□
Rezultate experimentale Experiment propriu
□ Preluare din bibliografie
□
Bibliografie Cărți
Reviste
Articole
Referi nțe web
Comentarii
și
observații
În concluzie, se pr opune:
ADMITEREA PROIECTULUI
□ RESPINGEREA PROIECTULUI
□
Data, Semnătura conducătorului științific,
viii
REZUMATUL PROIECTULUI
Aplicația pe care am cre at-o are atribuția de a permite unui utilizator să țină o
evidența a cheltuielil or si veniturilor aferente fiecărei zi. Utilizatorul are posibilitatea de a -și
crea un cont cu datele personale, aceste date fiind înregistrate într -o bază de date. După crear ea
contului utilizatorul poate trece la notarea cheltuielil or și veniturilor personale .
Lucrarea este structurată pe cinci capitole principale și anume:
1. Introducere
2. Sistemul Android
3. Firebase
4. Prezentarea aplica ției
5. Concluzii
Primul capit ol al acestei lucr ări este destinat scopului luc rării dar și motiva ției alegerii
acestei teme.
Cel de -al doilea capitol cuprinde no țiuni despre sistemul Android în general , dar și noțiuni și
detalii despre programul în care am realizat aplica ția ce face obie ctul lucr ării ce u rmeaza a fi
prezentata și anume programul Android Studio.
Cel de -al treilea capitol se rezum ă la platform a Firebase, platform ă ce a contribuit la
dezvoltarea aplica ției mele.
Capitolul patru este destinat prezent ării aplica ției realizate și anume aplica ția privind
managementul cheltuie lilorș veniturilor.
Capitolul cinci cuprinde concluziile la care am ajuns în urma realizarii aplica ției respect ive.
Termenii cheie : aplicatie, android, firebase, management, cheltuieli, venituri .
ix
CUPRINSUL
1 INTRODUCERE ………………………….. ………………………….. ………………………….. ………………………….. …. 1
1.1 SCOPUL ………………………….. ………………………….. ………………………….. ………………………….. ………… 2
1.2 MOTIVAȚIA ………………………….. ………………………….. ………………………….. ………………………….. …… 1
2 SISTEMUL ANDROID ………………………….. ………………………….. ………………………….. ……………………. 2
2.1 NOȚIUNI GENERALE ANDROID ………………………….. ………………………….. ………………………….. ………… 2
2.2 IMPORTAN ȚA ANDROIDULUI ………………………….. ………………………….. ………………………….. ………….. 2
2.3 ANDROID STUDIO ………………………….. ………………………….. ………………………….. ………………………… 3
2.3.1 Interfa ța ………………………….. ………………………….. ………………………….. ………………………….. …… 3
2.3.2 Componente ale unei aplica ții Android Studio ………………………….. ………………………….. ………….. 5
2.3.3 Avantaje și dezavantaje ale programului Android Studio ………………………….. ………………………… 6
3 FIREBASE ………………………….. ………………………….. ………………………….. ………………………….. …………. 8
3.1 NOȚIUNI GENERALE FIREBA SE ………………………….. ………………………….. ………………………….. ……….. 8
3.2 AVANTAJELE ȘI DEZAVANTAJELE FOLO SIRI F IREBASE ………………………….. ………………………….. …….. 8
4 PREZENTAREA APLICA ȚIEI ………………………….. ………………………….. ………………………….. ………. 10
4.1 PREZENTAREA APLICA ȚIEI ………………………….. ………………………….. ………………………….. …………… 10
4.1.1 Pagina principal ă ………………………….. ………………………….. ………………………….. …………………. 10
4.1.2 Interfa ța paginii de înregistrare ………………………….. ………………………….. ………………………….. . 11
4.1.3 Pagina de logare ………………………….. ………………………….. ………………………….. ………………….. 12
4.1.4 Pagina de resetare a parolei ………………………….. ………………………….. ………………………….. …… 13
4.1.5 Salvarea informa țiilor de înregistrare și conectarea la baza de date ………………………….. ……….. 14
4.2 MENIUL PRINCIPAL AL APLICA ȚIEI ………………………….. ………………………….. ………………………….. … 15
4.2.1 Logarea in aplica ție………………………….. ………………………….. ………………………….. ………………. 15
4.2.2 Meniul din p agina prncipala ………………………….. ………………………….. ………………………….. …… 16
4.2.3 Adăugarea datelor ………………………….. ………………………….. ………………………….. ………………… 17
4.2.4 Meniul secundar ………………………….. ………………………….. ………………………….. …………………… 21
4.3 PROIECTUL FINAL ………………………….. ………………………….. ………………………….. ……………………… 25
4.3.1 Testarea proiectul ui ………………………….. ………………………….. ………………………….. ………………. 25
4.3.2 Platforma de testare ………………………….. ………………………….. ………………………….. ……………… 26
4.3.3 Actualizarea bazei de date ………………………….. ………………………….. ………………………….. ……… 28
5 CONCLUZII ………………………….. ………………………….. ………………………….. ………………………….. …….. 30
6 BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………………………….. .. 31
7 REFERINTE WEB ………………………….. ………………………….. ………………………….. ………………………… 32
A. CODUL SURSĂ ………………………….. ………………………….. ………………………….. ………………………….. … 34
x
B. SITE -UL WEB AL PROIE CTULUI ………………………….. ………………………….. ………………………….. … 56
C. CD / DVD ………………………….. ………………………….. ………………………….. ………………………….. …………. 57
INDEX ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 58
1
1 INTRODUCERE
1.1 Scopul
Lucrarea de fa ță are ca s cop p rezentar ea aspectelor și caracteristicilor aplica țiilor Android,
ale programului Android Studio , precu m și aplica ția ce face obiectul lucr ării și anume aceea care
prive ște man agementul cheltuielilor și veniturilor. Aceast ă aplicație a fost creat ă pentru o gamă largă
de utilizatori cu scopul de a u șura administrarea venitur ilor și cheltuielilor acestora. Aplica ția poate fi
folosit ă pe toate dispoziti vele ce ruleaz ă pe sistemul de operare Android, sistemul f iind ales deoar ce
este cel mai r ăspândit în rândul u tilizato rilor de dispozitive mobile.
Un alt f actor c heie ce a contribuit la realizarea acestei aplica ții a fost acela al utilizarii
personale deoarece aveam nevoie de o astfel de aplica ție pentru a -mi ține eviden ța propriilor venituri
și che ltuieli într-un mod mult mai simplu.
1.2 Motivația
Am ales acest tip de aplica ție în primul r ând pentru a -mi demonstra mie c ă sunt capabil s ă
stăpânesc destu l de bine un limbaj de programare încat s ă construiesc o aplica ție de la zero care s p îsi
ating ă scopul și anume o mai bun ă și rapi dă gestionare a c heltui elilor și veniturilor, atat ale altor
persoane c ât și ale mele. Astfel c ă utilizatorii pot salva timpul pierdut pentru a caut ă informa țiile
notate pe agend e, foi sau alte noti țe gestion ându-l într-un mod mult mai benefic .
Un avantaj ma jor al acestei aplica ții este acela c ă salveaz ă toate informa țiile aferente unei
plați sau a unei încasări astfe l că nu se pierde nici o informa ție important ă.
Un alt motiv pentru c are am a les aceast ă tema este acela c ă aplica ția de manageme nt al
cheltuielilor și veniturilor este ceva inovativ, ceva ce nu este pe ste tot întalnit și cu sigurant p va ajuta
persoanele interesate s ă îsi gestioneze cheltuielile și veniturile într-un mod mu lt mai u șor și totodat ă
să economisea scî timp cu doar cateva atingeri de ecran.
2
2 SISTEMUL ANDROID
2.1 NOȚIUNI GENERALE ANDROID
Sistemul Android este un sistem de operare pentru dispozitive și telefoane mobile ba zat pe
nucleul Linux. Acest sis tem de o perare a fost dezv oltat ini țial de compania Google, însa ult erior
dezvoltarea sa a fost conti nuată de catre Open Handset Alliance . Dup ă ce a înregistrat o ascensiune
uluitoare și o crestere de 886% caștigând tot mai multi adep ți, sistemul de operar e Androi d a început
să reprezinte o amenin țare chiar și pentru Apple și sistemul iOS în preze nt acest ea fiind într-o disput ă
serioas ă pentru primul loc în top ul sistemelor de operare. Android permite dezvoltatorilor s ăi să scrie
cod gestionat în limbajul J ava, controlând dispozit ivul prin intermediul bibliotecilor Java dezvoltate
de către Google.
Lansarea platformei A ndroid la 5 noiembr ie 2007 a fost anun țată prin fondarea Open
Handset Alliance, o asocia ție de 84 de companii d e software, har dware si telecomunica ții ce are ca
scop dezvoltarea standard elor deschise pentru dispozitivele mobile . Google a lansat mare parte a
codului Android sub licen ța Apache, o licen ță de tip free-software și open source.
2.2 IMPORTAN ȚA ANDROIDULUI
Sistemul An droid nu este lega t de un dispoziti v anume , iar orice produc ător hardware poate
lucra și dezvo lta pe aceast ă platforma. În compara ție cu sistemul de operare al Bla ckberry -ului care
poate fi folosit exclusiv pe dispozitive RIM sau cu binecunoscutu l iOS care este controlat în totalitate
de către Apple , Androidul este mult mai f lexibil și accesibil , fiind independent de un tip de dispozitiv
anume.
În ceea ce priveste rapiditatea acesta se claseaza în primele locuri fiind în concuren ță stransă
cu sistemul iOS pe di verse c ategorii ale acestui domeniu . Dacă vorbim despre interfa ță putem spun e
că aceasta este dotat ă cu o multitudine de op țiuni cum ar fi sch imbarea temei de sistem , un sistem
live-capture ce asigur ă subtitr ări în timp real pentr u orice de pe telefonul t ău fară a fi nevoie de
conexiune la internet dar și un sistem de control pr ivacy pentru a întelege mai usor ce acceseaz ă
3
aplica țiile instalate pe dispozitiv. Am putea sublinia și faptul c ă ultima versiune a sistemului Android
folos ește o m etodă de navigare comp let bazata pe gesturi .
Din punctul meu de vedere sistemul de operare este foarte important pentru un utilizator
atunci c ând își alege un dispozit iv mobil pentru c ă practic acesta încearc ă să îți asigure nevoile și
prefer ințele într-un m od cât mai considerabil. Androidul este un sistem de operare important și foarte
utilizat de operatorii de t elefoane smart din mai multe considerente și anume :
Este foarte ușor de utilizat ;
Îți oferă libertatea de a alege, acest sistem de operare fiind prezent pe foarte multe tipuri de
telefoane de la cele mai scumpe p ână la cele mai ieftine, de la cele mai mari pana la cele mai
mici dar și de la cele mai performante pana la cele mai puțin performante , pentru c ă de ce nu,
nu toat ă lumea are nevoie sa ruleze ultimele apara ții in mater ie de aplica ții și jocuri ;
Poate fi personalizat in func ție de preferin țele utilizatorului ce de ține un dispozitiv cu acest
sistem de operare ;
Există o multitudine de aplica ții gratuite ce ruleaz ă pe acest dispozi tiv, dezvoltatorii put ând
încarca propriile aplica ții create in magazinul online ;
2.3 ANDROID STUDIO
Android Studio este un mediu de dezvlotare integrat (IDE) of icial pentru sistem ul de operare
Google Android, construit pe software -ul Int eliJ IDE A de la JetBrains și proiectat special pentru
dezvoltarea Androidului . Este un înlocuitor pentr u Eclipse Android Development Tools (ADT) și este
disponib il pentru descarcare pe sisteme de operare Windows, Linus si MacOS. Android Studio a fost
anun țat la da ta de 16 mai 2013 l a conferin ța Google.
Cu toate c ă acesta este o unealt ă foarte performant ă, nenecesit ând alte instal ări și deținând o
multitudi ne de utilit ăți plăcute (class extracting, refractoring, logcat f ără bug-uri), când vine vorba de
lucrări mult mai a vansate acesta este complet depa șit.
2.3.1 Interfa ța
Fereasta princi pală Android Studi o este alcatuit ă din mai multe zone logice identifica tee in
figura urm ătoare :
4
1. Bara de instrumente ce permite s ă efect uați o mul titudine de ac țiuni inclu siv lansarea de
instrumente Android și rularea aplica ției dumneavoastr ă.
2. Bara de navigare ce vă ajută să naviga ți prin proiectul propr iu dar și prin fisierele deschise
pentru editare. Ace sta ofer ă o vizualizar e mai co mpact ă a structurii vizib ile in fereastra Project.
3. Fereastra editorului care este locul unde scrie ți codul aplica ției. În func ție de fi șierul curent
editorul se poate schimba. La fi șierele de cod editorul afișează doar cod iar la fi șierele de aspect
editorul poa te afișa și partea de design La yout.
4. Bara ferestrei de instru mente se execut ă în interior ul ferestrei IDE și con ține butoane care
vă permit s ă extinde ți sau s ă restrângeți ferestrele individuale de instrumente.
5. Ferestrele de ins trumen te oferă acces la sarcini specifice cum ar fi manage rierea
proiectului, controlul ver siunii, c ăutare precum și multe altele. Aici avem posibilitatea de a ascunde
aceast ă fereastr ă în func ție de preferin țele fiec ăruia.
6. Bara de stare afișează starea proiectului și IDE în sine precu m și orice not ificare, mesaj sau
avertisment.
5
Avem posibilitatea de a organiza fereastra principal ă pentru a oferi mai mult spa țiu pe ecran
dar și personalizarea dup ă bunul plac prin ascunderea sau mutarea barelor de instrumente și a
ferestrelor de instrume nte. Putem utiliza de asemenea comenzi rapide de la tastatur ș (shortcuts) pentru
a avea acces la mai multe caracteristici IDE.
Un aspect foarte important a l aplica ției Android Studio este c ăutarea selectiva a informa țiilor
în întregul proiect . Astfel prin dubla apăsare a tastei Shift sau f ăcand clic k pe butonul search din col țul
din dreapta -sus al ferestrei Android Studio (iconi ța cu l upă) putem c ăuta în cod ul sursă, bazele de
date, elemente ale interfe ței cu utilizatorul, ac țiuni precum și altele. Acest lucru p oate fi extrem de util
în cazul în care încerc ăm, spre exemplu, s ă găsim o anumit ă acțiune IDE .
2.3.2 Componente ale unei aplica ții Android Studio
Cele mai importan te componente ale unei apli cații Android sunt urmatoarele:
– Activity (Activita te)
Reprezint ă o interfață cu utilizatorul ;
Aplica ția Android poate avea una sau mai multe activit ăți;
Fiecare activitate are propria stare și datele acesteia pot fi sal vate sau restaurate;
Activit ățile pot fi porni te de aplica ții diferite (dac ă este permi s de catre develope r);
Are un ciclu de via ță foarte complex ;
– Service ( Serviciu)
Component ă gestionat ă de o instan ță a clasei Service ;
Este u n task care se execut ă în fundal, f ără interac țiunea direct ă cu utilizatorul;
– Intent ( Intentie )
Component ă gestio nată de o instan ța a clasei Intent;
Reprezint ă o entitate folosit ă pentru a descrie o opera țiune care urmeaz ă să fie executat ă;
Este oarecum si mliar cu no țiunea de even t-handl er din Java sau .NET;
Un mesaj asincron utilizat pentru a activa activit ăți sau se rvicii;
6
– Conten t provider ( Furnizor de con ținut)
Implementat ă de o subclasa a clasei Con tentProvider;
Este un API folosit pentru a gestiona datele private al e aplica ției, practic un sistem de
managemen t de date ce descrie o alternativa la sistem de fisi ere, baze de date s au orice alta
soluție de stocare.
O solu ție pentru a controla și a par taja transferul de date intre aplica ții;
– Brodcast receiver (Receptor de emisi e)
Imple menta tă de o subclasa a clas ei BroadcastReceiver ;
Este o component ă care raspund e la anun țuri propa gate la nivel de sistem;
Este oarecum si mliar cu no țiunea de handler -global (evenimente de sistem );
2.3.3 Avantaje si dezavantaje ale programului Android Studio
Ca orice progr am din aceasta lume chiar si Android Studio are o se rie de avantaje care
bineinteles vin la pachet și cu o cantitate , destul de mica dar importanta , de dezavantaje .
– Avantaje:
Editor WYSIWYG ( What You See Is What You G et), un editor ce afi șează materialu l în lucru
într-o form ă identic ă, sau m ăcar foarte a propaiat ă de produs ul final și care este folosit în general
de începatorii in programare ;
Posibilitatea de a analiza performan ța codului;
Proiecte bazate pe arhitectura Gradle ;
Refractorizare foarte bun ă;
Arhiv ă de template -uri gata func ționale;
7
– Dezavan taje:
Existen ța bug -urilor într-un num ăr extraordinar de mare;
Nevoie constanta de a da refresh la Gradle chiar și pentru cea mai mic ă modificare;
La fiecare import de librarie nouă trebuie refacut import ul librariilor vechi;
Cerin țe foarte mari de sistem : 8GB memorie RAM , 4GB mem orie HDD, 1280×800 rezolu ția
minim ă a ecranului.
8
3 FIRE BASE
3.1 NOȚIUNI GENERALE FIREBASE
Firebase este o platform ă de dezvol tare a aplica țiilor web și mobile dezvoltat ă de Firbase Inc
în anul 2011 și achiz itionat ă mai apoi d e catre Google în anul 2014.
Firebase este o platform ă aparent destul de nou ă, cu ajutorul c ăreia se pot dezvolta și
monitoriza foarte rapid a plica ții de calitate gener ând o baz ă de utilizatori implica ți în acest proces.
Platforma in clude mai multe func ții strans legate între ele care pot întrebuin ța după bunul plac al
fiecărui utilizator. Printre acestea se num ără un backend mobil , solu ții de a naliza a utiliz ării în sin e
dar și a utilizatorilor și instrumente de dezvoltare a aplica țiilor și monetizare a acestora .
3.2 AVANTAJE LE SI DEZAVANTAJE LE FOLOSIRII FIREBASE
– Avantaje:
Oferă pentru dezvoltatorii de aplica ții o gam ă variat ă de servicii cum ar fi: Baz ă de date în timp
real, stocare în cloud, Kit ML, func ții cloud, autentifi care și hosting ;
Pentru îmbunata țirea aplica țiilor ofer ă laboratoare de testare , distribuire și Crashlytics iar cei ce
doresc s ă își extind ă aplica țiile pe plan profes ional beneficiaz ă de o multime de ext ensii dar și de
Google Analytics ;
Bază de date Fireb ase Realti me este o bază de date de tip NoSQL, gazduit ă în Cloud Firestore
care permit e stocarea și sincronizarea utilizatorilor în timp real ;
Sincornizarea în timp re al ușurează foarte mult accesul utili zatorilor la datele de pe orice
dispoz itiv, fie pe m obil, fie pe web ;
Baza de date Firebase furnizeaz ă aplica ției atat valoarea curenta a datelor c ât și orice actualizare
a acesto r date, și toate acestea cu un singur AP I;
9
Fireb ase Authentica tion oferă servicii de backend, biblioteci UI gata de utilizare și SDK-uri us or
de fol osit pentru ca utilizatorii s ă se poat a autentifica în aplica ția dezvoltata ;
Firebase a simplificat procesul de prelucrare a dat elor specifice din b aza de d ate prin interog ări.
Interog ările sunt create prin legarea uneia sau a mai multo r metode de filtrare ;
– Deza vantaje:
Sincronizarea cu aplica ția poate fi uneori o adevarat ă bataie d e cap din cauza multitudinii de
update -uri;
Mesajele de eroare pe pa rtea de Firebase Functions nu pot fi p ersonalizate ;
Cotele de limitare pentru F unctions sunt destul de mici ;
Nu se pot apela servicii de la API -uri externe din Functions, nici m ăcar din platforma G oogle;
10
4 PREZENTAREA APLICA ȚIEI
4.1 DESIGNUL APLICA ȚIEI
4.1.1 Pagina principal ă
În figura 1 a vem pagina principal ă a aplica ției cu toate se cțiunile corespunz ătoare.
Figura 1
11
4.1.2 Interfa ța paginii de înregistrare
In figura 2 avem pagina de înregistrare a aplica ției care este alcatuit ă din:
Un Te xtView;
Două secțiuni EditText ;
Un buton pentru înregistrare ;
Un buton pentru redirec ționare spre pagi na de Login ;
Figura 2
12
4.1.3 Pagina de logare
In figura 3 avem pagina de logare care este alc ătuită din:
Un TextView ;
Două secțiuni EditText ;
Un buton p entru logare ;
Două butoane de redirec ționare spre se cțiunile de parol ă uitată respectiv înregistrare ;
Pagina de logare are rolul de a -i permite utilizatorului s ă se logheze în aplica ție însa doar
după ce acesta și-a înregistrat cu succes un cont ca re a fos t salvat în baza de date.
Figura 3
13
4.1.4 Pagina de uitare a parolei
Pagina de resetare a parolei (F igura 4) are rolul de a -i reseta parola utilizatorului în cazul în
care ac esta a uitat -o. Un link este trimis pe adresa de mail cu care a f ost înregistrat contul iar
utilizatorul are op țiunea de a intra și a genera o nou ă parol ă. Pagina de resetare este alc atuită din:
Un TextView ;
O sec țiune EditText ;
Un buton pentru resetare ;
Un buton de redirec ționare spre pagina de logare ;
Figura 4
14
4.1.5 Salvarea informa țiilor de înregistrare și conectar ea la baza de date
După ce utilizatorul și-a înregistrat cu s ucces un cont , datele acestuia sunt salvate în baza de
date și este autentificat direct în aplica ție fiind informat de acest lucru (Figura 5) . În cazu l în care
utilizatorul are deja un cont înregistrat acesta se poate loga cu datele personale.
Figura 5
15
4.2 Meniul principal al aplica ției
4.2.1 Logarea în aplicație
După ce ne -am logat în aplica ție suntem informa ți că logarea a avut succes (Figura 6) și
suntem redirec ționați spre pagina principal ș a aplicatiei unde putem g ăsi informa țiile ce urmeaz ș a fi
înregistrate de c ătre aplica ție. În partea de sus avem datele generale de venituri și de cheltuieli iar în
partea de jos putem observa meniul principa l dar și butonul de adaugare a datelor.
Figura 6
16
4.2.2 Meniul din pagina principala
Dacă utilizatorul avea deja date salvate acestea apar în pagina princi palș sub forma lor
general ă, fiind accesate din baza de date (Figura 7).
Figura 7
17
4.2.3 Adaugarea datelor
Pentr u a adaug a date noi acces ăm butonul din dre pta-jos (Figura 8 ) care printr -o anima ție
corespunzatoare deschide cele doua categori unde putem s ă adaugam o cheltuiala sau un venit.
Figura 8
18
După ce selectam cate goria dorita ni se deschide un formular unde putem adauga datele
dorite. Ai ci putem ad ăuga suma aferent ă categoriei selectate, tipul acesteia dar și o noti ță unde putem
adauga un text cu deta lii (Figura 9).
Figura 9
19
Pentru a adauga date fieca re sec țiune a formularului t rebuie completata corespunzator a ltfel
ni se afiseaz ă o eroare . După ce fiecare sec țiune a fost completat ă avem op țiunea de a salva datele sau
de a anula opera țiunea . În ambele cazuri suntem redirec ționați înapoi spre pagina pre cedent ă (Figura
10).
Figur a 10
20
După ce am ad ăugat datele după bunul plac și le-am salvat ni se afi șează în sec țiunea din
josul pagini c ă datele au fost înregistrate în baza de date și ne va aparea în pagina principala o sec țiune
cu detalii .
Figura 11
21
4.2.4 Meniul secunda r
În secțiunea din stanga -sus avem un buton ce ne d eschide men iul secundar al aplica ției din
figura 12 . Aici avem în partea de sus un text cu sumarul aplica ției în sine iar imediat sub un men iu cu
secțiuni. Cateva din aceste sec țiuni sun t prezente și în pagina principal ă dar avem și cateva în plus
cum ar f i secțiunea Ab out, care ne deschide în browser site -ul de prezentare al aplica ției cu detalii , dar
și sectiunea Log out care ne deconecteaz ă din aplica ție.
Figur a 12
22
Dacă apăsam pe butonul Income suntem redirec ționați către pagina cu venit uri a aplica ției
din figura 1 3. Aici avem suma tuturor veniturilor acumulate dar și detalii des pre fiecare venit introdus.
Figura 13
23
În cazul în care apasam pe una dintre date le introduse în aceast ă pagin ă ni se deschi de o
caset ă unde pute m modifica aceste date în cazul în care a intervenit o schimbare sau am introdus din
greșeală date incorecte (Figura 14 ).
Figura 14
24
Acela și lucru îl putem face și în pagina cu cheltuieli din figura 15 urmând exac t aceea și
procedur ă.
Figura 15
25
4.3 Proiectul final
4.3.1 Testarea proiectului
Testarea aplicatiei se face folosind un emulator pentru platforma Android și anume un
Android Virtual D evice (AVD) sau a unui telefon care este setat pe modu l dezvoltator. După rularea
programului din butonul Run și instalarea aplica ției pe dispozitivul dorit putem folosi cum se cuvine
aplica ția.
Figura 16
26
4.3.2 Platforma de testare
Platforma de testare a aplica ției mele a fost un Android Virtual Device ( Nexus 5 API 24) pe
care am r ulat un Android 7.0 cu memorie RAM de 1535 MB, VM heap de 128 MB , memorie intern ș
de 1GB , un car d SD de 512MB și ecran cu rezolutia 1 920×10 80.
Figura 17
Figur a 18
27
Imaginea s istemului este etichetata cu API -uri Google ceea ce înseamn ă că acesta are acces
la toate serviciile din Google Play dar și că se comporta exact la fel ca un dispozitiv fizic.
Figura 19
28
4.3.3 Actualizarea bazei de date
În baza de date a pr oiectului din Firebase putem observa statisticile aferente aplic ației dar și
informa țiile salvate de utilizatorii care și-au introdus datele personale.
Figura 20
Figura 21
29
Figura 22
30
5 CONCLUZII
În ziua de azi aplica țiile Android su nt foarte r ăspandite însă foarte pu ține dintre ele se
bazeaz ă pe stocarea c heltuielilor și veniturilor. Am considerat c ă este momentul necesar s ă creez o
aplica ție care s ă ușureze v iața de zi cu zi a utilizatorilor de Android c are sunt dispu și să încerce
aplica ția mea. Totodat ă am încercat s ă îi ajut s ă salveze timp pr ețios pe care l -ar fi consumat în mod
inutil în notarea cheltuielilor și veniturilor pe diverse materiale specifice.
În lucrarea de fa ță am prezentat câteva din etapele cre ării ap licației WEB -Android:
Managementul cheltuielilor și veniturilor . Pentru exemplificarea etapelor parcurse în realizarea
aplica ției am inserat diverse imagini din aplica ția creata dar am și detaliat anumite proceduri specifice.
Inițial am re alizat aplica ția în limba romana însa dup ă numeroase dezbateri și studii de pia ță
aferente am luat decizia de a o tr aduce în limba engleza , limb ă recunoscut ă la nivel interna țional.
Scopul acestei decizii este de a extinde aplica ția catre o gam ă mai variat ă de utilizatori dispu și să o
foloseasc ă.
Pe parcurs ul realiz ării aplica ției am întâmpinant o g roază de dificult ăți în ceea ce prive ște
erorile ap ărute, unele simple care nu au necesitat mult timp și pe care am reu șit să le rezolv fără ajutor
dar și cateva mai complexe , erori pe care le -am soluționat cu aju torul site -urilor YouTube.com și
StackOverflow.com.
În clipa în care am ales aceast ă temă nu aveam foarte multe cuno știne referitoare la program
sau cum a ș putea m ăcar să realizez o astfel de aplica ție, însă prin extraordinar de mult ă munc ă și
documentare necesar ă am reu șit să realizez aplica ția și să o aduc în forma din prezent.
Prin realizarea aceste i aplica ții am avut oportunitatea de a deprinde cuno ștințe noi și de a
învăța să folosesc un program care va fi pe viitor baza rea lizării aplica țiilor Android.
31
6 BIBLIOGRAFIE
[DOOM05] – Dicționarul ortografic, ortoepic și morfologic al limbii române , Editura
Univ ers Enciclopedic, Bucu rești, 2005
[GERB14 ] – Lear n Android Studio: Build Android Apps Quickly a nd Effectively , Apress ,
Adam Gerber , 2014
[CLIF13 ] – Android User Interface Desi gn: Turning ideas and sketches int o beautifully
designed apps , Ian Clifton, 2013
32
7 REFERINȚE WEB
[AD18] – https://developer.android.com/studio/
[WIK I20] – https://ro.wikipedia.org/wiki/Android_Studio
[EIM19] – Drago ș Niculescu , Programarea And roid, 201 9, disponibil via web la adres a
https://ocw.cs.pub.ro/courses/eim/laboratoare/laborator0 1
[ITC11] – Cătalin B. , Android Tutorial – Concepte, activitat i si resurse ale unei aplicatii
android , 201 1, disponibil via web la adresa
http://www.itcsolutions.eu/ro/2011/09/08/android -tutorial -concepte -activitati -si-resurse -ale-
unei-aplicatii -android/
[ANAU 17] – Alex Mullis , Android Studio tutorial for beginners , 2017, disponibil via web la
adresa https://www.androidauthority.com/android -studio-tutorial -beginners -637572/
[DEVE20 ] – Joydip Kanjilal , Android Studio Tutorial: An Introduction , 2020, dispo nibil via
web la adresa https://www.developer.com/ws/android/an droid -studio -tutorial -an-
introduction.html
[MEDI 16] –Marian Dumitru , Ce este Fir ebase oferi t de Google , 201 6, disponibil via web la
adresa https://medium.com/@mdumitrucom/ce -este-de-fapt-firebase-oferit -de-google –
9ec8668c0c4b
[RAYW18 ] – Mikael Konutgan , Firebase Tutorial , 201 8, disponibil via web la adresa
https://www.raywenderlich.c om/3 -firebase -tutorial -getting -started
[TUPO20 ] – Tutorial sPoint , Firebase Tutorial , 2020, disponibil via web l a adresa
https://www.tutorialspoint.com/firebase/index.htm
33
A. CODUL SURSĂ
1. Partea de JAVA
Dashboard
package dascaluvlad.expensemanager ;
import android.app.AlertDialog ;
import android.os.Bundle ;
import android.support.design.widget.FloatingActionButton ;
import android.support.v4.app.Fragment ;
import android.support. v7.widget.LinearLayoutManager ;
import android.support.v7.widget.RecyclerView ;
import android.text.TextUtils ;
import android.view.LayoutInfla ter;
import android.view.View ;
import android.view.ViewGroup ;
import android.view.animation.Animation ;
import android.view.animation.AnimationUtils ;
import android.widget.Button ;
import android.widget.EditText ;
import android.widget.TextView ;
import android.widget.Toast ;
import com.firebase.ui.database.FirebaseRecyclerAdapter ;
import com.google.firebase.auth.FirebaseA uth;
import com.google.firebase.auth.FirebaseUser ;
import com.google.firebas e.database.DataSnapshot ;
import com.google.firebase.database.Data baseError ;
import com.google.firebase.database.DatabaseReference ;
import com.google.firebase.database.FirebaseDatab ase;
import com.google.firebase.database.ValueEventListener ;
import java.text.DateFormat ;
import java.util.Date ;
import dascaluvlad.expense manager.Model.Data ;
/**
* Managemen tul cheltuielilor si veniturilor – Aplicatie WEB -Android.
*/
public class DashBoardFragment extends Fragment {
//Floating buttton
private FloatingActionButton fab_main_btn ;
private FloatingActionButton fab_income_btn ;
private FloatingActionButton fab_expense_btn ;
//Floating button textview
34
private TextView fab_income_txt ;
private TextView fab_expense_txt ;
//Boolean
private boolean isOpen=false;
//Animation
private Animation FadOpen,FadeClose ;
//Dasbord income and expense result
private TextView totalIncomeResult ;
private TextView totalExpenseResult ;
///Firebase
private FirebaseAuth mAuth;
private DatabaseReference mIncomeDatabase ;
private DatabaseReference mExpenseDatabase ;
//Recycler view
private RecyclerView mRecyclerIncome ;
private RecyclerView mRecyclerExpense ;
@Override
public View onCreateView (LayoutInflater inflater , ViewGroup container ,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View myview= inflate r.inflate(R.layout. fragment_dash_board , container ,
false);
mAuth=FirebaseAuth. getInstance ();
FirebaseUser mUser= mAuth.getCurrentUser() ;
String uid=mUser.getUid() ;
mIncomeDatabase =
FirebaseDatabase. getInstance ().getReferen ce().child( "IncomeData" ).child(uid) ;
mExpenseDatabase =FirebaseDatabas e.getInstance ().getReference().child( "ExpenseDatab
ase").child(uid) ;
mIncomeDatabase .keepSynced( true);
mExpenseDatabase .keepSynced( true);
//Connect floati ong button to layout
fab_main_btn =myview.findViewById(R.id. fb_main_p lus_btn);
fab_income_btn =myview.findViewById(R.id. income_Ft_btn );
fab_expense_btn =myview.findViewById(R.id. expense_Ft_btn );
35
//Connect floating text
fab_income_txt =myview.findViewById(R.id. income_ft_text );
fab_expen se_txt=myview.findViewById(R.id. expense_ft_text );
//Total income and expense result set
totalIncomeResult =myview.findViewById(R.id. income_set_result );
totalExpenseResult =myview.findViewById(R.id. expense_set_result );
//Animation connec t
FadOpen= AnimationUtils. loadAnimation (getActivity() ,R.anim.fade_open );
FadeClose =AnimationUtils. loadAnimation (getActivity() ,R.anim.fade_close );
fab_main_btn .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
addData() ;
if (isOpen){
fab_income_btn .startAnimation( FadeClose );
fab_expense_btn .startAnimation( FadeClose );
fab_income_btn .setClickable( false);
fab_expense_btn .setClickable( false);
fab_income_txt .startAnimation( FadeClose );
fab_expense_txt .startAnimation( FadeClose );
fab_income_ txt.setClickable( false);
fab_expense_txt .setClickable( false);
isOpen=false;
}else {
fab_income_btn .startAnimation( FadOpen);
fab_expense_btn .startAnimation( FadOpen);
fab_income_btn .setClickable( true);
fab_expense_btn .setClickable( true);
fab_income_txt .startAnimation( FadOpen);
fab_expense_txt .startAnimation( FadOpen);
fab_income_txt .setClickable( true);
fab_expense_txt .setClickable( true);
isOpen=true;
}
}
});
//Calculate total income
mIncomeDatabase .addValueEventListener( new ValueEventListener() {
@Override
public void onDataChange (DataSnapshot dataSnapshot) {
36
int totalsum = 0;
for (DataSna pshot mysnap:dataSnapshot.getChildren()){
Data data=mysnap .getValue(Data. class);
totalsum+=data.getAmount() ;
String stResult=String. valueOf(totalsum) ;
totalIncomeResult .setText(stResult+ ".00");
}
}
@Override
public void onCancelled (DatabaseError databaseError) {
}
});
//Calculate total expense
mExpenseDatabase .addValueEventListener( new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int totalsum = 0;
for (DataSnapshot mysnapshot:dataSnapshot.getChildren()){
Data data=m ysnapshot.getValue(Data. class);
totalsum+=data.getAmount() ;
String strTotalSum=String. valueOf(totalsum) ;
totalExpenseResult .setText(strTotalSum+ ".00");
}
}
@Override
public void onCancelled (DatabaseError databaseError ) {
}
});
//Recycler
mRecyclerIncome =myview.findViewById(R.id. recycler_income );
mRecyclerExpense =myview.findViewById(R.id. recycler_e pense);
//Recycler
LinearLayoutManage r layoutManagerIncome =new
LinearLayoutManager(getActivity() ,LinearLayoutManager. HORIZONTAL ,false);
37
layoutManagerIncome.setReverseLayout( true);
layoutManagerIncome.setStackFromEnd( true);
mRecyclerIncome .setHasFixedSize( true);
mRecyclerIncome .setLayoutManager(layoutManagerIncome) ;
LinearLayoutManager layoutManagerExpense= new
LinearLayoutManager(getActivity() ,LinearLayoutManager. HORIZONTAL ,false);
layoutManagerExpense.setReverseL ayout(true);
layoutManagerExpense.setStackF romEnd(true);
mRecyclerExpense .setHasFixedSize( true);
mRecyclerExpense .setLayoutManager(layoutManagerExpense) ;
return myview;
}
//Floating butto n animation
private void ftAnimation (){
if (isOpen){
fab_income_btn .startAnimation( FadeClose );
fab_expense_btn .startAnimation( FadeClose );
fab_income_btn .setClickable( false);
fab_expense_btn .setClickable(false);
fab_income_txt .startAnimation( FadeClose );
fab_expense_txt .startAnimation( FadeClose );
fab_income_txt .setClickable( false);
fab_expense_txt .setClickable( false);
isOpen=false;
}else {
fab_income_btn .startAnimation( FadOpen);
fab_expense_btn .startAnimation( FadOpen);
fab_income_btn .setClickable( true);
fab_expense_btn .setClickable( true);
fab_income_txt .startAnimation( FadOpen);
fab_expense_txt .startAnimation( FadOpen);
fab_income_txt .setClickable( true);
fab_expense_txt .setClickable( true);
isOpen=true;
}
}
private void addData(){
//Fab Button income ..
fab_income_ btn.setOnClickListener( new View.OnClickListener() {
@Override
38
public void onClick(View view) {
incomeDataInsert() ;
}
});
fab_expense_btn .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
expenseDataInsert() ;
}
});
}
public void incomeDataInsert (){
AlertDialog.Builder mydialog= new AlertDialog.B uilder(getActivity()) ;
LayoutInflater inflater=LayoutInflater. from(getActivity()) ;
View myviewm=inflater.inflate(R.layout. custom_layout_for_insertdata ,null);
mydialog.setView(myviewm) ;
final AlertDialog dialog=mydialog.creat e();
dialog.setCancelable( false);
final EditText edtAmmount=m yviewm.findViewById(R.id. ammount_edt );
final EditText edtType=myviewm.findViewById(R.id. type_edt );
final EditText edtNote=myviewm.findViewById(R.id. note_edt );
Button btnSave=myviewm.findViewById(R.id. btnSave);
Button btnCan sel=myviewm.findViewById(R.id. btnCancel );
btnSave.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
String type= edtType.getText().toString().trim() ;
String ammount= edtAmmount .getText().toString().trim() ;
String note= edtNote.getText().toString().trim() ;
if (TextUtils. isEmpty(type)){
edtType.setError( "Required Field.." );
return;
}
if (TextUtils. isEmpty(ammount)){
edtAmmount .setError( "Required Field.." );
return;
}
int ourammontint=Integer. parseInt (ammount) ;
if (TextUtils. isEmpty(note)){
edtNote.setError( "Required Field.." );
return;
39
}
String id= mIncomeDatabase .push().getKey();
String mDate=DateFormat. getDateInstance ().format( new Date());
Data data= new Data(ourammontint ,type,note,id,mDate);
mIncomeDatabase .child(id).setValue(data) ;
Toast.makeText (getActivity(),"Data
ADDED",Toast.LENGTH_SHORT ).show() ;
ftAnimation( );
dialog.dismiss() ;
}
});
btnCansel.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
ftAnimation() ;
dialog.dismiss();
}
});
dialog.show() ;
}
public void expenseDataInsert (){
AlertDialog.Builder mydialog= new AlertDialog.Builder(ge tActivity()) ;
LayoutInflater inflater=LayoutInflater. from(getActivity()) ;
View myview=inflater.inflate(R.layout. custom_layout_for_insertdata ,null);
mydialog.setView(myview) ;
final AlertDialog dialog=mydialog.create() ;
dialog.setCan celable(false);
final EditText ammount=myview.findViewById(R.id. ammount_edt );
final EditText type=myview.findViewById(R.id. type_edt );
final EditText note=myview.findViewById(R.id. note_edt );
Button btnSave=my view.findViewBy Id(R.id.btnSave);
Button btnCansel=myview.findViewById(R.id. btnCancel);
btnSave.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
String tmAmm ount=ammount.getText().toString().trim() ;
String tmtype= type.getText().t oString().trim() ;
String tmnote= note.getText().toString().trim() ;
if (TextUtils. isEmpty(tmAmmount)){
40
ammount.setError( "Required Fi eld..");
return;
}
int inamount=Integer. parseInt (tmAmmount) ;
if (TextUtils. isEmpty(tmtype)){
type.setError( "Required Field.." );
return;
}
if (TextUtils. isEmpty(tmnote)){
note.setError( "Required Field.." );
return;
}
String id= mExpenseDatabase .push().getKey() ;
String mDate=DateFor mat.getDateInstance ().format( new Date());
Data data= new Data(inamount ,tmtype,tmnote,id,mDate);
mExpenseDatabase .child(id).setValue(data) ;
Toast.makeText (getActivity() ,"Data
added",Toast.LENGTH_SHORT ).show() ;
ftAnimation() ;
dialog.dismiss() ;
}
});
btnCansel.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
ftAnimation( );
dialog.dismiss() ;
}
});
dialog.show() ;
}
@Override
public void onStart() {
super.onStart() ;
FirebaseRecyclerAdapter<Data ,IncomeViewHolder>incomeAdapter= new
FirebaseRecyclerAdap ter<Data, IncomeViewHolder>
(
Data.class,
R.layout. dashboard_income ,
DashBoardFragment.IncomeViewHolder. class,
mIncomeDa tabase
) {
@Override
41
protected void populateViewHolder (IncomeViewHolder viewHolder , Data
model, int position) {
viewHolder.setIncomeType(model.getType()) ;
viewHolder.setIncomeAmmount( model.getAmount()) ;
viewHolder.setIncomeDate(model.getDate()) ;
}
};
mRecyclerIncome .setAdapter(incomeAdapter) ;
FirebaseRecyclerAdapter<Data ,ExpenseViewHolder>expenseAdapter= new
FirebaseRecyclerAdapter< Data, ExpenseViewHolder>
(
Data.class,
R.layout. dashboart_expense ,
DashBoardFragment.ExpenseViewHolder. class,
mExpenseDatabase
) {
@Override
protected void populateViewHolder (ExpenseViewHolder viewHol der, Data
model, int position) {
viewHolder.setExpenseType(model.getType()) ;
viewHolder.setExpenseAmmount(model.getAmount()) ;
viewHolde r.setExpenseDate(model.getDate()) ;
}
};
mRecyclerExpense .setAdapter(expenseAdapter) ;
}
//For Income Data
public static class IncomeViewHolder extends RecyclerView.ViewHolder{
View mIncomeView ;
public IncomeViewHolder (View itemView) {
super(itemView) ;
mIncomeView =itemView ;
}
public void setIncomeType (String type){
TextView mtype= mIncomeView .findViewById(R.id. type_Incom e_ds);
mtype.setText(type) ;
}
public void setIncomeAmmount (int ammount){
TextView mAmmount= mIncomeView .findViewById(R.id. ammoun_income_ds );
String strAmmount=String. valueOf(ammount) ;
42
mAmmount.setText(strAmmount) ;
}
public void setIncomeDate (String date){
TextView mDate= mIncomeView .findViewById(R.id. date_income_ds );
mDate.setText(date) ;
}
}
//For Expense data.
public static class ExpenseViewHolder extends RecyclerView.ViewHolder{
View mExpenseView ;
public ExpenseViewHolder (View itemView) {
super(itemView) ;
mExpenseView =itemView ;
}
public void setExpenseType (String type){
TextView mty pe=mExpenseView .findViewById(R.id. type_expense_ds );
mtype.se tText(type) ;
}
public void setExpenseAmmount (int ammount){
TextView mAmmount = mExpenseView .findViewById(R.id. ammoun_exp ense_ds);
String strAmm ount=String. valueOf(ammount) ;
mAmmount.setText(strAmmount) ;
}
public void setExpenseDate (String date){
TextView mDate= mExpenseView .findViewById(R.id. date_expense_ds );
mDate.setText(date) ;
}
}
}
43
Main Activity
package dascaluvlad.expensemanager ;
import android.app .ProgressDialog ;
import android.content.Intent ;
import android.support.annotation. NonNull;
import android.support.v7.app.AppCompatActivity ;
import android.os.Bundle ;
import android.text.TextUtils ;
import android.view.View ;
import android.widget.Button ;
import android.widget.EditText ;
import android.widget.TextView ;
import android.widget.Toast ;
import com.google.android.gms.tasks.OnCompleteListener ;
import com.google.android.gm s.tasks.Task ;
import com.google.firebase.auth.AuthResult ;
import com.google.fireb ase.auth.FirebaseAuth ;
public class MainActivity extends AppCompatActivity {
private EditText mEmail;
private EditText mPass;
private Button btnLogin ;
private TextView mForgetPassword ;
private TextView mSignupHere ;
private ProgressDialog mDialog;
//Firebase
private FirebaseAuth mAuth;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstan ceState);
setContentView(R.layout. activity_main );
mAuth=Firebase Auth.getInstance ();
if (mAuth.getCurrentUser()!= null){
startActivity( new Intent(getApplicationContext() ,HomeActivity. class));
}
mDialog=new ProgressDialog( this);
loginDetails() ;
}
private void loginDetails(){
mEmail=findViewById(R.id. email_login );
44
mPass=findViewById(R.id. password_login );
btnLogin =findViewById(R.id. btn_login );
mForgetPasswo rd=findViewById(R.id. forget_password );
mSignupHere =findViewById(R.id. signup_reg);
btnLogin .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
String email= mEmail.getText().toString().trim() ;
String pass= mPass.getText().toSt ring().trim() ;
if (TextUtils. isEmpty(email)){
mEmail.setError( "Email Required.." );
return;
}
if (TextUtils. isEmpty(pass)){
mPass.setError( "Password Required.." );
return;
}
mDialog.setMessage( "Processing.." );
mDialog.show();
mAuth.signInWithEmailAndPassword(email ,pass).addOnCompleteListener( new
OnCompleteListener<Aut hResult>() {
@Override
public void onComplete (@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
mDialog.dismiss() ;
startActiv ity(new
Intent(getApplicationContext() ,HomeActivity. class));
Toast.makeText (getApplicationContext() ,"Login
Successful.." ,Toast.LENGTH_SHORT ).show() ;
}else {
mDialog.dismiss() ;
Toast.makeText (getApplicationContext() ,"Login
Failed.." ,Toast.LENGTH_SHORT ).show() ;
}
}
});
}
});
// Registration activity
mSignupHere.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity( new
Intent(getApplicati onContext() ,RegistrationActivity. class));
}
});
45
//Reset password activity
mForgetPassword .setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity( new
Intent(getApplicationContext() ,ReseatActivity. class));
}
});
}
}
46
HomeActivity
package dascaluvlad.expensemanage r;
import android.content.Intent ;
import android.support.annotation. NonNull;
import android.support.design.widget.BottomNavigationView ;
import android.support.design.widget.Na vigationView ;
import android.support.v4.app.Fragment ;
import android.support.v4 .app.FragmentTransaction ;
import android.support.v4.view.GravityCompat ;
import android.support.v4.widget.DrawerLayout ;
import android.support.v7.app.ActionBarDrawerToggle ;
import android.support.v7.app.AppCompatActivity ;
import android.os.Bundle ;
import android.support.v7.widget.Toolbar ;
import android.view.MenuItem ;
import android.wi dget.FrameLayout ;
import com.google.firebase.auth.FirebaseAuth ;
public class HomeActivity extends AppCompatActivity implements
NavigationView.OnNavigationItemSelecte dListener{
private BottomNavigationView bottomNavigationView ;
private FrameLayo ut frameLayout ;
//Fragment
private DashBoardFragment dashBoardFragment ;
private IncomeFragment incomeFragment ;
private ExpenseFragment expenseFragme nt;
private FirebaseAuth mAuth;
@Override
protected void onCreate (Bundle s avedInstanceState) {
super.onCreate(savedInstanceState) ;
setContentView(R.layout. activity_home );
Toolbar toolbar=findViewById(R.id. my_toolbar );
toolbar.setTitle( "Expense Manager" );
setSupportActionBar(toolbar) ;
mAuth=FirebaseAuth. getInstance ();
bottomNavigationView =findViewById(R.id. bottomNavi gationbar );
frameLayout =findViewById(R.id. main_frame );
DrawerLayout drawerLayout=findViewById(R.id. drawer_layout );
ActionBarDrawerTogg le toggle=new ActionBarDrawerToggle(
this,drawerLayout ,toolbar,R.string. navigatio n_drawer_open ,R.string. navigation_draw
er_close
47
);
drawerLayout.addDrawerListener(toggle) ;
toggle.syncState() ;
NavigationView navigationView=findViewById(R.id. naView);
navigationView.setNavigationItemSelectedListen er(this);
dashBoardFragment =new DashBoardFragment() ;
incomeFragment =new IncomeFragment() ;
expenseFragment =new ExpenseFragment() ;
setFragment( dashBoardFragment );
bottomNavigationView .setOnNavigationItemSelectedList ener(new
BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected (@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.dashboard :
setFragment( dashBoardFragment );
bottomNavigationView .setItemBackgroundResource(R.color. dasboard_color );
return true;
case R.id.income:
setFragm ent(incomeFragment );
bottomNavigationView .setItemBackgroundResource(R.color. income_coloer );
return true;
case R.id.expense:
setFragment( expenseFragment );
bottomNavigationView .setItemBa ckgroundResource(R.color. expense_color );
return true;
default:
return false;
}
}
});
}
private void setFragment (Fragment fragment) {
FragmentTransaction
fragmentTransaction=getSupportFragmentManager().beginTransaction() ;
fragmentTr ansaction.replace(R.id. main_frame ,fragment) ;
fragmentTransaction.commit() ;
}
@Override
public void onBackPressed () {
48
DrawerLayout drawerLayout=findViewById(R.id. drawer_layout );
if (drawerLayout.isDrawerOpen(GravityCom pat.END)){
drawerLayout.closeDrawer(GravityCompat. END);
}else {
super.onBackPressed() ;
}
}
public void displaySelectedListener (int itemId){
Fragment fragment= null;
switch (itemId){
case R.id.dashboard :
fragment= new DashBoardFragment() ;
break;
case R.id.income:
fragment= new IncomeFragment() ;
break;
case R.id.expense:
fragment=new ExpenseFragment() ;
break;
case R.id.logout:
mAuth.signOut() ;
startActivity( new
Intent(getApplicationContext() ,MainActivity. class));
break;
}
if (fragmen t!=null){
FragmentTransaction ft=getSupportFragmentManager().beginTransaction() ;
ft.replace(R.id. main_fram e,fragment) ;
ft.commit() ;
}
DrawerLayout drawerLayout=findViewById(R.id. drawer_layout );
drawerLayout.closeDrawer(GravityCompat. START);
}
@Override
public boolean onNavigationItemSelected (@NonNull MenuItem item) {
displaySelectedListener(item.getItemId()) ;
return true;
}
}
49
2. Partea de design
Activity_main
<?xml version="1.0" encoding ="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.co m/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res -auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width ="match_parent"
android:orientation ="vertical"
android:gravity ="center"
android:background ="@drawable/background_color"
android:layout_height ="match_parent"
tools:context ="dascaluvlad.expensemanager.MainActivity" >
<ScrollView
android:layout_w idth="match_parent"
android:layout_height ="wrap_content" >
<LinearLayou t
android:layout_wid th="match_parent"
android:orientation ="vertical"
android:gravity ="center"
android:layout_height ="wrap_content">
<TextView
android:layout_width ="match_parent"
android:layout_he ight="wrap_content"
android:text="LOGIN"
android:textColor ="@android:color/white"
android:textAppearance ="?android:textAppearanceLarge"
android:gravity ="center"
/>
<EditText
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:layout_margin ="10dp"
android:hint="Email:"
android:textColor ="@android:color/white"
android:textColorHint ="@android:color/white"
android:background ="@drawable/edittext_background"
android:padding ="15dp"
android:id="@+id/email_login"
/>
<EditText
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:layout_ma rgin="10dp"
android:padding ="15dp"
android:inputType ="textPassword"
android:textColor ="@android:color/white"
android:textColorHint ="@android:color/white"
android:background ="@drawable/edittext_background"
android:hint="Password:"
50
android:id="@+id/passwo rd_login"
/>
<Button
android:layout_width ="match_parent"
android:layout_height ="wrap_c ontent"
android:layout_margin ="10dp"
android:text="LOGIN"
android:background ="@drawable/edittext_background"
android:textColor ="@android:color/white"
android:id="@+id/btn_login "
android:textAppearance ="?android:textAppearanceMedium"
/>
<TextView
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:gravity ="center"
android:textColor ="@android:color/white"
android:id="@+id/forget_passwor d"
android:text="Forget Password?"
android:padding ="5dp"
/>
<TextView
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:gravity ="center"
android:textColor ="@android:color/white"
android:id="@+id/signup_reg"
android:text="Don't have account? Sign up here."
android:padding ="5dp"
/>
</LinearLayout>
</ScrollView>
</LinearLayout>
51
Activity_home
<?xml version ="1.0" encoding ="utf-8"?>
<android.support.v4.widget.DrawerLa yout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas .android.com/apk/res -auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width ="match_parent"
android:layout_height ="match_parent"
android:id="@+id/drawer_layout"
android:fitsSystemWindows ="true"
tools:openDrawer ="start"
tools:context ="dascaluvlad.expensemanager.HomeActivity" >
<include layout="@layout/appbar_layout"
android:layout_width ="match_parent"
android:layout_height ="match_parent" />
<android.support.design.widget.NavigationView
android:layout_width ="wrap_content"
app:itemIconTint ="@color/toolbar_color"
app:itemTextAppearance ="?android:textAppearanceSmall"
android:layout_gravity ="start"
android:id="@+id/naView"
app:itemTextColor ="@color /nav_header"
android:fitsSystemWindows ="true"
app:menu="@menu/navmenu"
app:headerLayout ="@layout/nav_header"
android:layout_hei ght="match_parent" />
</android.support.v4.widget.DrawerLayout>
52
Content_main
<?xml version ="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width ="match_parent"
xmlns:app="http://schemas.android.com/apk/res -auto"
app:layout_behavior ="@string/appbar_scrolling_view_beha vior"
android:layout_height ="match_parent" >
<android.support.design.widget.BottomNavigationView
android:layout_width ="match_parent"
android:layout_height ="56dp"
android:id="@+id/bottomNavigationbar"
android:layout_ alignPar entBottom ="true"
android:layout_alignParentLeft ="true"
app:menu="@menu/bottommenu"
app:itemTextColor ="@android:color/white "
app:itemIconTint ="@android:color/white"
android:background ="@drawable/background_col or"
android:layout_alignParentStart ="true">
</android.support.design.widget.BottomNavigationView>
<FrameLayout
android:layout_w idth="match_parent"
android:layout_height ="match_parent"
android:id="@+id/main_frame"
android:layout_above ="@+id/bottomNavigationbar"
android:layout_alignParentLeft ="true"
android:layout_alignParentStart ="true">
</FrameLayout>
</RelativeLayout>
53
Navigation _header
?xml version ="1.0" encoding ="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width ="match_parent"
xmlns:app="http://schemas.android.com/a pk/res-auto"
android:gravity ="center"
android:background ="@color/nav_header"
android:orientation ="vertical"
app:theme="@style/Base.ThemeOverlay.AppCompat.Dark"
android:layout_height ="200dp" >
<TextView
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:text="Expense Manager"
android:textAppearance ="?android:textAppearanceMedium"
android:textColor ="@android:color/white"
android:gravity ="center"
/>
<TextView
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:text="Managementul cheltuielilor si veniturilor"
android:textAppearance ="?android:textAppearanceMedium"
android:textColor ="@android:color/white"
android:gravity ="center"
/>
<TextView
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:text="Aplicatie WEB -Android"
android:textAppearance ="?android :textAppearanceMedium"
android:textColor ="@android:color/white"
android:gravity ="center"
/>
</LinearLayout>
54
Bottom_ menu
<?xml version ="1.0" encoding ="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/dashboard"
android:title="Dashboard"
android:icon="@drawable/dashboard" />
<item android:id="@+id/income"
android:title="Income"
android:icon="@drawable/income" />
<item android:id="@+id/e xpense"
android:title="Expense"
android:icon="@drawable/expense" />
</menu>
Navigation _menu
<?xml version ="1.0" encoding ="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/dashboard"
android:title="Dashboard"
android:icon="@drawable/dashboard" />
<item android:id="@+id/income"
android:title="Income"
android:icon="@drawable/income" />
<item android:id="@+id/expense"
android:title="Expense"
android:icon="@drawable/expense" />
<item android:id="@+id/about"
android:title="About"
android:icon="@drawable/about" />
<item android:id="@+id/logout"
android:title="Log out"
android:icon="@drawable/logout" />
</menu>
55
3. Partea de Gradle
4. buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.google.gms:google -services:4.0.0'
// NOTE: Do not place your application dependencies here; they
belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean( type: Delete) {
delete rootProject .buildDir
}
56
B. SITE -UL WEB AL PROIE CTULU I
57
C. CD / DVD
58
INDEX
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: Șef Lucr.Dr.Ing.Rădulescu Virginia Maria IULIE 2020 CRAIOVA ii UNIVERSITATEA DIN CRAIOVA FACULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI ELECTRONICĂ… [631635] (ID: 631635)
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.
