Nemeș Florin -Cristian [616856]
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
PROIECT DE DIPLOMĂ
Îndrumător: Șef lucr. dr. mat. Crețulescu Radu
Absolvent: [anonimizat], 2016 –
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
2
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
Aplicație Android – Planificator Examene
Îndrumător: Șef lucr. dr. mat. Crețulescu Radu
Absolvent: [anonimizat] 2016 –
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
3
1. Motivarea temei ………………………….. ………………………….. ………………. 5
2. Considerații Teoretice ………………………….. ………………………….. ……… 7
2.1 MySQL ………………………….. ………………………….. ………………………….. ………………………….. ….. 7
2.2 JSON (JavaScript Object Notation) ………………………….. ………………………….. ………………………….. 7
2.3 PHP (Hypertext Preprocessor) ………………………….. ………………………….. ………………………….. ……. 8
2.4 Java ………………………….. ………………………….. ………………………….. ………………………….. …………… 9
2.5 Android ………………………….. ………………………….. ………………………….. ………………………….. ……. 10
2.6 Medii de dezvoltare folosite ………………………….. ………………………….. ………………………….. ……. 15
2.6.1 Android Studio ………………………….. ………………………….. ………………………….. …………………. 15
2.6.2 Wamp ………………………….. ………………………….. ………………………….. ………………………….. … 15
3. Arhitectura Apl icației ………………………….. ………………………….. …….. 16
3.1 Structura Generală ………………………….. ………………………….. ………………………….. …………………. 16
3.2 Aplicația Android ………………………….. ………………………….. ………………………….. …………………… 18
3.2.1 LoginActivity ………………………….. ………………………….. ………………………….. ……………………. 18
3.2.2 AdminMainActivity ………………………….. ………………………….. ………………………….. ……………. 19
3.2.3 Student: [anonimizat] 20
3.2.4 ProfesorMainActivity ………………………….. ………………………….. ………………………….. …………. 21
3.2.5 Session ………………………….. ………………………….. ………………………….. ………………………….. .. 22
3.2.6 BackGroundTask ………………………….. ………………………….. ………………………….. ………………. 23
3.2.7 DateJson ………………………….. ………………………….. ………………………….. …………………… 24
3.2.8 ExpandableListAdapter [8] ………………………….. ………………………….. ………………………….. …. 25
3.3 Scripturile PHP ………………………….. ………………………….. ………………………….. ………………………. 26
3.4 Baza de date MySQL ………………………….. ………………………….. ………………………….. ……………….. 27
3.5 UI ………………………….. ………………………….. ………………………….. ………………………….. ……….. 28
4. Implementarea Modulelor ………………………….. ………………………….. … 29
4.1 Implementare Aplicație Android + Scripturi PHP ………………………….. ………………………….. ……… 29
4.1.1 Logo și Denumire Aplicație ………………………….. ………………………….. ………………………….. … 29
4.1.2 Autentificare ………………………….. ………………………….. ………………………….. …………………… 30
4.1.3 Ad minMainActivity – Planificare Examen ………………………….. ………………………….. …………. 40
4.1.4 StudentMainActivity – Vizualizare Examene ………………………….. ………………………….. …….. 47
4.1.5 ProfesorMainActivity – Vizualizare Examene ………………………….. ………………………….. ……. 49
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
4
4.1.6 UI ………………………….. ………………………….. ………………………….. ………………………….. ………. 49
4.1.7 Buton Log Out ………………………….. ………………………….. ………………………….. …………………. 51
4.2 Implementare baza de date MySQL ………………………….. ………………………….. ………………………. 51
5.Concluzii și dezvoltări ulterioare ………………………….. …………………… 53
6. Bibliografie și Webliografie ………………………….. ………………………….. 55
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
5
1. Motivarea temei
Am ajuns î n punctul î n care împotriva voinței noastre , suntem înconjurați de tehnologie , scopul
ei fiind sa ne ușureze munca , de la a comunica mai ușor sau rezolva mult mai repede probleme
din orice domeniu, până la a ne comanda mâncarea noastră preferată de oriunde am fi, printr -o
singură apăsare de buton . Toate acestea poate încep sa ni se pară lucruri banale, dar după cum
știm din legea lui Gordon Moore , la interval de 18 luni tranzistorii se vor dubla, astfel t ehnologia
va fi tot mai avansată din toate punctele de vedere (hard ware /software ) , iar ideile de a le exploata
vor fi nelimitate.
Fiind student in domeniul IT la facultatea de inginerie, un loc unde se nasc idei intuitive , m-a
îndrumat la ideea de a concepe ceva util î n sprijinul secretar , profesorilor și studenților , adoptând
tehnologia din ziua de azi. Odată cu apariția „smartphone -urilor” , au fost dezvoltate aplicații cu
capabilități din aproape orice domeniu , scopul lor fiind de a adopta o lume modernă, inteligentă
și cu un „user experience ” cât mai ușor. De la începutul anilor de studiu eu și mulți alții ne-am
confruntat cu situații in care nu știam in ce dată avem următorul examen , la ce oră și in ce sală ,
pentru a ști cum să ne organizam programul de studiu . Rezolvând această dilemă , de multe ori se
ajungea la întrebări repetate șefului de grupă, ceea ce devenise o problemă .
Aceeași dilemă apare la un moment dat si in cazul unui profesor , care trebuie să verifice când va
susține un examen , utilizând un calculator . In ceea ce o privește pe secretara, pot exista cazuri in
care nu poate avea acces la un calculator pentru a planifica un examen. Așa am ajuns la decizia
de a dezvolta o aplicaț ie pentru dispozitive Android î n care secretara poate planifica un examen
pentru orice specializare din orice an cu regulile aferente , un profesor poate vedea detaliile
examinărilor lui , iar un student poate verifica e xamenele din sesiunea respectivă .
Obiectivele dezvoltării acestui proiect au fost:
dezvoltarea unei aplicații care să se comporte diferit in funcție de secretara/profesor/student
dezvoltarea unor restricții in ceea ce privește planificarea : dimensiunea sălilor ,
suprapunerii materiilor, profesorilor , asistenților, grupel or , inter val 3 zile examen pentru
o grupă , durata unui examen
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
6
dezvoltarea unei baze de date online
comunicarea datelor î ntre baza de date și aplicație
vizualizarea examenelor pentru studen t/profesor in ordine cronologică după dată
interfață cât mai prie tenoasă pentru utilizator
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
7
2. Considerații Teoretice
2.1 MySQL
MySQL este un SGBD(Sistem de gestiune a bazelor de date relaționale ) folosit foarte des î n
aplicațiile web. Își are rădăcinile într -un sistem de baze de date in -house (non -SQL) numit Unireg
folosit de către compania suedeză TcX care a fost dezvoltată pentru prima oa ră in 1980 și
optimizată pentru depozitele de date [1]. Prima versiune la nivel larg a fost MySQL 3.11, lansată
la mijlocul lui 1996.
MySQL -> limbaj de program stocat este un limbaj structurat -bloc (asemănător limbajului Pascal)
care conține comenzi familiare pentru manipularea variabilelor, de punere in aplicare condiționată
, execuție , procesare iterativa și tratare a erorilor[1].
Sistemul MySQL folosit pentru aplicația noastră este phpMyAdmin .
2.2 JSON (JavaScript Object Notation)
Formatul JavaScript Object Notation , sau JSON pe scurt, este derivat din limbajul de programare
JavaScript, ulterior devenind un format independent de limbajele de programare.[2]
JSON este un format standard care folosește text pentru a transmite perechi de date cheie -valoare.
Este știut ca fiind creația lui Douglas Crockford , deși recunoscând ca nu el este creatorul , a fost
cel care i -a dat un num e și inventat extensia .json . [2]
JSON suportă mai multe tipuri de date : string, numere intregi/reale , boolean, obiecte, liste.
De-a lungul timpului s -a constatat ca fiind o alternativă a formatului XML , fiind mai ușor de
interpretat.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
8
Exemplu format JSON cheie -valoare:
2.3 PHP (Hypertext Preprocessor)
PHP este un limbaj de programare folosit pentru construir ea dinamică a site -urilor web .O pagină
web dinamica este o pagină a cărui conținut se poate schimb a in mod automat de fiecare dată când
este vizualizata pagina. Ca și o regulă generală , programele de tip PHP rulează pe un Web Server
și scopul lor este de a servi cereri utilizatorului cu serverul[3]. Ca prin urmare, es te un limbaj de
Server. O pagină web nu știe dac ă PHP este implicat , deci este ’transparent’ pentru HTML .
O facilitate foarte bună – este cross/platform , compatibil cu Linux, Windows, FreeBSD, Mac OS
X , Solaris și multe altele. Se poate integra ușor cu toate Web server ’urile comune, incluzând
Apach e, Internet Information Server(IIS) , Zeus, lighthttpd[3].
A fost creat de Rasmus Lerdorf in 1994. A încep ut ca un simplu utilitar scris î n limbajul C pentru
a înlocui scripturile Perl care Rasmus le fol osea pe pagina lui Web personală . A fost lansat
publicului larg in 1995 numit PHP versiunea 2[3].
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
9
Exemplu Hello World PHP
Interpretorul PHP execută numai cod PHP in cadrul delimitatorilor lui. Orice din afara
delimitatorilor nu este procesat de PHP. Delimitatorii sunt <?php pe ntru a deschide și ?> pentru a
închide secțiunea .
Variabilele au ca prefix un simbol cu un dolar iar tipul lor nu trebuie specificat. De la PHP 5 s -a
introdus „type hinting” care permite funcțiilor să forțeze parametri lor ca fiind obiecte ale unei
anumite clase , tablouri sau interfețe . Conține trei tipuri de sintaxe pentru comentarea codului:
„/**/” comentează un întreg bloc de cod, „//” și „#” comentează o singura linie. Declarația „echo”
este una dintre cele mai comune facilități pentru a afișa un text undeva. De exemplu, î ntr-un
browser web.
In ceea ce privește cuvintele cheie și sintaxa limbii , PHP este similar cu sintaxa C pentru condiții
„if” ,bucle ”for” și „while” și returnarea funcțiilor sunt similare cu C,C++,C#,Java și Pearl.
2.4 Java
Java este un limbaj și o platformă realizată de Su n Microsystems. Este un limbaj î n care
devol tatorii pot exprima un cod sursă (textul programului). Sintaxa Java este parțial corelată după
C și C++ pentru a putea fi mai ușor de învățat de către dezvoltatorii C/C++. A fost proiectat pentru
a fi un limbaj mai sigur ,realiz ând o așa numită siguranța prin faptul că nu lasă supraîncărcarea
operatorilor și se omit anumite caracteristici din C/C++ , cum ar fi pointerii. [11]
Java mai este in același timp și o platformă care constă într-o mașină virtuală și un mediu de
execuție . Mașina virtuală este un procesor b azat pe software , care prezintă un set de instrucțiuni .
Mediul de execuție constă in librarii pentru rularea programelor și interacțiunea cu sistemul de
operare. Acesta conține o bibliotecă mare de fișiere tip .class prec ompilate care execută sarcini
comune, cum ar fi operațiuni matematice sau comunicații in rețea . <?php echo '<p>Hello World</p>' ; ?>
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
10
Un program special cunoscut sub numele de compi lator Java traduce codul sursa î n instrucțiuni ,
care apoi sunt executate de către mașina virtuală . Aceste instrucțiuni sunt cunoscute sub denumirea
de bytecode . Platforma promovează portabilitatea . Același bytecode neschimbat rulează pe
Windows, Linux , Mac OS -X și altele.[11]. Java a fost in trodus cu sloganul „scrie o dată , rulează
oriunde”[12] .
Există mai mu lte ediții ale platformei Java , fiecare având un anumit scop:
Java Platform , Standard Edition (Java SE). Folosit pentru dezvoltarea aplicațiilor care
rulează pe desktopuri și pentru a dezvolta applet -uri , programe care rulează pe browsere
web.
Java Platform, Enterprise Edition(Java EE). Folosit pentru dezvoltarea aplicațiilor de tip
server . Are la bază Java SE.
Java Platform, Micro Edition (Java ME). Folosit pentru dezvoltarea MIDlets’urilor , care
reprezintă programe pentru dispozitive mobile și Xl et’surilor care sunt programe care
rulează pe sisteme dedicate.
O a patra platformă este una creată de Google pentru a crea Aplicații Android care rulează
pe dispoziti ve cu Android. Aceasta platformă este cunoscuta sub numele de Platforma
Android.
2.5 Android
Android este un sist em de operare mobil, dezvoltat î n special pentru telefoanele inteligente , care
se bazează pe o versiune modificată a Linux. A fost creat sub același nume in 2003 de către
Andy Rubin, Rich Miner, Nick Sears și Chris White , ca parte a unei strategii de a intra in piața
dispozitivelor mobile. In 2005 a fost achiziționat de către Google si astfel , gigantul a dus mai
departe dezvoltare a lui. Google a hotărât ca toată lumea sa poată avea acces la codul sursă ,
gratuit. Astfel, toate marile companii de telefoane inteligente folosesc Androidul ca Sistem de
Operare principal, modificându -l după stilul fiecăruia.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
11
Principalul avantaj de a adopta Android este ca oferă o abordare unica in dezvoltarea aplicațiilor .
Dezvoltatorii tre buie sa dezvolte numai pentru Android , iar aplicațiile lor pot rula pe numeroase
dispozitive diferite de la prod ucători diferiți , atâta timp câ t dispozitivele rulează Android.
Android este văzut ca principalul competitor al iOS-ului (SO iPhone) , datori tă pieței de
aplicații[4].
Pe lângă kernel -ul Linux, Android mai conține librarii , API-uri scrise in C și un Framework de
aplicații cu librarii compatibile cu Java, XML.
Până la versiunea 5.0 , Android folosea o mașină virtuala numita Dalvik care folosea compilare
just-in-time (JIT) pentru a rula executabile Dalvik. In versiunea Android 4.4 a fost int rodus
Android Runtime (ART) ca o nouă mașină virtuală , care folosea compilare ahea d-of-time
(AOT) pentru a compila bytecode -ul aplicației in cod mașină , la instalarea unei aplicații . In
versiunea 4.4 , ART a fost experimental ,implicit nepermis, iar ap oi introdus definitiv ca singură
opțiune de compilator in versiunea majora Android 5.0 [5] .
Deoarece dispozitivele care rulează Android sunt î n mare parte alimentate de baterii, Android
este conceput pentru a gestiona procesele pentru a menține consumul de energie la un nivel
minim. Astfel, daca o aplicație nu mai e ste folosită , ea rămâne suspendata in memorie.
In caz de RAM indisponibil, proce sele din memorie sunt menajate automat , sistemul începând
,sa închidă procese inactive , începân d cu cele inactive de o perioadă mai lunga de timp.
In Mai 2016, Google a anu nțat o nouă platformă numita Daydream care va fi implementată nativ
începând cu An droid N , destinata realității virtuale cu capabilități specifice realității virtuale
împreuna cu un controller pe cască virtuală dezvoltată de Google însuși[5].
Arhitectura[4] SO Android:
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
12
Figura 1 -1.Arhitectura SO Android [4]
Aplicațiile dezvoltate pentru Android extind funcționalitatea dispozitivelor și sunt dezvoltate
folosind Android Software Development Kit (SDK) . Ca limbaj de programare principal este
folosit Java deoarece are acces complet la API -urile SO -ului. Java poate fi combinat și cu
C/C++.
In 2014, Google a dezvăluit alt Framework bazat pe Apache Cordova care permite portarea de
aplicații web tip Chrome HTML5 pe Android[5].
4 componente esențiale care le oferă SDK -ul pentru a dezvolta o aplicație pentru Android
sunt[6]:
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
13
Activitate
O activitate reprezintă un sing ur ecran cu o interfață grafică pentru utilizator. O aplicație poate
avea mai multe activități . De exemplu, o aplicație de e -mail poate avea o acti vitate care arată e-
mailurile noi, o alta activitate pentru compunere e -mail și alta pentru toate e -mailurile. Fiecare
activitate lucrează independent de celelalte , dar numai una poate sa fie activa la un moment
dat(doar o interfață este vizibila la un moment dat).
Serviciu
Un serviciu este o componentă care rulează in fundal pentru a duce la capăt taskuri de lunga dura tă
sau pentru control la distanță . Un serviciu nu are o interfață (asemeni activităților ).De exemplu,
un serviciu poate rula pe fundal o melo die cât timp utilizatorul este in altă aplicație , sau să descarce
date de pe web fără a opri interacțiunea utilizatorului cu o activitate/interfață.
Furnizor de conținut
Un furnizor de conținut administrează datele comune ale aplicației . Poate stoca date i n fișiere de
sistem, într -o bază de date de tip SQL , pe web, s au în orice alt tip de stocare î n care aplicația are
acces. Prin acest Furnizor de conținut, o aplicație poate interoga sau chiar modifica datele altei
aplicații (daca este permis).
Broadcast Reciever
Broadca st Reciever -ul este o componentă care răspunde la semnale la nivel de sistem. Multe
semnale provin de la sistem , de exemplu , un semnal care anunță ca s-a stins ecranul, baterie
epuizată sau apel ratat. Nu utilizează o interfață , dar poate crea notificări in bara de stare pentru a
notifica utilizatorul ca a avut loc un eveniment.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
14
Activitățile, Serviciile și Broadcast Reciever -ii pot fi activate prin mesaje asincrone numite Intent.
Un intent trimite un mesaj pentru a activa o co mponentă sau un tip de componentă .
Android folosește limbajul de marcare XML (Extensible Markup Language) pentru a declara
elemente de interfață grafică . Oferă un vocabular XML simplu, care corespunde vizualizării
claselor și subclaselor , cum ar fi cele pentru widget -uri și machete [7]. Fiecare widget/ element
grafic poate fi declarat implicit in XML și apoi poate fi adăugat cod î n aplicație care poate s chimba
starea acelor elemente grafice.
Exemplu cod XML pentru un container de tip text și un buton, încadrat intr -un Layout Linear:
<?xml version ="1.0" encoding ="utf-8"?>
<LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:layout_width ="match_parent"
android:layout_height ="match_parent"
android:orientation ="vertical" >
<TextView android:id ="@+id/textView _login"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="TextView 1" />
<Button android:id ="@+id/button_login"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:text ="Autentificare" />
</LinearLayout>
Un layout(asp ect) definește structura vizuală pentru o interfață(cum vor fi așezate e lementele
grafice una față de alta). De exemplu , unei activități i se poate însușii un aspect
linear(ver tical/orizontal), relativ, gri lă, tabel.
Pentru dezvoltarea acestui proiect s -a folosit mediul de dezvoltare Android Studio 2.1.0.0 , oferit
gratuit de Google .
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
15
2.6 Medii de dezvoltare folosite
2.6.1 Android Studio
Pentru crearea aplicației Android , am folosit mediul de dezvoltare Android Studio 2.1.1 oferit
gratuit de Google , împreuna cu Android SDK (Software Developer Kit). A fost prima oară anunțat
in 16 Mai 2013 , scopul lui fiind un înlocuitor principal al ADT (Eclipse Android Development
Tools). Este compatibil cu Windows, Mac OS X și Linux. Este bazat pe softul JetBrains' IntelliJ
IDEA[9].
Din motive de compatibilitate cu anumite funcții și metode ale Android SDK , aplicația poate fi
instalata pe orice tableta sau telefon care conține API 19(Android 4.4.4 KitKat) pana la API
23(Android 6.0.1 Marshmallow).
2.6.2 Wamp
Din motive de siguranța a conexiunii cu baza de date MySQL , am folosit serverul local numit
WampServer , care este bazat pe Apache web server , baza de date MySQL phpMyAdmin și
programare PHP. Astfel, aplicația Android se conectează local la baza de date aflată pe sistemul
computațional local cu mediul de dezvoltare.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
16
3. Arhitectura Aplicației
3.1 Structura General ă
Proiectul este bazat pe trei componente principale: Aplicația Andr oid , comunicarea datelor
bazată pe scri pturi PHP și baza de date MySQL
Figura 3 .1 Structura Claselor și Modulelor
Aplicația Android este formată din patru clase principale care conțin o interfață fiecare și cinci
module .clase destinate prelucrării în fundal. Clasă LoginActivity impreună cu BackGroundTask
decid la momentul lansării aplicației ,în funcție de utilizatoru l care se conectează, ce activitate să
lanseze mai departe :Admin(secretară),Profesor sau Student. Cele trei sunt independente una față
de cealaltă. Dacă utilizatorul este deja conectat , atunci LoginActivity va decide ce să lanseze mai
departe.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
17
Figura 3 .2 Use -Case Modul Login
App Student – AdminMainActivity – Activitate cu interfață specifică Secretarei
App Profesor – ProfesorMa inActivity – Activitate cu interfață specifică Profesorului
App Secretara – StudentMainActivity – Activitate cu interfață specifică Studentului
Clasa Session păstrează utilizatorul conectat, cu toate detaliile necesare , inclusiv la oprirea
aplicației, până când acesta își va da Log Ouț. În date_json se memorează temporar datele json
referitoare la o înregistrare din baza d e date, primite prin scripturile php , iar DateJsonStorage
conține variabile statice de tip vector în care se păstrează toate înregistrările din baza de date .
În BackGroundTask se află metodele care moștenesc AsyncTask din SDK -ul Android care
utilizeaz ă fire de execuție în fundal pentru conexiunile la baza de date fără a afecta interfețele
grafice. ExpandableListAdapter(8) este o clasă pentru popularea containerelor de tip
ExpandableListView folosite pentru afișarea examenelor planificate.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
18
Scriptu rile PHP sunt folosite pentru a comun ica cu baza de date MySQL locală aflată pe un
server local pe siste mul de pe care a fost dezvoltată aplicația.
3.2 Aplicația Android
3.2.1 LoginActivity
În LoginActivity se află variabilele și metodele care
moștenesc Activity din SDK -ul Android care se ocupă cu
crearea unei ferestre unde dezvoltatorul poate adăuga
elemente grafice. Acest modul este primul care intră în
execuție în momentul lansării aplicației.
Variabilele de tip EditText sunt câmpuri în care utilizatorul va introduce Email -ul și parolă, urmat
de apăsarea buttonului de autentificare.
Metoda onCreate(..) inițializează activitatea. Cel mai important este că aici se setează layout -ul
care definește interfața. Această metodă este apelată în momentul lansării aplicației.
În momentul apăsării butonului de autentificare , metoda attemptLogin() este apelată , unde se
încearcă autentificarea folosind datele din câmpurile EditText.
Dacă autentificarea este validă și existentă în baza de date MySQL, în obiectul sesiune se vo r
păstra toate datele necesare utilizatorului conectat .
Metodele isEmailValid verifică caracterele introduse în câmpul Email să conțină “@” , iar
isPasswordValid să conțină mai mult de patru caractere.
LoginActivity
EditText mEmailView
EditText mPasswordView
Button email_sign_in_button
Session sesiune
onCreate(Bundle savedInstanceState)
attemptLogin()
isEmailValid(String Email)
isPaswordValid(StringPassword)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
19
3.2.2 AdminMainActivity
Obiecte Metode
BackGroundTask sendSpIDBackGroundTask ; onCreate(Bundle savedInstanceState)
BackGroundTask sendSemestruIDBackGroundTask ; VerificaPotAdaugaExamen()
BackGroundTask sendSemestruMethodBackGroundTask ; connectAdaugaExamen()
BackGroundTask populeazaMateriiBackGroundTask ; AddMaterieSpinnerItems(String[] v)
BackGroundTask PlanificaExamenBackGroundTask ; AddSalaSpinnerItems(String[] v)
BackGroundTask VerificaPlanificareExamenBackGroundTask ; AddSemestruSpinnerItems(String[] v)
LinearLayout adauga_ex_layout ; AddGrupaSpinnerItems(String[] v)
Button adauga_examen AddAnSpinnerItems(String[] v)
AddSpecializareSpinnerItems(String[] v)
Clasa AdminMainActivity conține șase obiecte importante de tipul BackGroundTask și sunt
folosite pentru a lansa în fundal fire de execuție care fac comunicarea cu baza de date MySQL.
Fiecare obiect are rolul lui de a trimite sau primi informații din bază de date , apoi cu ajutorul
metodelor destinate spinnerelor (spinner este un container care însușeste un „drop -down list”) se
populează drop -down -list’urile cu informații primite din rețea. De exemplu, lansând în execuție
sendSemestruIDBackGroundTask.execute(“get_m aterie_peSem”,semID) va returna din MySQL
conform cheii transmise “ get_materie_peSem” și parametrului semID care reprezintă semestrul
selectat de utilizator , toate materiile în funcție de semestru respectiv ,apoi datele/materiile primite
vor fi populate în drop -down -list folosind metoda AddMaterieSpinnerItems(String[] v) care
primește ca parametru vectorul cu materii.
Metoda onCreate(..) inițializează activitatea. Cel mai important este că aici se setează layout -ul
care definește interfața. Această me todă este apelată în momentul lansării aplicației. Layout -ul
este definit separat prin LinearLayout adaugă_ex_layout , ca după o planificare să poată fi
înlăturat și afișat examenele planificate. Modulul Admin moștenește Activity din SDK -ul
Android care se ocupă cu crearea unei ferestre unde dezvoltatorul poate adaugă elemente grafice. AdminMainActivity
BackGroundTask sendSpIDBackGroundTask ;
BackGroundTask sendSemestruIDBackGroundTask ;
BackGroundTask populeazaMateriiBackGroundTask ;
BackGroundTask PlanificaExamenBackGroundTask ;
BackGroundTask VerificaPlanificareExamenBackGroundTask ;
onCreate(Bundle savedInstanceState)
VerificaPotAdaugaExamen()
connectAdaugaExamen()
AddMaterieSpinnerItems(String[] v)
AddSalaSpinnerItems(String[] v)
AddSemestruSpinnerItems(String[] v)
AddGrupaSpinnerItems(String[] v)
AddSpecializareSpinnerItems(String[] v)
AddAnSpinnerItems(String[] v)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
20
VerificaPotAdaugaExamen() se apelează în momentul în care din baza de date au fost returnate
toate datele necesare unui examen deja planificat pe perioadă a plus/minus trei zile față de data
selectată la planificarea care urmează. Odată returnate , sunt aplicate anumite reguli :
Să nu mai fie un alt examen planificat pentru grupa selectată pe perioada
respectivă.
Profesorul s ă nu fie o cupat cu alt examen in acea dată/oră .
Asistentul s ă nu fie o cupat cu alt examen la acea dată/oră .
Sala s ă nu fie ocupat ă la aceeași dat ă/oră.
Toate aceste reguli se verifica prin a se compara datele examenelor deja planificate pe perioada a
plus/minus trei zile fata de data selectata , cu datele selectate de către utilizator din interfața grafica.
Dacă în procesul de comparație nu a intervenit nici o regul ă, examenul este planificat folosind
PlanificaExamenBackGroundTask.
3.2.3 StudentMainActivity
Obiecte Metode
BackGroundTask getExamenRecenteBackGroundTask ; onCreate(Bundle savedInstanceState)
BackGroundTask getExamenCronologicBackGroundTask ; GetExameneRecente()
List<String> groupList ; GetExameneCronologic ()
List<String> childList ; createGroupList ()
Map<String, List<String>> ColectieExamen ;
ExpandableListView expListView ;
Clasa StudentMainActivity conține două obiecte de tipul BackGroundTask care sunt folosite în a
lansa în fundal fire de execuție pentru a returna din baza de date examene planificate(recent) în
ordinea planificării și examene în ordinea cronologică după dată. StudentMainActivity
BackGroundTask sendSpIDBackGroundTask ;
BackGroundTask sendSemestruIDBackGroundTask ;
BackGroundTask populeazaMateriiBackGroundTask ;
BackGroundTask PlanificaExamenBackGroundTask ;
BackGroundTask VerificaPlanificareExamenBackGroundTask ;
onCreate(Bundle savedInstanceState)
VerificaPotAdaugaExamen()
connectAdaugaExamen()
AddMaterieSpinnerItems(String[] v)
AddSalaSpinnerItems(String[] v)
AddSemestruSpinnerItems(String[] v)
AddGrupaSpinnerItems(String[ ] v)
AddSpecializareSpinnerItems(String[] v)
AddAnSpinnerItems(String[] v)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
21
Examenele sunt afișate folosind obiectul expListView de tip ExpandableListView . Acest „view”
afisează câmpuri într -o listă verticală pe două niveluri. Grupuri care apoi pot fi extinse individual
pentru a le afișa copii(children). Astfel , listele groupLis t și childList sunt folosite pentru a memora
numele materiei pentru care se susține examenul, respectiv detaliile despre acel examen.
ColectieExamen este un obiect de tip Map care funcționează asemănător unei clase de tip dicționar,
cheie -valoare. Este fo losită pentru a memora toate grupurile(examenele) care trebuie afișate.
Metoda onCreate(..) inițializează activitatea. Cel mai important este că aici se setează layout -ul
care definește interfață. Această metodă este apelată în momentul lansării aplicaț iei, împreună cu
GetExameneRecente(), astfel studentul autentificat să vizualizeze direct examenele adăugate
recent. În GetExameneRecente() se realizează conexiunea la MySQL prin
getExamenRecenteBackGroundTask.execute(…), trimițând ca și parametru Grupa din care face
parte studentul autentificat.
GetExamenCronologic() este apelat în momentul apăsării butonului pentru a vizualiza examenele
cronologic . Funcționează pe același principiu că și GetExameneRecente().
CreateGroupList() populează expListView în momentul returnării tuturor examenelor din baza de
date.
3.2.4 ProfesorMainActivity
Obiecte Metode
BackGroundTask getExamenRecenteBackGroundTask ; onCreate(Bundle savedInstanceState)
BackGroundTask getExamenCronologicBackGroundTask ; GetExameneRecente()
List<String> groupList ; GetExameneCronologic ()
List<String> childList ; createGroupList ()
Map<String, List<String >> ColectieExamen ;
ExpandableListView expListView ;
ProfesorMainActivity
BackGroundTask sendSpIDBackGroundTask ;
BackGroundTask sendSemestruIDBackGroundTask ;
BackGroundTask populeazaMateriiBackGroundTask ;
BackGroundTask PlanificaExamenBackGroundTask ;
BackGroundTask VerificaPlanificareExamenBackGroundTask ;
onCreate(Bundle savedInstanceState)
VerificaPotAdaugaExamen()
connectAdaugaExamen()
AddMaterieSpinnerItems(String[] v)
AddSalaSpinnerItems(String[] v)
AddSemestruSpinner Items(String[] v)
AddGrupaSpinnerItems(String[] v)
AddSpecializareSpinnerItems(String[] v)
AddAnSpinnerItems(String[] v)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
22
ProfesorMainActivity funcționează pe același principiu ca și StudentMainActivity , diferența fiind
parametru trimis pentru fiecare BackgroundTask . În loc de Grupa va fi trimis numele profesorului
iar selecția se va face in funcție de acel nume. Din motive de simplitate a implementării se trimite
numele și nu id -ul profesorului.
3.2.5 Session
Obiecte + Metode „set” Metode „get”
SharedPreferences prefs ;
SharedPreferences.Editor editor ;
SetLogintrue(); getUserLoggedIn(); logoutUser();
setTipConectat(String tip); getTipConectat();
setID( int ID); getID();
setGrupa_id( int grupa); getGrupa_id();
setNume(String nume); getNume();
setPrenume(String prenume); getPrenume
setUserEmail(String email) ; getUserEmail();
setUserDetails( String cnp,String telefon, String adresa, String
data_nasterii, String loc_nastere , String cetatenie,String religie); getUserDetails();
Clasa Session folosește obiectul prefs de tip SharedPreferences din Android SDK. Un obiect de
acest tip indică un fișier care conține perechi cheie -valoare , utilizând metode simple pentru a le
citi/scrie. Fișierul de tip SharedPreferences se află pe dispozitivul în care este instalată aplicația.
SharedPreferences.Edi tor este o interfață folosită pentru a modifica valori unui astfel de obiect
precum prefs.
Metodele de tip set sunt definite de dezvoltator și nu de SDK. În momentul unei autentificări
valide , SetLoginTrue() va fi apelat iar apoi getUserLoggedIn() va re turna true. Astfel în prefs se
va scrie aceste detalii , iar aplicația va ști dacă utilizatorul este conectat sau nu , chiar și când Session
BackGroundTask sendSpIDBackGroundTask ;
BackGroundTask sendSemestruIDBackGroundTask ;
BackGroundTask populeazaMateriiBackGroundTask ;
BackGroundTask PlanificaExamenBackGroundTask ;
BackGroundTask VerificaPlanificareExamenBackGroundTask ;
onCreate(Bundle savedInstanceState)
VerificaPotAdaugaExamen()
connectAdaugaExamen()
AddMaterieSpinnerItems(String[] v)
AddSalaSpinnerItems(String[] v)
AddSemestruSpinnerItems(String[] v)
AddGrupaSpinnerItems(String[] v)
AddSpecializareSpinnerItems(String[] v)
AddAnSpinnerItems(String[] v)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
23
această este oprită și repornită . Restul detaliilor utilizatorului sunt scrise și citite din prefs folosind
restul metodel or de tip „set” și „get”.
setUserDetails(…) și getUserDetails() sunt folosite pentru a popula secțiunea Detalii Student sau
Detalii Profesor din StudentMainActivity respectiv ProfesorMainActivity.
Aplicația deține toate informațiile despre utilizator p ână când acesta apasă pe butonul Log Out .
Astfel , tot ce este scris în fișierul prefs este șters iar aplicația revine la activitatea de
Login(autentificare).
3.2.6 BackGroundTask
În BackGroundTask(BT) se află clasele care moștenesc AsyncTask din SDK -ul Android.
AsyncTask -urile folosesc fire de execuție care rulează în fundal fără a interacționa cu interfața.
Scopul lor este de a rulă fără că utilizatorul să își dea seamă , fără a apărea întreruperi în interfața
grafică. Metodele din această clasă sunt autogenerate de AsyncTask. De exemplu, în momentul ce
unui obiect de tip BT îi este apelată metoda „.execute(…)”, onPreExecute() din BT rulează
înaintea doInBackGround(…). Scopul ei este de a inițializa anumite obiecte/variabile care v or fi
utilizate mai departe . În cazul nostru, de obicei doInBackGround (…) primește ca parametrii
variabile de tip string care le folosește la a determina ce conexiune să facă cu bază de date MySQL
: să primească date , să trimită date sau ambele. Prin a trimite date s -a folosit metoda de a face o
cerere prin „POST” , iar pentru a primi date, „GET”. La finalul unei cereri , doInBackground(…) BackGroundTask
AdminMainActivity adminMainActivity ;
StudentMainActivity studentMainActivity ;
ProgressDialog progressDialog;
onPreExecute();
doInBackGround(String… params);
onPostExecute(String result);
showDialog(String title, String message, String code);
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
24
va returna un strîng care reprezintă datele de tip JSON primite din baza de date MySQL prin
intermediul scripturilor PHP.
Acest string de tip JSON este transmis apoi la onPostExecute(String result) . Fiecare JSON
transmis de scripturile PHP , conține o pereche exemplu : {„code”:”….”}. În funcție de acel code,
onPostExecute(…) știe cum să interpreteze mai departe datele JSON . ProgressDialog este folosit
pentru a afișa o fereastră mică care indica progresul prin interfața grafică . De exemplu, metoda
showDialog() indică faptul că aplicația incearcă să se conecteze la serverul MySQL de fiecare dată
când se face o cerere.
Obiectele de tip AdminMainActivity și StudentMainActivity sunt utilizate pentru a putea avea
acces la metode din activitătile admin respectiv student.
3.2.7 DateJson
DateJsonStorage (DS) date_json (DJ)
date_json[] DateJsonSpecializare; setID(int id);
date_json[] DateJsonGrupa; setAnID(int id);
date_json[] DateJsonSemestru; setCapacitate(int capacitate);
date_json[] DateJsonMaterie; setNume( String nume);
date_json[] DateJsonAn; setProfesor(String profesor);
date_json[] DateJsonSala; setAsistent(String asistent);
date_json[] DateJsonExamenVerificare; setTip_examinare(String tip_examinare);
date_json[] DateJsonExamenRecentPlanificatStudent; setGrupa(String grupa);
setMaterie(String Materie)
setData(String ora); setOra(String ora); setSala(String sala);
getID(); getAnID(); getProfesor(); getAsistent(); getGrupa();
getMaterie(); getData(); getOra(); getSala();
3.2.7 date_json & DateJsonStorage
Modulul DateJson conține două clase DateJsonStorage(DS) și date_json (DJ). DS este format din
vectori de obiecte de tip DJ. Fiecare vector este folosit pentru a ține minte informații referitoare la
specializare ,grupă, semestru ,materie, An, Sală , Examene . De exemplu , în momentul în care au
fost returnate date JSON refer itoare la Sală din bază de date MySQL, în metoda onPostExecute()
din BackGroundTask vor fi interpretate și apoi salvate în DS . Modulul DateJson
BackGroundTask sendSpIDBackGroundTask ;
BackGroundTask sendSemestruIDBackGroundTask ;
BackGroundTask populeazaMateriiBackGroundTask ;
BackGroundTask PlanificaExamenBackGroundTask ;
BackGroundTask VerificaPlanificareExamenBackGroundTask ;
onCreate(Bundle savedInstanceState)
VerificaPotAdaugaExamen()
connectAdaugaExamen()
AddMaterieSpinnerItems(String[] v)
AddSalaSpinnerItems(String[] v)
AddSemestruSpinnerItems(String[] v)
AddGrupaSpinnerItems(String[] v)
AddSpecializareSpinnerItems(String[] v)
AddAnSpinnerItems(String[] v)
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
25
Ex: DateJsonStorage.dateJsonSala[i].setNume (element.get( "nume_sala" ));
DateJsonStorage.dateJsonSala[i].setID( element.ge t("sala_id" ));
DateJsonStorage.dateJsonSala[i].setCapacitate( element.get( "capaictate" ));
Desigur, pentru Sală sunt îndeajuns a se apela doar 3 metode din DJ, dar pentru un alt caz , cum ar
fi informații pentru un examen planificat sunt nevoie de apelări a mai multor metode.
Vectorii de tip DJ sunt declarați statici pentru a putea fi vizibili și la fel pentru tot restul aplicației.
3.2.8 ExpandableListAdapter [8]
ExpandableListAdapter este un modul preluat de pe web [8] și adaptat la proiectul curent.
Este utilizat pentru popularea containerelor de tip ExpandableListView folosite la afișarea
examenelor planificate. Inițial a fost construit pentru afișarea a mai multor modele de
laptopuri.
ExpandableListAdapter
Map<String, List<String>> ColectiiExamen ; List<String> materii ;
XML: group_item.xml , child_item.xml
Figura 3.3 ExpandableListView -Explicat [8]
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
26
În Figura 3 .3 [8] , este evidențiat cum este structurat modulul , format în principal dintr -o
structură de tip Listă și Map . Map este folosit pentru a stoca Grupurile(Nume Firme Laptopuri)
care la rândul lor fiecare Group conține un Child List reprezentând o lista de detalii(modele
laptop de la firmă respectivă).În cazul aplicației noastre , Group reprezintă ce examen este
planific at ,iar Child List detaliile despre examenul respectiv. Pentru a ș ti cum sa fie afișate cele
două nivele in interfața grafică , se fol osesc două fișiere
de tip .xml : group_item.xml și child_item .xml. Astfel , interfața știe să își preia caracteristici
precum înălțimea, lățimea, mărimea textului , culoarea etc.
3.3 Scripturile PHP
Conexiunea la baza de date se face prin cereri de
tip „POST” sau „GET” prin intermediul
aplicației. Fiecare cerere este interpretată de
fișierele PHP corespunzătoare. Scopul fișierelor
.php in proiectul acesta este de a extrage
informații din baza de date MySQL și a le returna
înapoi aplicației in format JSON. Mai departe
totul este interpretat de către modulul BackGroundTask din aplicație.
Figura 3.4 PHP Script
De exemplu , când va intra in execuție getExamenCronologicBackGroundTask .execute(param) , o
cerere va fi trimisă scriptului get_examen_planificat_student_cronologic.php care va returna
toate examenele studentului autentificat in ordine cronologica după data . Daca data examinării
a trecut , atunci scriptul nu va returna examenele respective.
– connect.php este un script esențial in realizarea conexiunii la baza de date ind icând un
cont cu nume și parolă , numele bazei de date și locația acesteia . Acest script este inclus
in toate celelalte fișiere te tip .php .
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
27
3.4 Baza de date MySQL
Sistemul de gestiune a bazelor de date pe care l -am ales a fost MySQL. Motivele au fost
compatibilitatea cu majoritatea sistemelor de operare și familiaritatea cu interfața
phpMyAdmin.
numele bazei de date
tabelele utilizate pentru Planificarea
. unui examen .
Figura 3.5 Tabele Baza de date
În Figura 3.5 se observă că structura bazei de date este relativ simplă. Tabela an_universitar conține
un câmp referitor la anul I,ÎI,III sau IV și este legată de tabela grupă prin câmpul an_id.
Tabela grupă este folosită pentru a menține informații referitoare l a numele grupei, din ce
specializare face parte și ce an. Este legată de specializare, an_universitar și users.
materie reprezintă tabela ce deține informații despre specializarea din care face parte,
numele profesorului și asistentului , tipul examinării materiei și semestrul din care face
parte. Este legată de tabela specializare, sală și semestru.
sala menține informații referitoare la numele sălii și nr. lo curi .Este legată de materie.
semestru tine informații despre anul din care face parte semestrul, acestea fiind
structurate ca fiind 8 semestre. Ex. AN I, sem 1= Sem I, AN III, sem 2= Sem.6 . Este
legata de materie.
specializare are un câmp reprezentând numele specializării . Ex. Ingineria Sistemelor
Multimedia (ISM). Este legată de materie și grupă .
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
28
tip_user reprezintă cele trei tipuri de utilizatori ai aplicației . 1.Student, 2. Profesor,
3.secretara. Este legata de users.
users reprezintă tabela cu utilizatorii înregistrați in baza de date, împreună cu detaliile
personale fiecăruia . Este legata de grupa și tip_user.
Tabela planificări reprezintă toate informațiile referi toare la o planificare rezultată din
toate celelalte tabele. Din motiv e de simplitate a implementării , nu am legat tabela cu
restul folosind id -uri ci a m transformat totul in string .
3.5 UI
După cum am menționat mai sus, aplicația este structurată pe trei activități principale: Student,
Profesor și Secretara. Fiecare dintre cele trei conține o interfață grafică generală , având diferit
secțiunile din meniu. Meniul folosit este standard , tipic Android, p reluat din Android SDK. O
scurtă structură a interfeței este evidențiat in Figura de mai jos.
Figura 3.6 Mockup Meniu StudentMainActivity
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
29
4. Implementarea Modulelor
In prima idee , proiectul a fost gândit pe principiu unei pagini Web, care apoi sa fie accesat de
o aplicație Android. Totul era bazat pe acel site și aplicația care nu făcea decât sa acceseze site -ul
și sa-l afișeze î ntr-un WebView (container din SDK -ul Android pentru a afișa pagini web). În scurt
timp am constatat că aplicația care mi -am propus să o realizez nu era decât un fel de browser pentru
Androi d ,iar acest lucru nu era ceea ce îmi doream.
In continuare voi prezenta componentele proiectului ,din ce sunt formate, cum au fost
implementate si cu ce medii de dezvoltare au fost dezvoltate, totul având responsabilitate proprie.
Din motive de simplitat e in anumite circumstanțe , unele componente au fost imp lementate
utilizând metode mai convenabile . Din lipsa unor resurse, implem entarea unei baze de date locală
pe dispozitivul Android nu s -a putut realiza până la final. Toate modulele au fost realizate i n iterații
, in timp aplicând refractoring pentru reorganizarea tuturor variabilelor și metodelor. Aplicația este
structurată pentru trei tipuri de utilizatori: 1.Student , 2.Profesor, 3.Secretara.
4.1 Implementare Aplicație Android + Scripturi PHP
4.1.1 Logo și Denumire Aplicație
Pentru logoul aplicației s-a folosit o iconița preluat ă de pe web [10]
și adaptată puțin in stilul Android. Acesta sugerează un om/student, ne –
absolvent încă, care citește dintr -o carte, reprezentând studiul pentru un
examen. Pentru denumire am ales o pres curtare din limba engleză .
OES – Online Exam Scheduling (Planificator online de examene) .
OES
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
30
4.1.2 Autentificare
4.2.2.1 Autentificare Validă
In momentul î n care un utilizator lansează
aplicația și nu s -a mai autentificat pana acum, poate
sa se autentifice folosind un cont oferit de
universitate la scurt timp de înscriere in facultate in
anul I. Contul consta într-o adresă de email și parolă .
Pentru simplitate in teste, s -au folosit parole de un
caracter.
Tot in momentul lansării aplicației , Activitatea
LoginActivity va executa după toate inițializările
elementelor grafice, următorul cod:
Figura 4.1
sesiune.getUserLoggedIn() returnează true daca pentru o autentificare din trecut nu a
fost apăsat butonul de Log Out , iar false in caz contrar.
sesiune.getTipConectat() returnează un string conținând una din cele trei cifre:1 , 2
sau 3 .
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
31
Acest cod executat verifica daca mai exista deja o sesiune exist entă și ce tip de utilizator
este deja autentificat: 1.S tudent , 2.Profesor, 3.Secretară . Daca una dintre aceste condiții
este îndeplinita , va fi lansată mai departe activitatea corespunzătoare utilizatorului deja
conectat. In caz contrar , interfa ța pentru autentificare va fi afișată .
Obiectul „sesiune” folosește clasa Session care utilizează obiectul prefs de tip
SharedPreferences din Android SD K. Un obiect de acest tip indică un fișier care conține
perechi cheie -valoare , utilizând metode simple pentru a le citi/scrie. Fișierul de tip
SharedPreferences se află pe dispozitivul în care este instalată aplicația.
SharedPreferences.Editor este o interfața folosită pentru a modifica valori unui astfel de obiect
precum prefs.
In momentul autentificării valide a unui utilizator , metodele SetLoginTrue() și
SetTipConectat() din clasa Session vor fi apelate.
Toate acțiunile de tip “write” in fișierul prefs se realizează prin apelurile me todelor
respective urmat de .commit() sau .apply(), acestea fiind metodele clasei
SharedPreferences din Android SDK.
SetLoginTrue() , scrie local in fișierul prefs din Android cum c ă o autentificare
este valid ă , folosind cheia "login_status" cu valoarea true de tip boolean . public class Session {
private SharedPreferences prefs;
SharedPreferences.Editor editor;
Context cntx;
public Session(Context cntx) {
this.cntx=cntx.getApplicationContext();
prefs = PreferenceManager. getDefaultSharedPreferences (cntx);
editor=prefs.edit();
}
public boolean SetLoginTrue(){
prefs.edit().putBoolean( "login_status" ,true).commit();
return true ;
}
public boolean getUserLoggedIn() {
boolean isLoggedIn =prefs.getBoolean( "login_status" ,false);
return isLoggedIn ;
}
public void setTipConectat(String tip) {
prefs.edit().putString( "tip", tip).commit();
}
public String getTipConectat() {
String tip = prefs.getString( "tip","");
return tip;
} … Figura 4.2
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
32
setTipConectat(String tip) , scrie in fișierul prefs tipul utilizatorului conectat (1,2 sau 3) ,
primit ca valoare in momentul apelării metodei. Este folosita cheia “ tip” cu valoarea
tip(String) . Pentru a cunoaște tipul utilizatorulu i care încearcă sa se autentifice , se executa
următorul cod din LoginActivity :
Figura 4 .3
In Figura 4.3 avem String email si password care reprezintă datele completate de
către utilizator î n interfața grafica , String method care reprezintă “cheia” “login ”
identificata apoi in fundal de către modulul BackgroundTask pentru a lansa fire de execuție
în scopul de a returna informații din baza de date MySQL.
backgroundtask.execute(method,email,password) primește ca parametrii cheia
folosită , emailul si parola utilizatorului cu care apoi creează un nou fir de execuție
folosind acei parametrii (Figura 4 .4). String email = mEmailView .getText().toString();
String password = mPasswordView .getText().toString();
String method = "login";
BackGroundTask backgroundtask= new BackGroundTask( this);
backgroundtask.execute(method,email, password);
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
33
Figura 4 .4 cod Java Android clasa BackGroundTask
În Figura 4.4 avem method care reprezintă parametrul 0 primit î n momentul apelării metodei
.execute, login_name și login_password parametrul 1 respectiv parametrul 2, iar login_url care
semnifica adresa url a scriptului PHP aflat local pe serverul Wamp, destinat extragerii informațiilor
din baza de date MySQL. String localhost= "http://192.168.1.53" ;
String login_url= localhost+ ":8383/webapp/login.php" ;
String method = params[ 0];
if(method.equals( "login"))
{
String login_name = params[ 1];
String login_pass=params[ 2];
try {
URL = new URL(login_url);
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setRe questMethod( "POST");
httpURLConnection.setDoOutput( true);
httpURLConnection.setDoInput( true);
OutputStream = httpURLConnection.getOutputStream();
BufferedWriter = new BufferedWriter(
new OutputStreamWriter(outputStream, "UTF-8"));
String data = URLEncoder. encode("login_name" ,"UTF-8")
+"="+URLEncoder. encode(login_name, "UTF-8")
+"&"+URLEncoder. encode("login_pass" ,"UTF-8")+"="+URLEncoder. encode(login_pass, "UTF-
8");
bufferedWriter.write(data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream = httpURLConnection.getInputStream();
BufferedReader = new BufferedReader( new InputStreamReader(inputStream, "iso-
8859-1"));
String ra spuns ="";
String linie = "";
StringBuilder stringBuilder= new StringBuilder();
while((linie=bufferedReader.readLine())!= null){
raspuns+= linie;
stringBuilder.append(linie+ "\n");
}
bufferedRea der.close();
inputStream.close();
httpURLConnection.disconnect();
return raspuns;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Interrup tedException e) {
e.printStackTrace();
}
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
34
Se creează conexiunea către scriptul PHP folosind obiectul de tip
HttpURL Connection , prin login_url.
Se setează metoda de cerere „POST” deoarece trimitem email și parola către script
care apoi trimite la server . httpURLConnection.setRequestMethod( "POST" );
Setăm pe true faptul c ă trimitem și primim informații de la server.
Creăm un obiect de tip OutputStream pentru a trimite un stream la server.
Folosind un BufferedWriter set ăm tipul de encodare UTF -8 pentru outputstream.
În String data scriem datele noastre primite ca parametru 1 și 2 pe principiu cheie –
valoare ca apoi s a poată fi interpretat de scriptul PHP. Exemplu: cheia „login_name”
cu valoarea de tip String login_name.
Scriem String data folosind bufferedWriter. bufferedWriter.write(data);
Trimitem bufferedWriter . bufferedWriter.flush();
Închidem bufferedWriter. bufferedWriter.close();
Închidem outputStream. outputStream.close();
În acest moment datele au fost trimise către scriptul PHP care la rândul lui trimite înapoi un răspuns
de tip JSON.
Creăm un obiect de tip inputStream pentru a b ăga informațiile de la server.
Creăm un obiect de tip bufferedReader pentru a citi informațiile din inputStream
,folosind Unicode „iso -8859 -1” deoarece primim informații de la un script PHP utilizat
în general pentru cereri pentru pagini web.
atâta timp c ât se pot citi date din bufferedReader , în variabila răspuns este scris ă fiecare
linie citit ă din buffer .
se închide bufferedReader. bufferedReader.close();
se închide inputStream. inputStream.close(); String raspuns = "";
String linie = "";
StringBuilder stringBuilder= new StringBuilder();
while((linie=bufferedReader.readLine())!= null){
raspuns+= linie;
stringBuilder.append( linie+"\n");
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
35
se închide conexiunea httpURLConnection. httpURLConnection.disconnect();
se returnează răspunsul de la server. return raspuns;
În momentul apelării funcției bufferedWriter.flush(); , login_name si login_pass
introduse de utilizator în câmpurile din interfața grafic ă, vor fi trimise scriptului php
login.php prin login_url de la HttpURLConnection. Scriptul login.ph p arat ă cam așa:
Figura 4 .5 cod PHP din scriptul login.php
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
36
In Figura 4 .5 , connect.php este un script esențial in realizarea conexiunii la baza de
date indicând un cont cu nume și parol ă , numele bazei de date și locația acesteia .
Acest script este inclus în toate celelalte fișiere te tip .php .
$user_name=$_POST["login_name"]; și $user_pass=$_POST["login_pass"]; sunt
variabilele în care se vor stoca informațiile , în cazul acesta numele și parola primite
prin „POST” de la aplicație . Modul de a le identifica este cheia "login_name" sau
"login_pass" introduse anterior in BackGroundTask din aplicație.
În variabila $sql_query este selectul corespunzător pentru returnarea întregii
înregistrări din baza de date, unde câmpurile email și parola corespund cu datele venite
prin „POST”.
$result execut ă selectul de mai sus folosind $con (conexiunea la MySQL) din
connect.php
Mai departe , daca exist ă înregistrări după acele câmpuri , se vo r salva in variabile
separate fiecare detaliu necesar despre utilizatorul respectiv preluate din baza de date
MySQL , tabela users Figura 4.6.
Figura 4.6 Tabela users din MySQL
Câmpurile extrase sunt împărțite pe doua categorii și o categorie care reprezintă
răspunsul de la server, pozitiv sau negativ. În variabila $code este scris dac ă
autentificarea a fost cu succes sau cu eșec. În cazul în care este cu succes , datele vor fi
trimise și apoi interpretate de aplicația Android.
Cele trei categorii c are se trimit sunt de fapt trei array’uri $response , $credentials și
$user_details , reprezentând răspunsul de la server , datele de autentificare alte
utilizatorului și ultimul array, datele personale .
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
37
Astfel , la final scriptul va face un echo de tip JS ON , reprezentând un array de array’uri
cu cele trei categorii ca in Figura 4.7 .
Figura 4.7 echo JSON login.php
Datele de tip JSON din Figura 4.7 vor fi introduse in InputStream din BackGroundTask -ul
anterior (Figura 4.4) și returnate într-un final in variabila „ raspuns ”. Acest JSON conține și
perechile cheie -valoare necesare pentru a ști tipul de utilizator care se conectează și dac ă
conexiunea a fost cu succes..
După ce „ raspuns ” a fost returnat , mai departe se va apela metoda onPostExecute(String
raspuns) ca v a interpreta toate datele JSON in funcție de cele doua perechi.
Codul executat este următorul :
{
"server_response": [{
"code": "login_true",
"message": "Salut Nemes!"
}],
"user_credentials": [{
"email": "nemes.florin13@yahoo.com",
"nume": "Nemes",
"prenume": "Florin",
"tip": "1",
"user_id": "3",
"grupa_id": "1"
}],
"user_details": [{
"cnp": "19303133378 20",
"telefon": "754392276",
"adresa": "cl.turnisorului nr 151",
"data_nasterii": "1993 -03-13",
"loc_nastere": "Cisnadie",
"cetatenie": "Romana",
"religie": "ortodoxa"
}]
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
38
Figura 4.8 onPostExecut e(..) protected void onPostExecute(String raspuns) {
try {
JSONObject jsonObject = new JSONObject(raspuns);
JSONArray = jsonObject.getJSONArray( "server_response" );
JSONObject JOresponse = jsonArray.getJSONObject( 0);
String code = JOresponse.getString( "code");
String message = JOresponse.getString( "message" );
if (code.equals( "login_true" )) {
JSONObject jsonObjectCred = new JSONObject(raspuns);
JSONArray jsonArrayCred = jsonObjectCred.getJSONArray( "user_credentials" );
JSONObject JOuser = jsonArrayCred.getJSONObject( 0);
String email = JOuser.getString( "email");
String nume = JOuser.getString( "nume");
String prenume = JOuser.getString( "prenume" );
String tipUser = JOuser.getString( "tip");
int user_id=JOuser.getInt( "user_id" );
int grupa_id=JOuser.getInt( "grupa_id" );
JSONObject jsonObjectUserDetails = new JSONObject(raspuns);
JSONArray jsonArrayUserDetails = jsonObjectUserDetails.getJSONArray( "user_details" );
JSONObject JOdetails = jsonArrayUserDetails.getJSONObject( 0);
String cnp = JOdetails.getString( "cnp");
String telefon = JOdetails.getString( "telefon" );
String adresa = JOdetails.getString( "adresa" );
String data_nasterii = JOdetails.getString( "data_nasterii" );
String loc_nastere = JOdetails.getString( "loc_nastere" );
String cetatenie = JOdeta ils.getString( "cetatenie" );
String religie = JOdetails.getString( "religie" );
sesiune = new Session( ctx);
sesiune.setID(user_id);
sesiune.setGrupa_id(grupa_id);
sesiune.setUserEmail(email);
sesiune.setNume(num e);
sesiune.setPrenume(prenume);
sesiune.SetLoginTrue();
sesiune.setTipConectat(tipUser);
sesiune.SetUserDetails(cnp, telefon, adresa, data_nasterii, loc_nastere, cetatenie,
religie);
String TipConectat = sesiune.getTipConectat();
boolean elogat = sesiune.getUserLoggedIn();
if (elogat == true && sesiune.getTipConectat().equals( "1")) {
Intent i = new Intent(activity , StudentMainActivity. class);
activity .startActivity(i);
activity .finish();
} else if (sesiune.getUserLoggedIn() == true &&
sesiune.getTipConectat().equals( "2")) {
Intent i = new Intent(activity , ProfesorMainActivity. class);
activity .startActivity(i);
activity.finish();
} else if (sesiune.getUserLoggedIn() == true &&
sesiune.getTipConectat().equals( "3")) {
Intent i = new Intent(activity , AdminMainActivity. class);
activity .startActivity(i);
activity .finish();
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
39
Parametru primit la apelare reprezintă String’ul cu datele returnate din baza de date. Interpretarea
datelor se realizează in funcție de ordinea array’urilor din String. Prima oar ă se extrag din
„server_response ” , cel mai important informațiile după cheia numita „code” pentru a ști mai
departe de la ce script au venit datele și cum trebuie interpretate. Array’urile se păstrează
folosind obiecte de tip JSONArray , apoi fiecare element cu JSONObject.
In cazul autentificării valide , codul primit este „login_true”. Folosind tot obiecte de tip
JSONArray și JSONObject se salvează datele de autentificare (email, nume, prenume, tip ,
grupa_id , user_id) și datele personale ale utilizatorului ( cnp, telefon , adresa , d ata_nasterii,
loc_nastere, cetatenie , religie). Desigur, toate acestea puteau fi puse într-un singur JSONArray ,
dar pentru un mod mai organizat s -a împărțit pe categorii.
După ce toate datele au fost introduse in variabile și obiecte , se creează o noua sesiune de tip
Session și se setează fiecare informație folosind metodele specifice din Session. Datele
personale ale utilizatorului vor fi folosite ulterior în activitatea StudentMainActivity , respectiv
ProfesorMainActivity.
In continuare , ca și in momentul lansării aplicației , se verifica faptul ca autentificarea este
valida (true) și ce tip de utilizator s -a autentificat: 1.Student , 2.Profesor, 3.Secretar ă . Când una
dintre aceste condiții este îndeplinită , va fi lansat ă mai departe activi tatea corespunzătoare
utilizatorului și așa se poate considera ca unul dintre cele trei persoane este autentificat și poate
utiliza aplicația mai departe. .
4.2.2.2 Autentificare Invalid ă
Daca datele introduse de utilizator nu corespund cu datele din baza de date MySQL , scriptul
login.php va returna tot un Array de tip JSON , având codul „login_false” care apoi va fi tratat
corespunzător . Astfel, se va executa următorul cod:
else if (code.equals( "login_false" )) {
showDialog ("Eroare" , message, code);
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
40
Figura 4.9 login_false
Codul „login_false” va îndruma aplicația în a afișa un mesaj de alert ă utilizatorului în care
specifica cum c ă autentificarea este nereușita și sa încerce din nou. Mesajul de eroare afișat este
preluat din datele de tip JSON venite de la server/scriptul login.php . Mesajul se afla in Array’ul
cu cheia „message” . Figura 4 .10
Figura 4.10 Eroare Autentificare
4.1.3 AdminMainActivity – Planificare Examen
În cazul autentificării cu un cont de secretar ă , se va lansa AdminMainActivity conform Figurii
5.8 , afișând o interfață grafic ă specific ă aplicației pentru secretara. Ca și ecran de pornire ,
utilizatorului ii va fi afișat secțiunea de examene planificate recent. La apăsarea butonului care
indica crearea unei noi înregistrări , poziționat dreapta -jos , un nou „layout” pentru
planificare (Adaugă Ex. ) va trece din starea „gone” în „visible” Figura 4.11, iar butonul împreuna
cu „layout” ul anterior vor dispărea .
adauga_ex_layout .setVisibility(View. VISIBLE);
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
41
Datorit ă dimensiunii înguste a ecranului unui dispozitiv
Android , cel mai convenabil mod de a selecta anumite
informații încadrate pe categorii , este prin utilizarea unui
sistem de meniuri care folosește spinner Android (d rop-down
list) Figura 4.11 . Pentru selectarea ora/data s -au folosit
containerele TimePicker și DatePicker din Android SDK.
Fiecare drop -down list reprezintă o categorie . Fiecare categorie
conține mai multe elemente . De exemplu, in cazul nostru , din
categoria Specializare se poate alege dintr -o list ă , un element
reprezentând o anumita specializare. Implicit este selectat
primul element din lista.
Elementele din fiecare categorie sunt preluate din baza de date
MySQL . O mare parte din p opularea listelor drop -down se
realizează secvențial , cu excepția categoriei s ălii, anului și a
specializării , deoarece extragerea lor nu depind de nici o
condiție . Ultimele două categorii reprezintă data și ora actual ă
a dispozitivului Android.
Popularea secvențiala se realizează in felul următor :
În momentul inițializării „layout -ului” , prima oar ă se
populează specializarea , anul , sala și se selectează implicit prima
înregistrare din fiecare lista. Aici apare secvențialitatea .
După ce Specializarea și Anul au fost selectate , id -ul specializării
și al anului sunt folosite pentru a popula mai departe categoria Grupa
cu grupe le corespunzătoare specializării , in funcție de an . Anul mai
Figura 4.11 Adauga Examen
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
42
este folosit pentru a popula Semestru. Semestru depinde de an deoarece în baza de date , exist ă tabela
an_universitar cu câmpurile I,II,II,IV , iar fiecărui an ii sunt asociate doua semestre: De exemplu ,
pentru anul I corespund semestrele 1 și 2, pentru anul II semestrele 3 și 4. Astfel, anul universitar
este încadrat pe opt semestre , respectiv patru ani. Popularea materiilor depind de Specializarea
aleas ă și semestru ales iar Sala nu depinde de nici un alt factor.
Popularea secvențiala ca și implementare se realizează in felul următor :
Elementul selectat din lista cu specializări este preluat folosind metoda
.setOnItemSelectedListener(…) pentru spinner din Android SDK. Următorul cod se va
executa:
Figura 4 .12 On Select Spinner Specializare
După selecție , se verifica daca elementul de pe poziția „i” din lista corespunde cu
elementul de pe aceeași poziție din vectorul de specializări primit din baza de date.
Aceast ă verificare se realizează pentru a putea extrage id -ul specializării selectate ,
deoarece spinnerul din Android SDK nu poate stoca și id -ul elementelor din list ă. Astfel
, după identificarea specializării , se lansează fire de execuție in fundal folosind
BackGroundTask , asemeni F igurii 5.4 împreuna cu 5.8 , pentru a putea popula mai
departe Grupa și Materia, bazat pe id -ul specializării .
La momentul selectării unei specializări , categoriile pentru an și semestru sunt deja
populate din momentul lansării layout’ului. spSpecializare .setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int
position, long id) {
String curSelected = ( String) parentView.getItemAtPosition(position);
for(int i=0;i<DateJsonStorage. nrSpecializari ;i++){
if(curSelected.equals(DateJsonStorage. dateJsonSpecializare [i].getNume())) {
sendSpIDBackGro undTask = new BackGroundTask( thisCTX);
SpID=String.valueOf(DateJsonStorage. dateJsonSpecializare [i].getID());
String method = "send_SpID" ;
String methodSendSemId = "send_semID" ;
sendSpIDBackGroundTask .execute(method, SpID,AnID);
populeazaMateriiBackGroundTask = (BackGroundTask) new
BackGroundTask( thisCTX).execute(methodSendSemId, SpID,SemestruID );
break;
}
}
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
43
Popularea secvențiala se realizează asemănător pentru fiecare categorie.
Pentru extragerea informațiilor din baza de date, s -au folosit următoarele scripturi PHP
corespunzătoare cererii SQL.
Specializare: get_specialziare.php.
Cererea pentru selectarea specializării nu depinde de nimic , deci nu este pus ă nici o condiție .
An: get_an.php
Cererea pentru an este la fel ca pentru specializare.
Grupa:get_grupa.php
In $var1 și $var2 se stochează id-ul specializare respectiv id -ul anului venite prin „POST” ,
conform Figurii 4.4 și 4 .12, iar apoi se realizează cererea SQL in funcție de cele doua variabile.
Din tabela grupa este extras ă capacitatea (nr locuri ) pentru a putea fi comparat numărul
studenților cu numărul de locuri din sal ă. Pentru asta, in corpul .setOnItemSelectedListener(…)
din spGrupa(Spinner Grupa)este executat următorul cod:
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
44
Dacă Nr. Studenți mai mare ca Nr.Locuri sal ă, utilizatorul este notificat printr -o alert ă . Aceeași
alertă este afișată și în cazul selectării unei Sali cu Nr locuri mai puține decât nr Studenți Grup ă.
Semestru:get_semestru.php
In $var se stochează id-ul anului venit prin POST , conform Figurii 4.4 și 4 .12, iar apoi se
realizează cererea SQL bazat ă pe acea variabila.
Materia:get_materie.php
În cele doua variabile se stochează id-ul specializării , respectiv id -ul semestrului venite prin
POST, c onform Figurii 4.4 și 4 .12, iar apoi se realizează cererea SQL bazat ă pe aceste variabile.
if (spSala.getCount() != 0) {
int capacitateSala =
DateJsonStorage. dateJsonSala [spSala.getSelectedItemPosition()].getCapacitate();
int capacitateGrupa = DateJsonStorage. dateJsonGrupa [i].getCapacitate();
if (capacitateGrupa > capacitateSala)
alertDialogCapacitateSala .show();
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
45
Sala: get_sala.php
Cererea pentru sal ă este asemeni cererii anului și specializării .
După ce toate categoriile au fost alese și Data/Ora au fost setate corespunzător , la apăsarea
butonului de „Adauga Examen” se va crea un nou fir de execuție de tip BackGroundTask cu
toate datele selectate din interfață
(VerificaPlanificareExamenBackGroundTask.execute(method,Specializare,Grupa,Materie,Profes
or,Asistent,Tip_examinare,Data,Ora,Sala);), în scopul de a ver ifica daca planificarea poate avea
loc in funcție de anumite restricții :
Planificarea unui examen pentru o grup ă trebuie sa fie la interval de 3 zile înainte
sau după data unui alt examen.
Se verific ă ca profesorul să nu fie prezent la un alt examen in acea dat ă și oră.
Se verific ă ca asistentul să nu fie prezent la un alt examen in acea dat ă și oră.
Se verific ă ca sala selectat ă sa nu fie ocupat ă la aceeași dată/oră.
Verificarea acestor restricții se realizează în aplicație prin cod Java și nu prin scripturi PHP. La
momentul apelării VerificaPlanificareExamenBackGroundTask.execute(..) , se folosește scriptul
verifica_planificare.php care primește ca parametru doar data selectat ă de utilizator și apoi se
extrag toa te informațiile necesare din baza de date la interval de +/ – trei zile de la data primit ă
prin POST. Figura 4.13 . Code returnat de acest script este „verifica_planificare”.
Figura 4 .13 verifica_planificare.php
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
46
Astfel , toate informațiile pe acele șase zile sunt returnate și stocate în aplicație folosind modulul
DateJsonStorage. Ca și pentru restul informațiilor , stocarea se face in funcția onPostExecute(..)
din BackgroundTask . In cazul curent , codul pentru interpretare returnat de scriptul PHP se
numește „verifica_planificare”. Fiecare câmp este salvat in
DateJson Storage.DateJsonExameneVerificare[i].
După cum se poate observa in Figura 4 .14 logica de verificare a restricțiilor este in felul următor :
Se inițializează o variabila poateAdaugaExamen de tip Boolean pe true.
Se compara fiecare grup ă de pe cele șase zile cu grupa selectat ă de utilizator, iar
dacă se găsește o potrivire , poateAdaugaExamen trece pe false.
Se compar ă dacă un profesor apare in cele șase zile in aceeași data si același interval
de examinare (3 ore). Daca există, poateAdaugaExamen se setează pe false.
Figura 4 .14 VerificaPotAdaugaExamen() ;
Se compar ă dacă un asistent apare in cele șase zile in aceeași dată si același interval de
examinare. Dacă exista, poateAdaugaExamen se setează pe false. boolean poateAdaugaExamen = true;
if (DateJsonStorage. dateJsonExamenVerificare [i].getGrupa().equals(Grupa)) {
poateAdaugaExamen = false;
alertDialogPlanificare .setMessage( "Eroare planificare! Interval zile grupa
nerespectate ”)
alertDialogPlanificare .show();
break; }
if (((dataUI.compareTo(dataDBMinusTrei) == 1) && (dataUI.compareTo(dataDBPlusTrei)
== -1 || dataUI.compareTo( dataDBPlusTrei) == 0))
&& DateJsonStorage. dateJsonExamenVerificare [i].getData().equals(Data)
&& DateJsonStorage. dateJsonExamenVerificare [i].getProfesor().equals(Profesor)) {
poateAdaugaExamen = false;
alertDialogPlanificare .setMessage( "Eroare planificare! Prof." +Profesor+ " va fi
in examen intre orele " +String. valueOf(dataDB.getHours())+ " – "+
String.valueOf(dataDBPlusTrei.getHours()));
alertDialogPlanificare .show();
break;}
. . . ..
if (poateAdaugaExamen) {
String methodAdauga = "planifica_examen" ;
PlanificaExamenBackGroundTask = new BackGroundTask( thisCTX);
PlanificaExamenBackGroundTask .execute(methodAdauga, Specializare, Grupa,
Materie, Profesor, Asistent, Tip_examinare, Data, Ora, Sala);
alertDialogPlanificare .setMessage( "Examen Planificat cu Succes!!" );
alertDialogPlanificare .show();
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
47
Se compar ă dacă sala selectat ă de utilizator este ocupat ă în aceeași dată si or ă cu
profesorul sau asistentul. Dac ă exist ă, poateAdaugaExamen se setează pe false.
După ce toate verificările au fost făcute si poateAdaugaExamen este pe true ,se creează
un alt fir de execuție folosind BackGroundTask in care se trimit toate informațiile
selectate de utilizator , în baza de date unde se creează o noua înregistrare .În caz
contrar, se afișează un mesaj de alert ă pentru cazul respectiv, iar poateAdaugaExamen
este setat pe false.
4.1.4 StudentMainActivity – Vizualizare Examene
În cazul autentificării cu un cont de student , se va lansa StudentMainActivity conform Figurii 5.8
, afișând o interfață grafica specifica aplicației pentru student. Ca și ecran de pornire , utilizatorului
ii va fi afișat secțiunea de examene planificate recent. La accesarea meniului lateral și apăsarea
butonului pentru secțiunea de „vizualizare examene”, un nou „layout” pentru afișarea examenelor
utilizatorului va trece din starea „gone” în „visible” Figura 4.11, iar meniul împreuna cu „layout”ul
anterior vor dispărea . Examenele din aceasta secțiune sunt afișate cronologic, după dat ă.
Figura 4 .15 layout Viz.Examene
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
48
Evident, examenele sunt preluate in funcție de grup ă din care face parte utilizatorul. Se poate
observa ca intervalul dintre examenele planificate este de 3 zile, conform Figurii 5.14.
Afișarea lor se face utilizând ExpandableListView [8] . In momentul retu rnării datelor din baza de
date , se apelează metoda studentMainActivity.createGroupList(). Containerele de tip
ExpandableListView sunt structurate pe doua nivele. În corpul metodei se creează un nou
„LinkedHashMap” pentru a memora examenele , adică GroupLi st și childList și un groupList de
tip ArrayList pentru numele materiilor Figura 4.16 . Group reprezintă ce examen este planificat ,iar
Child List detaliile despre examenul respectiv.
Pentru a ști cum s ă fie afișate cele doua nivele in interfața grafic ă , se folosesc doua fișiere de tip
.xml : group_item.xml și child_item.xml. Astfel , interfața știe s ă își preia caracteristici precum
înălțimea, lățimea, mărimea textului , culoarea etc.
Figura 4 .16 createGroupList();
public void createGroupList() {
ColectieExamen = new LinkedHa shMap<String, List<String>>();
groupList = new ArrayList<String>();
for (int i=0;i<DateJsonStorage. nrExamenStudent ;i++) {
String materie =
DateJsonStorage. dateJsonExamenRecentPlanificatStudent [i].getMaterie(); //(i+1)+"."+
groupList .add(materie);
ArrayList<String> informatiiSuplimetare = new ArrayList<String>();
informatiiSuplimetare .add("Data: " +
DateJsonStorage. dateJsonExamenRecentPlanificatStudent [i].getData());
informatiiSuplimetare .add("Ora: "+
DateJsonSt orage.dateJsonExamenRecentPlanificatStudent [i].getOra());
informatiiSuplimetare .add("Sala: " +
DateJsonStorage. dateJsonExamenRecentPlanificatStudent [i].getSala());
informatiiSuplimetare .add("Profesor: " +
DateJsonStorage. dateJsonExamenRecentP lanificatStudent [i].getProfesor());
informatiiSuplimetare .add("Tip examinare: " +
DateJsonStorage. dateJsonExamenRecentPlanificatStudent [i].getTip_examinare());
ColectieExamen .put(materie, informatiiSuplimetare );
}
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
49
4.1.5 ProfesorMainActivity – Vizualizare Examene
In cazul autentificării cu un cont de profesor , se va lansa Profes orMainActivity conform Figurii
4.8 , afișând o interfață grafic ă specific ă aplicației pentru profesor. Ca și ecran de pornire ,
utilizatorului ii va fi afișat secțiunea de examene planificate recent. La accesarea meniului lateral
și apăsarea butonului pentru secțiunea de „vizualizare examene”, un nou „layout” pentru afișarea
examenelor uti lizatorului va trece din starea „gone” in „visible” Figura 4.11, iar meniul împreuna
cu „layout”ul anterior vor dispărea . Examenele din aceasta secțiune sunt afișate cronologic, după
dată.
Implementarea este asemănătoarea cu cea de la StudentMainActivity (4.2.4) , diferența fiind
parametrul trimis către scriptul PHP. Extragerea informațiilor se va face in funcție de numele
profesorului autentificat.
4.1.6 UI
Modulul UI conține toate activitățile și clasele care asamblează interfață cu utilizatorul. Fiecare
activitate reprezintă un ecran al aplicației , scopul lui fiind interacțiunea cu utilizatorul.
Orice activitate din aplicație moștenește o clas ă numit ă Activity din Android SDK . Prima
activitate în care intr ă aplicația este tot timpul LoginActivity unde, dac ă nu este deja autentificat
un utilizator , este afișata o imagine cu logo -ul aplicației si câmpurile care trebuie completate
pentru autentificare. La fiecare lansare, LoginActivity verific ă in fundal daca utilizatorul este
autentificat deja sau nu. Daca este , se pornește mai departe activitatea corespunzătoare
utilizatorului.
Fiecare activitate folosește un meniu standard din Android SDK numit „Navigation Drawer” care
const ă într-un meniu l ateral din care se pot selecta opțiuni /câmpuri care oferă orice funcționalitate ,
definita de dezvoltator.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
50
In Figura 4 .17 se observ ă meniul activității studentului. Este structurat pe doua nivele :
Primul nivel conține in mare parte detalii personale , cu m ar fi logoul aplicației , câmp cu numele
și prenumele preluate din baza de date, email , apoi trei câmpuri pentru a lansa alte layout -uri
pentru date personale, specializare și schimba parola. Din motive convenabile, specializare și
schimba parola nu au f ost implementate.
Al doilea nivel se axează pe examene, conținând câmpuri pentru a vizualiza examenele recent
adăugate și vizualizarea în ordine cronologic ă.
Ultimul câmp reprezintă butonul de Log Out , care în momentul apăsării lui , utilizatorul va fi
deconectat din aplicație și revenit la activitatea LoginActivity pentru autentificare.
Figura 4 .17 Meniu Navigation Drawer StudentMainActivity
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
51
4.1.7 Buton Log Out
Pentru ca utilizatorul sa se poată deconecta de la aplicație , se va apăsa butonul de Log Out din
meniul „Navigation Drawer” Figura 4.17 unde se va apela metoda sesiune.logoutUser();
din clasa Session . Figura 4.18
Figura 4 .18 Session – logoutUser();
În metoda logoutUser() nu se executa altceva decât metodele .clear() și .commit() din clasa
SharedPreferences pentru a șterge tot fișierul prefs de pe dispozitivul Android . Astfel , nu mai
exist ă nici o informație despre vreun utilizator , deci getUserLoggedIn() apelat la lansarea
aplicației va returna false.
4.2 Implementare baza de date MySQL
Sistemul de gestiune a bazelor de date pe care l -am ales a fost MySQL . Motivele au fost
compatibilitatea cu majoritatea sistemelor de operare și familiaritatea cu interfata phpMyAdmin.
Structura tabelelor a fost realizat ă într-un mod cat mai convenabil și ușor de abordat Figura 4.19.
Câmpurile din fiecare tabel ă au caracte risticile lor specifice. De exemplu , pentru id -uri se folosește
tipul int iar pentru nume se folosește tipul String. Din motive de implementare ,în multe cazuri se
întâmplă ca într -un câmp sa fie un nume și nu un id , iar doua câmpuri dintr -o tabelă să co nțină
aceleași informații. De exemplu, tabela grupa conține câmpul cu nume_grupa , și nume -short,
ambele reprezentând același nume , diferența fiind că la nume_grupa mai este scris și specializarea
și anul din care face parte grupa , ”210 (ISM) AN I ” , scopul lor fiind de a ajuta secretara la
planificare în interfața grafică. Nume -Short conține doar numele grupai „ 210” . public void logoutUser(){
editor.clear();
editor.commit();
}
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
52
Figura 4 .19 Structura Bazei de date oesdb
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
53
5.Concluzii și dezvoltări ulterioare
Scopul acestui proiect a fost de a aborda o tehnologie foarte des utilizat ă la momentul actual , pentru
a dezvolta o aplicație in sprijinul secretar , profesorilor și studenților , fără a implica alte dispozitive
suplimentare fa ță de cele utilizate în activitatea noastră zilnic ă. Prin faptul c ă aplicația se comportă
diferit in funcție de utilizatorul conectat, s e poate spune ca înglobează trei tipuri de aplicații
diferite, independente una de cealaltă . De exemplu, dac ă se scoate modulul pentru un anumit tip
de utilizator , aplicația va putea fi utilizat ă de celelalte doua tipuri. Deci, fiecare tip de aplicație in
parte urmărește obiective proprii esențiale . Astfel, pentru un utilizator identificat ca și secretar ă ,
aplicația va îndeplini obiectivul planificării unui examen , având următoarele restricții :
Planificarea unui examen pentru o anumit ă grupă trebuie s ă respecte intervalul de
minim 3 zile între acesta și un alt examen.
Profesorul s ă fie disponibil la data și ora aferente examenului.
Asistentul s ă fie disponibil la d ata și ora aferente examenului.
Sala s ă fie disponibil ă la data și ora aferente examenului și de asemenea s ă
îndeplinească numărul de locuri necesare grupei.
Pentru fiecare materie se poate planifica cel mult un examen, pentru o anumit ă grupă.
Dacă utilizatorul se autentific ă ca și student sau profesor, obiectivul esențial urmărește afișarea
examenelor in ordine cronologic ă . In plus, in momentul în care data examenului a fost depășita ,
înregistrarea respectiv ă nu va mai fi afișată .
Astfel , versi unea curent ă poate fi considerat ă baza unei soluții utile in sprijinul universitar , cu
scopul de a aborda o lume moderna din punctul de vedere tehnologic. Următoarele obiective pot
fi considerate ca implementări ulterioare:
Implementarea unui sistem de alerte pentru a notifica studentul sau profesorul când are
un examen nou planificat
Pentru Student, in secțiunea de vizualizări examene s ă-i fie afișat dacă a promovat
laboratorul sau nu
La selecția datei și a orei s ă fie afișate doar sălile disponibile pe ntru ora aceea
Pentru student, implementarea unui catalog online
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
54
Pentru Studenți din anul I , afișare mesaj/videoclip de bun venit
Un chat pentru Profesori și unul pentru Studenți .
Presupunând că aplicația va fi pus ă in funcțiune într-un stadiu cu funcționalități multiple ,
cum ar fi un chat, se d ă următorul Scenariu: Un student X se afl ă la facultate in primele
săptămâni din anul I . Își instalează aplicația ca o alegere personal ă, de acasă sau oriunde.
Se autentific ă folosind contul oferit de fac ultate. Este întâmpinat cu mesajul de bun venit
și scurt ă prezentare a facultății . Trec câteva săptămâni și vrea sa ia legătura din diferite
motive cu unul dintre colegi. Aici apare o problema des întâlnita . În primele săptămâni de
facultate , de multe or i se întâmpla sa se uite cum îl cheamă pe colegul Y sau Z , dar se știe
cum arata. Astfel , Studentul X poate accesa aplicația OES , rubrica de chat , pentru a lua
legătura cu colegul Y sau Z prin a -l identifica după pozele și numele de profil al tuturor
colegilor din grupa în care face part e.
Nemeș Florin -Cristian Aplicație Android – Plani ficator Examene
55
6. Bibliografie și Webliografie
Cărți despre tehnologii, articole
[1] Guy Harrison,Steven Feuerstein, MySQL Stored Procedure Programming, Editura
O’Reilly Media , ISBN -13: 978 -0-596-10089 -6 , 2006, USA
[2] Ben Smith, Beginning JSON , Editura Apress, ISBN -13 (electronic): 978 -1-
4842 -0202 -9 , 2015, California
[3] Matt Doyle, Beginning PHP 5.3, Editura Wrox , ISBN: 978 -0-470-41396 -8, 2010,
USA, Indianapolis, Indiana
[4] Wei -Meng Lee, Beginning Android 4 Application Development , Editura Wrox, ISBN:
978-1-118-19954 -1 , 2012 , USA, Indianapolis ,Indiana
[11] Jeff Friesen , Learn Java for Android Development, 2nd Edition , Editura Apress ,
ISBN: 978 -1-4302 -5722 -6 ,2013 ,California
Pagini Web Accesate
[5] https://en.wikipedia.org/wiki/Android_(operating_system) , ultima accesare
12.05.2016
[6] https://developer.android.com/guide/components/fundamentals.html , ultima accesare
15.05.2016
[7] https://developer.android.com/guide/topics/ui/declaring -layout.html , ultima accesare
16.05.2016
[8] http://theopentutorials.com/tutorials/andr oid/listview/android -expandable -list-view –
example/ , ultima accesare 16.05.2016
[9] https://en.wikipedia.org/wiki/Android_Studio , ultima accesare 18.05.2016
[10] https://www.iconfinder.com/search/?q=learn , ultima accesare 05.11.2015
[12] https://en.wikipedia.org/wiki/Java_(programming_ language) , ultima accesare
24.06.2016
[13] https://en.wikipedia.org/wiki/PHP , ultima accesare 24.06.2016
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: Nemeș Florin -Cristian [616856] (ID: 616856)
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.
