aplikacija za brzo dogovaranje sastanaka pametnim telefonima s
TRANSCRIPT
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
ZAVRŠNI RAD br. 4089
APLIKACIJA ZA BRZO DOGOVARANJE
SASTANAKA PAMETNIM TELEFONIMA S
OPERACIJSKIM SUSTAVOM ANDROID
Filip Popić
Zagreb, lipanj 2015.
Sadržaj
Uvod ...................................................................................................................................... 1
1. Operacijski sustav Android ........................................................................................... 2
1.1. Osnove i razvoj operacijskog sustava Android ..................................................... 2
1.2. Arhitektura operacijskog sustava Android ............................................................ 3
1.3. Struktura Android aplikacija ................................................................................. 6
1.3.1. Aktivnosti ...................................................................................................... 6
1.3.2. Usluge ............................................................................................................ 8
1.3.3. Primatelji namjera.......................................................................................... 9
1.3.4. Pružatelji sadržaja ........................................................................................ 10
1.3.5. Namjere ....................................................................................................... 10
1.4. Korisničko sučelje Android aplikacija ................................................................ 10
2. Vanjska komponenta za razmjenu poruka i informacija o prisutnosti ........................ 13
2.1. Osnove protokola XMPP ..................................................................................... 13
2.2. Opis javnog sučelja vanjske komponente ............................................................ 16
2.3. Ugradnja vanjske komponente ............................................................................ 17
3. Aplikacija za brzo dogovaranje sastanaka ................................................................... 19
3.1. Programsko ostvarenje ........................................................................................ 19
3.2. Podržane funkcionalnosti aplikacije .................................................................... 27
3.3. Testiranje aplikacije ............................................................................................. 30
Zaključak ............................................................................................................................. 32
Literatura ............................................................................................................................. 33
Sažetak ................................................................................................................................. 34
Summary .............................................................................................................................. 35
Skraćenice ............................................................................................................................ 36
Ključni pojmovi ................................................................................................................... 37
Key terms ............................................................................................................................. 38
1
Uvod
Brzo dogovaranje sastanaka svodi se na kratku i jednostavnu komunikaciju između više
uključenih strana, koje u što kraćem vremenu žele organizirati zajednički sastanak, na
određenom mjestu u dogovoreno vrijeme. Za uspješno dogovaranje sastanaka između
različitih strana, potrebno je prilagoditi slanje i primanje zahtjeva te povrat odgovora o
nekom prijedlogu za sastanak. Komunikacija preko pokretnih uređaja sve više se nameće
kao prigodno sredstvo za ostvarivanje navedenih zahtjeva, koja zbog svoje jednostavne
strukture omogućuje prijenos sažetih, ali ipak potpunih informacija.
Rad se bavi istraživanjem postojećih rješenja temeljenih na protokolu XMPP i praktičnom
izradom aplikacije za pokretne uređaje s operacijskim sustavom Android. Povezivanje s
poslužiteljem i ostvarivanje cjelokupne komunikacije ostvaruje se preko vanjske
komponente koja omogućuje neovisnu implementaciju te pruža sve potrebne usluge za
ostvarivanje komunikacije na spomenutom protokolu.
U prvom poglavlju opisuje se operacijski sustav Android, nakon čega slijedi opis protokola
XMPP te pregled i način ugradnje vanjske komponente. Posljednje poglavlje opisuje
oblikovanje i izradu programskog rješenja te pruža uvid u ostvarene funkcionalnosti
aplikacije.
2
1. Operacijski sustav Android
U ovom poglavlju opisan je nastanak i razvoj operacijskog sustava Android. Popraćen je
vremenski razvoj operacijskog sustava Android s pregledom najvažnijih trenutaka i značajki
koje su utjecale na daljnji razvoj i smjer operacijskog sustava. Nakon početnog dijela
prikazuje se arhitektura operacijskog sustava Android. Zatim slijedi opis strukture Android
aplikacije sa svojim komponentama i korisničkim sučeljem koje je opisano u posljednjem
dijelu poglavlja.
1.1. Osnove i razvoj operacijskog sustava Android
Android je platforma bazirana na otvorenom kodu, namijenjena različitim kategorijama
uređaja, koju najčešće čine pokretni uređaji (mobiteli, tableti, pametni satovi). Najvažniji
pojmovi koji se vežu uz Android su otvorenost i neovisnost, zbog kojih se značajno
promijenio odnos između proizvođača sklopovlja uređaja i proizvođača programske potpore,
koji su dosada najčešće bili unutar iste kompanije, a često i jedini razvijatelji aplikacija za
svoje uređaje. Tvrtka Google, Inc. je 2005. godine kupila tvrtku Android, Inc., a kako bi se
sačuvala ideja o otvorenosti dvije godine nakon preuzimanja, tvrtka službeno objavljuje
cijeli projekt temeljen na otvorenom kodu uz osnivanje neovisnog konzorcija Open Handset
Alliance, sastavljenog od najvećih svjetskih kompanija sa osnovnom idejom daljnjeg razvoja
otvorenih tehnologija na području pokretnih uređaja. Članice su se obvezale na korištenje
operacijskog sustava Android što je omogućilo veću rasprostranjenost platforme na
uređajima različitih arhitektura i sklopovlja. Prekretnica za razvoj aplikacija predstavlja
2008. godina, odnosno izdavanje programskog paketa za izradu aplikacija Android SDK
(Software Development kit), zajedno sa svim potrebnim alatima koji omogućuju izradu,
pokretanje i testiranje aplikacija na računalu bez potrebe prisustva stvarnog uređaja. Android
u međuvremenu izdaje nove verzije operacijskog sustava kodnih imena Cupcake, Donut,
Eclair, koje se i dalje izvode na relativno ograničenom broju uređaja. Ubrzani porast broja
korisnika i podržanih uređaja Android postiže konstantnim izdavanjem novijih verzija
operacijskog sustava koje donose brojna poboljšanja i novitete, uključujući i razvoj
korisničkog sučelja kojemu se sve više pridodaje na važnosti. Izdavanjem verzije KitKat
2013. godine, Android je dostigao broj od milijardu uspješnih aktivacija operacijskog
sustava, čime je izašao izvan svih dosadašnjih okvira cjelokupne industrije.[1] Trenutno
3
najnovija verzija sustava je Lollipop, koja je svojim novim korisničkim sučeljem,
izgrađenom na osnovama materijalnog dizajna (material design), uvela sasvim novi pristup
pri oblikovanju i dizajniranju korisničkih sučelja, kojega su prihvatile i ostale tehnologije
poput Weba.
1.2. Arhitektura operacijskog sustava Android
Arhitektura operacijskog sustava Android podijeljena je na slojeve kao što je prikazano na
slici Slika 1.1.:
Aplikacijski sloj
Sloj aplikacijskog okvira (application framework)
Programske knjižnice
Radno okruženje Android (Android runtime)
Linux jezgra (Linux kernel)
4
Slika 1.1 Arhitektura operacijskog sustava Android
Linux jezgra
Najniži sloj operacijskog sustava Android čini Linuxova jezgra 2.6 koja se pokazala
primjerenim odabirom, ponajprije zbog svoje prenosivosti i sigurnosti, ali i konstantnog
razvoja koji osigurava daljnji napredak cijelog sustava. Linuxova jezgra pomoću svojih
upravljačkih mehanizama omogućuje zaštićeno izvođenje naredbi unutar kontroliranih
procesa što znatno doprinosi sigurnosti i robusnosti cijelog operacijskog sustava.
Radno okruženje Android
Radno okruženje Android sastoji se od virtualnog stroja Dalvik (Dalvik Virtual Machine,
DVM) i jezgrenih programskih knjižnica (core libraries).
Dalvik je virtualni stroj izgrađen na temelju virtualnog stroja za Javu (Java Virtual Machine,
JVM), ali je svojim dizajnom prilagođen za pokretne uređaje kako bi se omogućila
učinkovita raspodjela i iskorištavanje ograničenih resursa sustava, poput radne memorije,
trajanja baterije i procesorske snage. Prevođenje izvorne datoteke napisane u Javi (Java
5
source file, .java) započinje prevođenjem u međukod za Javu (Java bytecode, .class),
koristeći Javin prevoditelj. Zatim slijedi novo prevođenje dobivene datoteke u međukod
virtualnog stroja Dalvik (Dalvik bytecode, .dex), koristeći alat dx koji je sadržan u
programskom paketu Android SDK (Software development Kit). Dobivenu izvršnu datoteku
moguće je izvoditi na krajnjem uređaju pri čemu se svaka aplikacija zasebno izvodi u svojoj
instanci virtualnog stroja Dalvik.[2] Pored uobičajenog pisanja aplikacija u programskom
jeziku Java, moguće je programirati u većini jezika koji se mogu odgovarajućim
prevoditeljima prevesti u međukod za Javu, Primjeri takvih programskih jezika su Scala,
Groovy ili Kotlin, koji pojednostavljenom sintaksom i proširenim mogućnostima polagano
privlače sve veći udio programera.
Jezgrene programske knjižnice sastavljene su od pripremljenih razreda koji služe za
učinkovito obavljanje uobičajenih zadataka iscrtavanja sučelja i manipulacije različitim
strukturama podataka. Android je naslijedio većinu jezgrenih knjižnica programskog jezika
Java (Java Standard Edition, JavaSE), uz važniju iznimku jezgrenih programskih knjižnica
namijenjenih za prikaz korisničkog sučelja, koje su posebno izgrađene za operacijski sustav
Android.
Programske knjižnice
Skup programskih knjižnica za Android čine pouzdane i učestalo korištene programske
knjižnice za specifične namjene. Preuzete su iz različitih izvora i udruženja, koja javno
objavljuju postignuta rješenja na principima otvorenog koda. Većina ih je napisana u
jezicima C i C++ koji se jednostavno prevode u druge jezike, a osnovna namjena je pružanje
specifičnih usluga ostalim dijelovima sustava na višim slojevima. Primjeri korištenih
programskih knjižnica su SQLite koji implementira pristup i samu bazu podataka te Op koji
omogućuje prikazivanje različitih grafičkih struktura.
Sloj aplikacijskog okvira
Sloj aplikacijskog okvira sastoji se od brojnih komponenti upravitelja usluga i pružatelja
sadržaja. Osnovna zadaća sloja je omogućiti jednostavan pristup različitim dijelovima
sklopovlja uređaja, koje neprestano ili periodički preko različitih izvora (senzori, mrežni
podaci) prikuplja podatke koji se mogu u aplikaciji iskoristiti. Za razvijatelje aplikacija, sloj
aplikacijskog okvira od presudne je važnosti, jer osim osnovnih mobilnih usluga
telefoniranja i slanja tekstualnih poruka, omogućuje razvoj aplikacija za „pametne“ uređaje
(smartphone) u njihovom pravom smislu. Primjer takvih usluga su usluge objavljivanja
6
obavijesti, praćenje stanja mreže, korištenje fotoaparata ili pristup podacima iz imenika, kao
i mnoge druge.
Aplikacijski sloj
Svaki uređaj baziran na operacijskom sustavu Android uobičajeno dolazi s unaprijed
instaliranim aplikacijama koje pružaju osnovne usluge za korisnike. Primjer takvih
aplikacija su kalkulator, kamera, klijent elektroničke pošte i druge. Osim unaprijed
instaliranih aplikacija u aplikacijski sloj pripadaju i sve ostale aplikacije preuzete s različitih
izvora (Google Play, Amazon Appstore) poput brojnih igrica (AngryBirds, DoodleJump) ili
aplikacija za brzo poručivanje (WhatsApp, Facebook Messenger) i ostalih.
1.3. Struktura Android aplikacija
Svaka Android aplikacija može se podijeliti na određeni broj međusobno neovisnih
komponenti, koje po potrebi mogu komunicirati međusobno ili s ostalim komponentama
drugih aplikacija. Postoje četiri osnovne kategorije komponenti koje se osim po namjeni
razlikuju i po vlastitom životnom ciklusu:
Aktivnost (activitiy)
Usluga (service)
Pružatelj sadržaja (content provider)
Primatelj namjera (broadcast receiver)
1.3.1. Aktivnosti
Aktivnosti su komponente aplikacije koje su u izravnoj vezi s korisnikom i ostatkom sustava,
a predstavljaju prikaz određenog prozora zaslona kojeg korisnik vidi. Za primjer jedne
aktivnosti može poslužiti aplikacija Kontakti (Contacts) sa svojom središnjom aktivnosti s
pregledom pojedinačnih zapisa iz imenika unutar zajedničke grupe elemenata prikaza (view
group). Svaka aplikacija sadrži jednu središnju aktivnost koja se korisniku otvara pri prvom
pokretanju aplikacije. Aktivnosti se mogu međusobno pozivati izražavajući svoju namjeru
sustavu (intent), ali se na zaslonu u svakom trenutku može nalaziti najviše jedna aktivnost,
o čemu se na razini operacijskog sustava brine upravitelj aktivnosti (activity manager).
Redoslijed stanja kroz koje aktivnost prolazi prikazan je na slici Slika 1.2, pri čemu se na
7
prijelazima između stanja nalaze odgovarajuće metode koje poziva sustav, a implementiraju
ih programeri koji definiraju ponašanje komponente prije ulaska u sljedeće stanje.
Slika 1.2 Životni ciklus aktivnosti
Životni ciklus aktivnosti započinje pozivom metode onCreate() koja se automatski
poziva ukoliko se radi o početnoj aktivnosti aplikacije ili je rezultat izražene namjere
prethodne aktivnosti koja je proizišla iz interakcije s korisnikom. Pozivom metode izgrađuje
se nova instanca aktivnosti u memoriji, obilazi i gradi cijelo stablo elemenata prikaza (View)
korisničkog sučelja (definirano u XML datoteci), što predstavlja jednu od najzahtjevnijih
operacija, čije se ponovno izvođenje nastoji u što većoj mjeri izbjeći poznatim mehanizmima
pozadinskog stoga na kojemu se privremeno spremaju zaustavljene aktivnosti, koje se u
slučaju ponovnog pokretanja dohvate s stoga. Nakon izvršavanja metode
onCreate()sustav prelazi u stanje izgradnje u kojemu se kratko zadržava te slijedno
pozivima metoda onStart() i onResume() prelazi u stanje pokretanja, odnosno u
stanje prikazivanja u kojima je aktivnost vidljiva korisniku. U metodama se najčešće
registriraju ili obnavljaju pretplate primatelja namjera i postavljaju brojne komponente, što
dolazi do izražaja pri ponovnom pokretanju aktivnosti sa stoga. U stanju prikazivanja
aktivnost je vidljiva i u interakciji s korisnikom sve dok korisnik ne odluči izvesti određenu
8
akciju ili se prikazivanje aktivnosti privremeno zaustavi zbog dolaznog poziva ili slične
izvanredne namjere. U tom slučaju operacijski sustav pozivom metode onPause()
privremeno prebacuje aktivnost u stanje pauziranja pri čemu je interakcija s korisnikom
prekinuta, iako je aktivnost djelomično vidljiva na zaslonu. Najčešće se unutar metode
onPause() odjavljuju pretplate za zauzete komponente kako bi ih ostale aktivnosti mogle
koristiti. Ovisno o prethodno izraženoj namjeri, aktivnost se iz stanja pauziranja, ponovnim
pozivom metode onResume(), može vratiti u stanje prikazivanja ili pozivom metode
onStop() ukloniti sa zaslona te pohraniti u memoriju u slučaju ponovnog pokretanja, što
je i dalje isplativije od započinjanja novog ciklusa i pozivanja metode onCreate().
Pozivom onDestroy() dolazi do brisanja aktivnosti iz memorije te se oslobađaju svi
zauzeti resursi. Ukoliko se pri radu, aktivnost koristi pozadinskim dretvama potrebno je
eksplicitno zaustaviti izvođenje i osloboditi zauzete resurse, kako bi se izbjeglo curenje
memorije (memory leak).
1.3.2. Usluge
Usluge su neovisne komponente koje mogu izvršavati uobičajene postupke, ali i zahtjevnije
zadatke. Najčešće se koriste za dugoročne ili periodičke poslove koji se obavljaju u pozadini,
bez interakcije s korisnikom. Zbog izostanka interakcije ne pružaju korisničko sučelje po
čemu se razlikuju od aktivnosti. Usluge svoje poslove obavljaju zajedno s aktivnostima u
dretvi korisničkog sučelja (user interface thread) koja ne trpi vremenski zahtjevnije
izvođenje, zbog čega je potrebno usluzi pridijeliti vlastitu pozadinsku dretvu u slučaju
obavljanja zahtjevnijih poslova, kako se ne bi ugrozila interakcija korisnika s ostatkom
aplikacije. Usluge za razliku od aktivnosti imaju nešto jednostavniji životni ciklus, ali je
potreban veći oprez pri modeliranju. Usluge zbog svoje neovisnosti mogu ostati uključene
prestankom izvođenja aplikacije. Pokretanje, kontroliranje i zaustavljanje usluga obavlja se
pozivima iz aktivnosti, primatelja objava ili drugih usluga.
Dva su osnovna račina rada usluga koji se po potrebi mogu kombinirati: pokrenuta usluga i
povezana usluga. Pokrenuta usluga pokreće se pozivom metode startService() iz
druge komponente, na neodređeno vrijeme, a najčešće obavlja jedan posao (npr. dohvaćanje
datoteke s Interneta) i ne vraća nikakav rezultat aplikaciji pokretaču. Povezana usluga
povezuje se s drugom komponentom pozivom metode bindService(). Ovakva usluga
komunicira sa svojim pokretačem prihvaćajući podatke i prosljeđujući odgovore. Više
9
komponenti se može povezati s jednom uslugom, a prestaje se izvoditi kada više nijedna
komponenta nije povezana na uslugu.[3]
Nasljeđivanjem osnovnog razreda Service.java ostvaren je razred
IntentService.java u kojemu je definiran specifičan tip usluge namijenjene za
slijednu obradu namjera, koja automatski obrađuje pristigle namjere u vlastitoj dretvi, za
razliku od obične usluge. Primjer takve usluge bi bila usluga za objavljivanje obavijesti koja
nakon uspješne obrade dolazne namjere i prikazivanja obavijesti prekida s radom.
1.3.3. Primatelji namjera
Primatelji namjera su komponente zadužene za primanje objavljenih namjera koje je u sustav
razaslala određena komponenta. Mnoge objave potječu iz samog operacijskog sustava
pomoću kojih se obavještavaju različite aplikacije o brojnim asinkronim događajima poput
gašenja zaslona, promjenama na mreži, uspješnog fotografiranja i ostalih. Primatelji namjera
zamišljeni su kao jednostavne komponente koje najčešće služe kao pristupna postaja drugoj
komponenti, pa se izvođenje vrlo rijetko značajnije zadržava unutar osnovne asinkrone
metode onReceive(), koja se poziva pri primanju namjere. Svaki primatelj namjera
preko filtra namjera (intent filter) registrira pretplatu na određenu akciju, odnosno namjeru,
što se najčešće obavlja unutar metode onResume() za vrijeme životnog ciklusa aktivnosti.
Otkazivanje pretplate obavlja se unutar metode onPause()zbog nemogućnosti interakcije
aktivnosti s korisnikom pri čemu nije potrebno hvatati namjere koje se ionako neće moći
prikazati korisniku. Pretplate se mogu registrirati na razini komponenti (unutar datoteke
AndroidManifest.xml) ukoliko primatelji namjera trebaju biti stalno aktivni neovisno
o trenutnom stanju aplikacije.[4]
Proširenjem osnovnog razreda BroadcastReceiver.java ostvaren je razred
WakefulBroadcastReceiver.java koji je namijenjen za isporuku i pozivanje
usluga za obradu osjetljivih namjera ili transakcija poput objavljivanja obavijesti,
osiguravajući budnost sustava dok se namjera ne obradi. Pri završetku rada, usluga dojavi
završetak primatelju, nakon čega se ukloni privremena mjera zabrane gašenja uređaja u
pozadini.
10
1.3.4. Pružatelji sadržaja
Pružatelji sadržaja su komponente, odnosno mehanizam koji upravlja pristupom različitih
podatkovnih struktura koje se trajno pohranjuju na uređaju. Ostale komponente uz pomoć
pružatelja sadržaja mogu pristupati osjetljivim ili zaštićenim podacima ako su prethodno
dobili dopuštenje operacijskog sustava, odnosno korisnika kao vlasnika.[5] Podacima se
pristupa pomoću uniformnog identifikatora resursa (Uniform Resource Identifier, URI) koji
jednoznačno određuje željeni resurs.
1.3.5. Namjere
Namjere su osnovni objekti namijenjeni za komunikaciju preko kojih različite komponente
mogu zatražiti određenu akciju od drugih komponenti. Namjere se razlikuju po načinu
određivanja primatelja namjere, koji mogu biti neodređeni ili eksplicitno zadani u samoj
strukturi objekta. Ukoliko primatelj nije naznačen, pretplaćene komponente sposobne za
obradu određene namjere sudjeluju u izvlačenju, kojeg operacijski sustav korisniku preko
odgovarajućeg izbornika ponudi. Objavljivači namjera često koriste mehanizam namjera za
slanje primitivnih podataka različitim komponentama ili aplikacijama koje ih prime preko
pretplaćenih primatelja.
1.4. Korisničko sučelje Android aplikacija
Korisničko sučelje većine Android aplikacija ima važnu ulogu za početno prihvaćanje i
ponovnu uporabu aplikacije. Osnovna svrha sučelja je korisniku u što većoj mjeri
pojednostaviti korištenje aplikacije. Sučelje za Android aplikacije može se izgraditi na dva
načina: deklariranjem elemenata prikaza unutar stablaste hijerarhijske strukture napisane u
jeziku XML (EXtensible Markup Language) i programskim instanciranjem objekata
elemenata prikaza, koji se pri pokretanju (runtime) ugrađuju u strukturu i prikazuju na
zaslonu. Ova dva načina izgradnje korisničkog sučelja međusobno se ne isključuju, već se
preporučuje korištenje oba načina za različite namjene. Deklarativni pristup preporučuje se
za izgradnju statičkog rasporeda elemenata (layout) na zaslonu u kojemu se definira položaj
i svojstva prikaza pojedinih elemenata prikaza. U priloženom isječku XML datoteke
prikazano je deklariranje elementa prikaza gumb (button) s postavljenim svojstvima za
identificiranje unutar rasporeda prikaza, za visinu i širinu kontrole koje su postavljene da se
11
automatski prilagođavaju sadržaju (wrap content) te tekst koji će biti prikazan korisniku
unutar gumba.
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pritisni me!"/>
Programsko postavljanje objekata elemenata prikaza unutar Java datoteka namijenjeno je za
izmjenu stanja, odnosno postavljanje svojstava i definiranje ponašanja objekta, koji može
reagirati na različite događaje u interakciji s korisnikom. Na ovaj način omogućena je
dinamička izgradnja i dodavanje novih kontrola koje za vrijeme početnog prikazivanja nisu
postojale na zaslonu. Postavljanjem slušača događaja (event listener) na prethodno
deklarirani gumb, definira se ponašanje koje u ovom primjeru postavlja tekst kontrole.
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setText("Hvala!")
}
});
Ovakva praksa odvajanja svojstava prikaza i definicije ponašanja objekata povećava
čitljivost i doprinosi boljoj organizaciji koda.
Svaki element korisničkog sučelja proširuje osnovni razred View.java u kojemu je
definirano ponašanje objekta i sva potrebna svojstva za prikaz objekta na zaslonu. Najčešće
korišteni elementi prikaza su različita polja za unos (razred EditText.java) i prikaz
teksta (razred TextView.java), gumbi (razred Button.java), kvačice (razred
CheckBox.java), izbornici (razred RadioButton.java) i prekidači (razred
Switch.java). Ukoliko je potrebno prikazati grupu elemenata prikaza, nasljeđuje se
podrazred ViewGroup.java koji definira razmještanje objekata i sadrži ostale elemente
prikaza. Najviše korišteni objekti implementirani su u razredima LinearLayout.java i
RelativeLayout.java koji linearno ili međusobno ovisno razmještaju elemente na
zaslonu. Za prikaz različitih kolekcija podataka potrebno je postaviti odgovarajući
prilagodnik (razred koji implementira sučelje Adapter.java), odnosno postaviti izvor
podataka i način prikazivanja članova što može biti definirano u posebnoj XML datoteci.
12
Najčešće korištene implementaciju su: padajući izbornici (razred Spinner.java), prikazi
unutar liste (razred ListView.java), mrežni prikaz (razred GridView.java) i ostali.
Na slici Slika 1.3 prikazan je dio aktivnosti u čijem se zaglavlju nalazi statusna traka
operacijskog sustava te akcijska traka s nazivom aktivnosti, a u tijelu sadrži jedan linearni
razmještaj unutar kojega se nalazi ranije spominjani gumb Pritisni me!.
Slika 1.3 Prikaz dijela korisničkog sučelja
Primjer padajućeg izbornika koji je korišten za izradu aplikacije prikazan je na slici 1.4 , a
korisniku nudi izbor vrste sastanka poput Kava, Martinovka, Menza i ostali.
Slika 1.4 Padajući izbornik
13
2. Vanjska komponenta za razmjenu poruka i
informacija o prisutnosti
U ovom poglavlju opisuje se protokol XMPP, na kojemu se bazira vanjska komponenta, koja
se koristi za razmjenu poruka i informacija o prisutnosti u Android aplikaciji. Zatim slijedi
pregled objavljenog sučelja komponente, nakon čega se opisuje način ugradnje i povezivanja
s ostatkom aplikacije koja je detaljnije opisana u posljednjem poglavlju.
2.1. Osnove protokola XMPP
Protokol XMPP (Extensible Messaging and Presence Protocol, XMPP) je komunikacijski
protokol, koji se koristi za asinkronu razmjenu kratkih poruka u što kraćem vremenu.
Otvoren je i slobodan za sve vrste korištenja. Uz otvorenost, glavne značajke protokola su
proširivost, sigurnost i decentraliziranost. Proširivost se postiže korištenjem jezika XML za
komunikaciju, koji svojom jednostavnom strukturom ostavlja brojne mogućnosti za
dodavanje vlastitih ekstenzija koje obogaćuju osnovnu uslugu. Protokol sadrži snažnu
potporu i mehanizme za šifriranje komunikacijskog kanala i autentifikaciju entiteta čime
zadovoljava potrebne sigurnosne standarde. Zbog svoje decentralizirane arhitekture klijent-
poslužitelj, jednostavno se prilagođava na ispadanje pojedinih dijelova mreže, osiguravajući
veću robusnost sustava. Nastao je iz potrebe za poboljšanjem usluge trenutnog poručivanja
(Instant Messaging, IM) koja se nije mogla učinkovito održavati s postojećim zatvorenim
komercijalnim rješenjima. U svojim začetcima projekt je bio baziran na otvorenom kodu
programerske zajednice Jabber, koji je nakon samo nekoliko godina uz brojne nadogradnje
i formalizaciju prerastao u standardizirani protokol. Ostale usluge koje protokol uređuje su:
prisutnost (presence), održavanje konferencije, grupni razgovori, mehanizam objavi-
pretplati (publish-subscribe), popis kontakata (roster), P2P medijske sjednice (peer-to-
peer), geolokacija i brojne druge.
Arhitektura protokola XMPP
Decentralizirana klijent-poslužitelj arhitektura pokazala se pogodnom za razvoj različitih
mrežnih tehnologija poput Weba i elektroničke pošte, koju je XMPP također prihvatio.
Osnovna prednost decentralizacije leži u razdvajanju odgovornosti između poslužiteljske i
14
klijentske strane, što omogućuje neovisan razvoj i jednostavnije održavanje programske
potpore. Postupak slanja XMPP poruke započinje spajanjem XMPP klijenta s lokalnim
XMPP poslužiteljem, koji se zatim neposredno spaja na odredišni XMPP poslužitelj te
prosljeđuje poruku na odredište, što je prikazano na slici Slika 2.1. Ovaj način neposredne
komunikacije i povezivanja poslužitelja iz različitih domena karakterističan je za protokol
XMPP te njegovu osnovnu namjenu brzog razašiljanja sadržaja između korisnika.
Slika 2.1 Prikaz slanja XMPP poruke
Adresiranje
Protokol XMPP za jednoznačno određivanje svih entiteta na mreži koristi adrese nazvane
JabberID (skraćeno JID), koje po svojoj strukturi nalikuju e-mail adresama:
korisnickoIme@domena
JID se sastoji od korisničkog imena i domene, razdvojenih znakom @. Pri instalaciji
proizvoljnog XMPP poslužitelja, potrebno je odrediti domenu, koja se preslikavanjem,
koristeći sustav imenovanja domena (Domain Name System, DNS), može pretvoriti u IP
adresu te jednostavno locirati na mreži. Za potrebe komunikacije JID je dovoljan, ali se za
razliku od e-mail adrese može proširiti dodatnim zapisom resursa, koji najčešće opisuje
način pristupa usluzi, odnosno predstavlja identifikator klijentskog uređaja preko kojega je
klijent trenutno spojen na mrežu:
korisnickoIme@domena/resurs
15
Struktura poruka
Postoje tri osnovna tipa XML poruka koji se nazivaju XMPP strofe: <message/>,
<presence/> i <iq/>. Strofa <message/> je osnovni mehanizam razmjene poruka sa
definiranim atributima koji su prikazani u tablici Tablica 1.
Tablica 1 Struktura strofe <message/>
atribut vrijednost
from JID pošiljatelja
to JID jednog ili više primatelja
type normal, chat, groupchat, headline, error
Pri slanju odlazne poruke, klijent naslovljava primatelja, ali izostavlja atribut from, koji se
ugrađuje na strani lokalnog poslužitelja, radi umanjivanja potencijalnih sigurnosnih prijetnji.
Osim upravljačkih polja, strofa sadrži takozvani korisni teret (payload) definiran unutar
<body/> oznake, čija struktura nije eksplicitno zadana, što daje dodatnu slobodu pri
oblikovanju sustava za različite primjene.
Informacija o prisutnosti (presence) entiteta na mreži i njegovoj dostupnosti za komunikaciju
prenosi se strofom <presence/>. Navedene informacije sadržane se unutar oznaka
<status/> i <show/>. Za razliku od običnih poruka, pristup podacima o prisutnosti
zahtjeva određenu vrstu pregovaranja uključenih strana. Usluga dijeljenja informacija o
prisutnosti ostvaruje se mehanizmom objavi-pretplati, pomoću koje entitet najprije zatraži
pristanak za informacijom drugog entiteta, koji ga može prihvatiti ili odbaciti. U slučaju
pristanka, entitet koji je zatražio informaciju, automatski se pretplaćuje na buduće objave
informacija o prisutnosti drugog entiteta.
Strofa <iq/> koristi se za slanje upita i odgovora slično kao u protokolu HTTP, a najčešće
se koristi za postupke registracije i dohvaćanja liste kontakata (roster), što je prikazano u
sljedećem isječku koda:
<iq from='[email protected]/android'
id='a12bcd3e' type='get'>
<query xmlns='jabber:iq:roster'/>
</iq>
16
Za razliku od prethodno navedenih strofa <message/> i <presence/>, strofa <iq/>
zahtjeva potvrdu o isporuci ili dojavljenoj pogrešci.
2.2. Opis javnog sučelja vanjske komponente
Za izradu praktičnog dijela ovog rada korištena je vanjska komponenta za razmjenu poruka
i informacija o prisutnosti temeljena na protokolu XMPP. Komponenta je ostvarena u
razredu SmackService.java u kojemu je objavljeno javno sučelje komponente. Metode
javnog sučelja su:
connect() – metoda za povezivanje aplikacije s poslužiteljem
disconnect() – metoda za zatvaranje veze
register() – metoda za registracija korisnika
login() – metoda za prijavu korisnika
isConnected() – metoda za provjeru povezanosti s poslužiteljem
isRegistered() – metoda za provjeru o uspješnosti registracije
isLogged() – metoda za provjeru
sendMessage() – metoda za slanje poruke
sendStatus() – metoda za slanje statusa (informacije o prisutnosti)
sendMode() – metoda za slanje vrste prisutnosti
Uz objavljeno sučelje komponenta omogućuje pozivanje metoda razašiljanjem namjera koje
su definirane sljedećim nepromjenljivim znakovnim nizovima (parametar akcija):
INTENT_REGISTRATION_SUCCESSFUL – dojava o uspješnoj registraciji
INTENT_CONNECTED_SUCCESSFUL – dojava o uspješnom povezivanju
INTENT_LOGIN_SUCCESSFUL – dojava o uspješnoj prijavi
INTENT_UPDATE_ROSTER – dojava o ažuriranoj listi korisnika
INTENT_GET_ROSTER – namjera za dohvaćanje najnovije liste korisnika
INTENT_NEW_MESSAGE – namjera za slanje nove poruke
INTENT_SHOW_NOTIFICATION – namjera za prikazivanje obavijesti
17
2.3. Ugradnja vanjske komponente
Pri pokretanju aplikacije pokreće se metoda startService() koja pokreće uslugu.
Prilikom pokretanja aktivnosti aplikacija se povezuje s uslugom pozivom metode
bindService(). Instanca razreda ServiceConnection.java pozivom asinkrone
metode onServiceConnected() dojavljuje uspješno povezivanje usluge s aplikacijom
te sprema referencu na uslugu. Na sljedećim slikama prikazano je slanje i primanje poruke
(prijedlog sastanka ili odgovor) koristeći zadužene komponente za specifične namjene, koje
su detaljnije opisane u posljednjem poglavlju.
Slika 2.2 – Sekvencijski dijagram, slanje poruke
18
Slika 2.3 sekvencijski dijagram, primanje poruke
19
3. Aplikacija za brzo dogovaranje sastanaka
Praktični dio rada bavi se izradom aplikacije za brzo dogovaranje sastanaka pametnim
telefonima s operacijskim sustavom Android. Osnovna namjena aplikacije je omogućiti
korisniku predlaganje termina za određeni sastanak, na koji može pozvati jednu ili više
osoba. Na temelju proširenih informacija o prisutnosti i lokaciji korisnika, moguće je
predložiti sastanak određenog trajanja. Aplikacija pruža prilagođeni pregled trenutnih
aktivnosti ostalih prisutnih korisnika, kako bi se pojednostavilo predlaganje te spriječilo
nepotrebno ometanje zauzetih korisnika. Aplikacija se brine i o redoslijedu održavanja
sastanaka te sprječava pojavu ugovaranja više istovremenih sastanaka, obavještavajući
korisnika o razlozima nemogućnosti dogovaranja sastanka.
3.1. Programsko ostvarenje
Programska potpora
Android aplikacija napisana je u programskom jeziku Java uz korištenje službenog
razvojnog okruženja Android Studio, verzije 1.2.1.1. Uobičajeno s instalacijom razvojnog
okruženja dolazi i programski paket s alatima za izradu aplikacija Android SDK, trenutne
verzije 24.2. Aplikacija je za vrijeme izgradnje testirana i pokretana na virtualnom uređaju
(Android Virtual Device, AVD) koji pokreće operacijski sustav Android 5.1.1 (Lollipop).
Podržani su svi uređaji koji koriste operacijski sustav Android 4.1 (Jelly Bean) te sve novije
verzije. Iako je projekt izgrađen na trenutno najnovijoj inačici Android platforme, korištene
su pomoćne knjižnice za podršku starijih uređaja (support libraries) koje omogućuje
pokretanje i na starijim uređajima. Za potrebe serijalizacije objekata korištena je programska
knjižnica GSON, koja stvara strukturiranu tekstualnu reprezentaciju objekta. Popis
korištenih knjižnica prikazan je isječku Kod 3.1.
dependencies {
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:recyclerview-v7:22.1.0'
compile 'com.google.code.gson:gson:2.3.1'
}
Kod 3.1 Isječak datoteke build.gradle s popisom korištenih knjižnica
20
Struktura aplikacije
Aplikacija je podijeljena na komponente, koje se prema svojoj namjeni i uslugama koje
pružaju mogu razdvojiti u različite slojeve, što je prikazano na slici Slika 3.1. Sva
komunikacija s poslužiteljem odvija se preko vanjske komponente koja je opisana u
prethodnom poglavlju.
Slika 3.1 Slojevita struktura aplikacije
Aktivnosti
Aplikacija se sastoji od dvije aktivnosti: RegisterActivity.java i
MainActivity.java koja je u datoteci AndroidManifest.xml definirana kao
početna i središnja aktivnost. Pri početnom pokretanju aplikacije, poziva se metoda
onCreate() u kojoj se prije napuhavanja elemenata korisničkog sučelja, provjeravaju
spremljeni podaci, koristeći razred SharedPreferences.java, vezani za uspješnost
registracije s poslužiteljem. Ukoliko registracija nije obavljena ili je aplikacija ponovno
instalirana, utoliko se pokreće aktivnost RegisterActivity.java koja prikazuje
tekstualna polja za unos podataka (korisničko ime i lozinka) potrebnih za registraciju
21
korisnika. Na polja unosa postavljena je validacija, koja u slučaju pogrešnog ili nepotpunog
unosa odgađa postupak registracije što je prikazano na slici.
Slika 3.2 Prikaz validacije unosa aktivirane pritiskom na gumb „Registriraj me“
Informaciju o uspješnosti registracije aktivnost doznaje preko registriranog primatelja
namjera (razred BroadcastReceiver.java), koji je pretplaćen na odgovarajući
događaj kojega pravovremeno razašilja vanjska komponenta. Ukoliko je registracija uspjela,
korisnik se automatski prosljeđuje natrag u središnju aktivnost MainActivity.java, pri
čemu se izvođenje aktivnosti nastavlja pozivom metode onStart(), gdje se vrši prijava
korisnika u sustav (login). Istim mehanizmom razašiljanja i primanja namjera pri registraciji,
aktivnost se kroz slijed asinkronih događaja povezuje te prijavljuje u sustav, nakon čega
izražavanjem namjere zatraži osvježenu listu kontakata. Aktivnost prije prikazivanja liste
korisnika, korištenjem anonimnog objekta usporedbe, koje implementira sučelje
Comparator.java, grupira korisnike ovisno o podacima o trenutnoj prisutnosti i vrsti
sastanka na kojemu se trenutno nalaze.
Korisničko sučelje središnje aktivnosti sastoji se od korijenskog linearnog razmještaja
(razred LinearLayout.java) unutar kojega se nalazi reciklirajući element prikaza
(razred RecyclerView.java), koji slično kao i razred ListView.java, služi za
22
prikazivanje različitih kolekcija objekata. Uz bogatiju manipulaciju nad prikazom,
najvažnija prednost reciklirajućeg prikaza ostvaruje se pri učestalom pomicanju prozora
(scrolling), pri čemu se prikazani članovi označavaju i spremaju u memoriju. Ponovnim
pomicanjem prozora na prethodno prikazanog člana, svi podaci uključujući i razmještaj
elemenata, dohvaćaju se (recikliraju) iz memorije. Postupkom se minimizira učestalost
izvođenja zahtjevne metode napuhavanja prikaza (view inflating), koja je navedena u
sljedećem isječku:
LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_user_item, parent, false);
Za dohvaćanje i prikazivanje članova kolekcije zadužen je objekt razreda
UsersRecyclerViewAdapter.java koji nasljeđuje i proširuje osnovni razred
RecyclerView.Adapter.java te realizira sučelje OnClickListener.java
zaduženo za osluškivanje događaja potaknutih pritiskom na kontrolu. Struktura i razmještaj
elemenata prikaza pojedinog člana kolekcije definirani su unutar datoteke
layout_user_item.xml, a prikazani izgled na zaslonu vidljiv je na slici Slika 3.3.
Slika 3.3 Izgled korisničkog sučelja za prikaz korisnika
Pri pokretanju središnje aktivnosti, pozivom metode onCreateOptionsMenu()
izgrađuje se aplikacijski izbornik (razred Toolbar.java), koji korisniku daje mogućnost
odabira određenih akcija koje trenutno može obaviti. Pritiskom na jednu od ponuđenih opcija
unutar izbornika (Predloži, Poništi oznake, Odjava), poziva se metoda
onOptionsItemSelected()koja u slučaju akcije Predloži, pokreće otvaranje
dijaloškog okvira (razred DialogFragment.java) za predlaganje novog sastanka. Na
slici Slika 3.4 lijevo, prikazan je dijaloški okvir u stanju nakon postavljanja podataka o
sastanku: vrsta sastanka, vrijeme početka i vrijeme završetka sastanka.
23
Slika 3.4 Dijaloški okviri za predlaganje sastanaka
Podaci o vremenu održavanja sastanka postavljaju se unutar dijaloga za odabir vremena
(razred TimePickerDialog.java), koji je prikazan na slici Slika 3.4 desno. Na
kontrole je postavljena validacija koja provjerava međusobnu usklađenost termina početka i
završetka sastanka. U slučaju ispravnog postavljenja, na zaslonu se pojavljuje gumb Predloži
sastanak. Pritiskom na spomenuti gumb započinje se nova provjera koja sprječava pojavu
konfliktnih sastanaka.
Uz predlaganje sastanaka, unutar akcijskog izbornika ponuđena je dodatna opcija Poništi
oznake, koja briše oznake (element prikaza iz razreda CheckBox.java) korisnika koje su
prethodno razmatrani za dogovaranje sastanka. Posljednja opcija Odjavi odjavljuje korisnika
pri čemu vanjska komponenta automatski šalje informaciju o odsustvu korisnika ostalim
korisnicima.
Komponente za prikaz obavijesti
Za prikaz obavijesti unutar statusne trake operacijskog sustava koriste se dvije komponente:
primatelj namjera (razred NotificationBroadcastReceiver.java) i pozadinska
usluga za obradu namjera (razred NotificationIntentService.java). Obje
komponente popisane su unutar datoteke AndroidManifest.xml pri čemu je zatražena
dozvola od operacijskog sustava za postavljanje i uklanjanje zabrane odlaska uređaja u
pozadinsko stanje spavanja:
24
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Primatelj namjera nasljeđuje razred WakefulBroadcastReceiver.java, što mu
omogućuje postavljanje i uklanjanje spomenutih zabrana. Primatelj namjera pretplaćen je na
događaj primanja nove poruke, kojega razašilja zadužena vanjska komponenta. Prilikom
primanja namjere, unutar metode onReceive(), primatelj postavlja zabranu spavanja te
eksplicitno pokreće uslugu za obradu namjera kojoj se prosljeđuje razaslana namjera.
Pozadinska usluga (background service) nasljeđuje razred IntentService.java što
komponenti omogućuje neometani rad u vlastitoj dretvi. Aktivacijom asinkrone metode
onHandleIntent()obrađuje se primljena namjera. Na početku se dohvaćaju argumenti
namjere (intent extras), a potom korištenjem objekta iz knjižnice GSON obavlja obrnuti
postupak serijalizacije, koji tekstualni zapis tijela poruke (strukturirani format JSON1)
pretvara u instancu razreda MessageBody.java, koji sadrži sve potrebne atribute tijela
poruke. Postupak je prikazan u isječku Kod 3.2.
String body =
intent.getExtras().getString(MSG_EXTRA_JSON_BODY);
MessageBody messageBody =
new Gson().fromJson(body, MessageBody.class);
Kod 3.2 Dohvaćanje i izgradnja objekta tijela poruke
Nakon dohvaćanja i ponovne izgradnje objekta tijela poruke, aplikacija može započeti s
obradom sadržaja. Važno je napomenuti da se prije prikazivanja obavijesti, preko prethodno
spremljenih dogovorenih sastanaka, provjerava zauzetost korisnika te ukoliko je potrebno,
utoliko aplikacija potiho obavještava predlagatelja sastanka o zauzetosti pozvanog korisnika,
bez nepotrebnog ometanja pozvanog korisnika. Za uslugu prikazivanja obavijesti koristi se
instanca upravitelja obavijestima (razred NotificationManager.java) koji ovisno o
tipu dolazne poruke, prikazuje dvije vrste različito strukturiranih obavijesti. Ukoliko se radi
o nečijem prijedlogu za dogovaranje sastanka, aplikacija korisniku uz osnovne podatke o
sastanku, mora omogućiti unos odgovora kojim korisnik pristaje ili odbija prijedlog što je
prikazano na slici Slika 3.5:
1 JSON – JavaScript Object Notation, jednostavan format za razmjenu i prijenos podataka
25
Slika 3.5 Prikaz obavijesti predlaganja sastanka
Sustav automatski prosljeđuje odgovor vanjskoj komponenti, koristeći instancu razreda
PendingIntent.java koja se veže na akcijski gumb na prikazanoj obavijesti.
Ukoliko se radi o nečijem odgovoru na poslani prijedlog, dovoljno je prikazati sadržaj tijela
odgovora, kao što je prikazano na slici Slika 3.6:
Slika 3.6 Prikaz obavijesti odgovora
Komponenta za praćenje vremena
Upravitelj alarmima (razred AlarmManager.java) je komponenta koja pruža uslugu
postavljanja alarma na razini operacijskog sustava. Komponenta pravovremeno obavještava
aplikaciju o ispunjenju vremenskog termina, odnosno okidanju postavljenog sata. Definicija
akcije koju je potrebno izvesti neposredno nakon okidanja, preko namjere se predaje objektu
26
iz razreda PendingIntent.java. Komponenta se koristi pri svakom uspješnom
dogovaranju sastanka, pri čemu se na svim uređajima sudionika sastanka, alarm postavlja na
vrijeme početka i završetka sastanka, što osigurava pravovremeno ažuriranje informacije o
trenutnoj zauzetosti korisnika. Koristeći instancu razreda SharedPreferences.java,
svaki postavljeni alarm se sprema za slučaj ponovnog paljenja uređaja, pri čemu je potrebno
ponovno postaviti sve okidače. Isječak Kod 3.3 demonstrira postavljanje alarma koji će
okinuti za 10 sekundi nakon izvođenja:
// Dohvaćanje konteksta na razini aplikacije.
Context appContext = getApplicationContext();
// Varijable koje jednoznačno definiraju alarm.
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, +10);
long alarmTime = calendar.getTimeInMillis();
int alarmId = new Random().nextInt();
// Postavljanje akcije koja se treba obaviti,
// u ovom primjeru treba razaslati namjeru.
Intent intent = new Intent(INTENT_ALARM_DONE);
PendingIntent pendingIntent = PendingIntent
.getBroadcast(appContext, alarmId , intent, 0);
// Pozivanje upravitelja i postavljanje alarma
AlarmManager manager = (AlarmManager) appContext
.getSystemService(ALARM_SERVICE);
manager.set(RTC_WAKEUP, alarmTime, pendingIntent);
Kod 3.3 Postavljanje alarma
Komponenta za lokacijsku informaciju
Komponenta je namijenjena za pružanje informacija o lokaciji korisnika. Definirana je u
razredu PositionService.java koji nasljeđuje razred Service.java, a sastoji se
od dva upravitelja (manager) koji na razini operacijskog sustava, omogućuju pristup
informacijama o trenutnom stanju sklopovlja uređaja. Prvi upravitelj je objekt razreda
NetworkManager.java koji omogućuje pristup podacima o stanju mreže, dok je drugi
instanca razreda LocationManager.java koji je zadužen za pristup lokacijskim
27
podacima. Usluga je pretplaćena na dvije vrste događaja koje objavljuje operacijski sustav:
promjena trenutne lokacije korisnika te promjena stanja bežične mreže. Ukoliko dođe do
promjene lokacije korisnika, vrši se provjera kojom se utvrđuje fizička prisutnost korisnika
na određenoj lokaciji.
Za potrebe rada odabrana je lokacija zgrade FER-a, pri čemu je dopušteno odstupanje u
krugu od 150 metara, unutar kojega se korisnik i dalje smatra prisutnim. Ukoliko je
informacija o lokaciji nedostupna (onemogućenost ili nepostojanje sklopovlja za
pozicioniranje, uređaj GPS), usluga se oslanja na informaciji o stanju bežične mreže. Za
potrebu utvrđivanja trenutnog stanja, odabrana je bežična mreža FER-a (s identifikatorom
skupa usluga, FERwlan), koja je dostupna isključivo u bližoj okolici zgrade fakulteta.
Ukoliko je korisnik spojen na mrežu, usluga pretpostavlja fizičku prisutnost korisnika, koji
se vjerojatno nalazi u samoj zgradi ili bližoj okolici zgrade fakulteta. Svakom promjenom
stanja, usluga razašilja namjere koje obrađuje vanjska komponenta. Na ovaj način
omogućuje se automatska promjena informacija o prisutnosti.
3.2. Podržane funkcionalnosti aplikacije
Osnovne funkcionalnosti aplikacije koje korisnik može obavljati podijeljene su unutar tri
kategorije, što je prikazano i na dijagramu na slici Slika 3.7:
upravljanje korisničkim računom: registracija, prijava, odjava
upravljanje podacima: pregled kontakata, označavanje kontakata
dogovaranje sastanka: predlaganje sastanka, odgovaranje na prijedlog sastanka
28
Slika 3.7 Dijagram obrazaca uporabe: Korisnik
Za kategoriju upravljanja korisničkim računom između uređaja i poslužitelja, korisnik
isključivo unosi podatke te inicira radnje, dok sav preostali posao obavlja aplikacija. Zadaci
prikaza i osvježavanja podataka ostvaruju se automatski unutar glavnog zaslona, pri čemu
korisnik jednostavnim radnjama može postaviti ili ukloniti oznaku s prikaza kontakta.
Najvažnija kategorija u koju spadaju osnovne funkcionalnosti aplikacije je dogovaranje
sastanka. Postupak stvaranja prijedloga za sastanak sa svim provjerama sustava prikazan je
na slici Slika 3.8. Dijagram korišten na slici Slika 3.8 predstavlja ulaznu točku (početnu
poruku) za sekvencijski dijagram prikazan na slici Slika 3.9, koji opisuje cjelokupan
postupak predlaganja i odgovaranja na prijedlog o sastanku.
29
Slika 3.8 Sekvencijski dijagram: Stvaranje prijedloga za sastanka
Slika 3.9 Sekvencijski dijagram: Dogovaranje sastanka
30
U sljedećem popisu navedene su sve provjere koje aplikacija vrši:
provjera unosa korisničkih podataka pri registraciji
provjera isteka unesenog termina pri predlaganju sastanka
provjera termina početka i završetka sastanka
provjera konfliktnih sastanaka
provjera zauzetosti potencijalnog sudionika sastanka
3.3. Testiranje aplikacije
Za vrijeme izrade aplikacije, za potrebe testiranja korišteni su virtualni uređaji (takozvani
emulatori) koji na računalu pokreću operacijski sustav Android, verzije 5.1.1. Prije ugradnje
svih komponenti, vanjska komponenta za komunikaciju testirana je korištenjem dva
emulatora što je prikazano na slici Slika 3.10 Prikaz testiranja aplikacije, koji se spajaju s
poslužiteljem Openfire, verzije 3.10.0, postavljenim na računalu domaćinu (localhost) koji
je baziran na protokolu XMPP. Za praćenje kontrolnih poruka i stanja operacijskog sustava
uređaja korišten je alat logcat, koji dolazi zajedno s razvojnim okruženjem Android Studio.
Slika 3.10 Prikaz testiranja aplikacije
Posebno su ispitivani slučajevi kada aplikacija miruje u pozadini, pri čemu pokrenute usluge
neovisno nastavljaju s radom. U većini slučajeva aplikacija se ponašala kao što se i
očekivalo, ali je primijećen nedostatak pri oblikovanju usluga, koje se isključivo pokreću s
prvim pokretanjem aplikacije, što znači da se pri ponovnom paljenju uređaja aplikacija mora
pokrenuti da bi se korisnik prijavio u sustav i nastavio s uobičajenim radom. Ispitivane su
funkcionalnosti prikaza kontakata koji se pokazuju unutar liste na ekranu, a potrebno je bilo
31
uočiti slučaj korištenja koji nastupa pri označavanju potencijalnih sudionika sastanka.
Ukoliko bi u aplikaciju pristigla namjera za dohvat nove liste korisnika, aplikacija je morala
sačuvati prethodno označene korisnike te ih nakon postavljanja nove liste ponovno označiti.
U ponovljenim testovima nakon ispravke aplikacija se ponašala u skladu s očekivanjima.
Komponenta za provjeru lokacije korisnika testirana je pri radu s emulatorom pri čemu su
zadavane nasumične koordinate, čija promjena bi trebala biti registrirana. Aplikacija se
ponašala kao što je i očekivano, ali trebalo bi se napraviti više stvarnih testova na pravim
uređajima u stvarnom okruženju. Usluga praćenja stanja mreže se očekivano ponašala pri
svim pokretanjima i testiranju u stvarnom okruženju. Nekoliko puta testirana je usluga
postavljanja alarma koji je pravovremeno okidao. Nakon ugradnje svih komponenti,
aplikacija je testirana na stvarnom uređaju koji pokreće operacijski sustav Android, verzije
4.1.
32
Zaključak
Zadatak rada bio je oblikovati, programski izvesti i testirati aplikaciju za brzo dogovaranje
sastanaka pametnim telefonima s operacijskim sustavom Android. Korišteni su vanjski
poslužitelj te pripadna klijentska komponenta za operacijski sustav Android. Komunikacija
se odvijala protokolom XMPP, namijenjenim za brzu razmjenu kratkih poruka.
Na početku rada istraživane su različite tehnologije s postojećim rješenjima u području
aplikacija za trenutnu razmjenu poruka i dogovaranje sastanaka. Uočeni su brojni zahtjevi i
ograničenja za usklađivanje i održavanje istog sadržaja na više različitih uređaja, za što se
izvrsnim pokazao odabir vanjske komponente temeljenoj na protokolu XMPP. Ugradnja i
funkcionalnosti vanjske komponente uspješno su izvedene korištenjem pripremljenih
mehanizama operacijskog sustava, poput razašiljanja namjera i pozadinskog izvođenja
zadataka.
Uspješno su ostvarene osnovne funkcionalnosti aplikacije, uz nešto manje testiranje i
validaciju ponašanja, koje bi svakako trebalo provesti u slučaju daljnjeg rada na aplikaciji.
Moguće dorade aplikacije mogle bi se izvesti u oblikovanju korisničkog sučelja, ali i
proširenju lokacijske usluge, koja bi s više različitih izvora prikupljala podatke.
33
Literatura
[1] GOOGLE OFFICIAL BLOG, ANDROID FOR ALL AND THE NEW NEXUS 5
http://googleblog.blogspot.com/2013/10/android-for-all-and-new-nexus-5.html
[2] SILVAR, I. KONTEKSTNO-SVJESNA USLUGA PRISUTNOSTI TEMELJENA NA PROTOKOLU
XMPP, 2012.
[3] ANDROID DEVELOPERS, APPLICATION FUNDAMENTALS
http://developer.android.com/guide/components/fundamentals.html
[4] RAZVOJ USLUGA I APLIKACIJA ZA OPERACIJSKI SUSTAV ANDROID, 2015.
Predavanje: 8. Usluge i asinkrono izvođenje zadataka u pozadini
[5] PREGLED SIGURNOSTI GOOGLE ANDROID OPERACIJSKOG SUSTAVA
http://www.cert.hr/sites/default/files/NCERT-PUBDOC-2014-07-342_0.pdf
34
Sažetak
U ovom radu izrađena je aplikacija za brzo dogovaranje sastanaka pametnim telefonima s
operacijskim sustavom Android. Za komunikaciju i predlaganje sastanaka koristi se vanjska
komponenta za razmjenu poruka i informacija o prisutnosti protokolom XMPP. Pri
dogovaranju sastanaka, na osnovu informacija o prisutnosti, filtriraju se potencijalni
sudionici. Na osnovu lokacijske informacije omogućeno je automatsko mijenjanje
informacija o prisutnosti korisnika. Za izradu aplikacije proučeni su operacijski sustav
Android te glavne značajke protokola XMPP.
35
Summary
The result of this paper is a smartphone application for quick arrangement of meetings for
Android mobile devices. In order to exchange messages and presence with other users, an
external XMPP (Extensible Messaging and Presence Protocol) component was used. In
order to arrange meetings, application filters potential meeting participants by their presence
and automatically updates their location information. Android operating system and XMPP
protocol were studied in purpose of understanding technologies needed for the application
implementation.
36
Skraćenice
XMPP EXtensible Messaging and
Presence Protocol
proširivi protokol za razmjenu poruka i
informacija o prisutnosti
HTTP HyperText Transfer Protocol protokol HTTP
DNS Domain Name System sustav imenovanja domena
JID JabberID jedinstvena adresa (identifikator) protokola
XMPP
XML Extensible Markup Language jezik za označavanje podataka
SDK Software Development Kit programski paket za izradu aplikacija
AVD Android Virtual Device Android virtualni uređaj
DVM Dalvik Virtual Machine virtualni stroj Dalvik
JVM Java Virtual Machine virtualni stroj Java
JavaSE Java Standard Edition Java standardno izdanje
IM Instant Messaging trenutno poručivanje
P2P peer-to-peer isti-s-istim
JSON JavaScript Object Notation jednostavan format za razmjenu i prijenos
podataka
GPS Global Positioning System sustav za globalno pozicioniranje
37
Ključni pojmovi
Android, aplikacija, dogovor, sastanak, pametni telefon, operacijski sustav, platforma,
otvorenost, pokretni uređaj, programska potpora, Google, Open Handset Alliance, Android
SDK, Cupcake, Donut, Eclair, Jelly Bean, Kitkat, Lollipop, materijalni dizajn, Web,
programska knjižnica, Linux, Dalvik, Java, JavaSE, DVM, JVM, dex, aktivnost, usluga,
pružatelj sadržaja, primatelj namjera, kontakti, element prikaza, upravitelj, životni ciklus,
pokrenuta usluga, povezana usluga, razašiljanje, raspored prikaza, padajući izbornik,
protokol XMPP, XML, Jabber, Openfire, decentralizirana arhitektura, objavi-pretplati,
GSON, JSON, dijalog, komponenta, serijalizacija, obavijest, sat, okidač, informacija o
prisutnosti, lokacijska informacija
38
Key terms
application, Android, arrangment, meeting, smartphone, operating system, platform,
opensource, mobile device, software, Google, Open Handset Alliance, Android SDK,
Cupcake, Donut, Eclair, Jelly Bean, Kitkat, Lollipop, material design, Web, software
library, Linux, Dalvik, Java, JavaSE, DVM, JVM, dex, activity, service, content provider,
broadcastreceiver, contacts, view, manager, lifecycle, started service, bound service,
broadcasting, layout, spinner, XMPP Protocol, XML, Jabber, Openfire, decentralized
architecture, publish-subscribe, GSON, JSON, dialog, component, serialization,
notification, time, alarm, presence, location information