3. aplikacija za trenutno poručivanje
TRANSCRIPT
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
ZAVRŠNI RAD br. 3679
APLIKACIJA ZA TRENUTNO
PORUČIVANJE NA UREĐAJIMA S
OPERACIJSKIM SUSTAVOM ANDROID
Karlo Rogina
Zagreb, lipanj 2014.
Sadržaj
Uvod ...................................................................................................................................... 1
1. Operacijski sustav Android ........................................................................................... 2
1.1. Povijest operacijskog sustava Android .................................................................. 2
1.2. Arhitektura operacijskog sustava Android ............................................................ 4
1.3. Struktura Android aplikacija ................................................................................. 6
1.4. Korisničko sučelje aplikacija za Android ............................................................ 10
2. Protokol XMPP ........................................................................................................... 14
2.1. Povijest protokola XMPP .................................................................................... 14
2.2. Osnovne značajke protokola XMPP .................................................................... 15
2.3. Podrška za protokol XMPP u Androidu .............................................................. 18
3. Aplikacija za trenutno poručivanje .............................................................................. 21
3.1. Programska izvedba aplikacije ............................................................................ 21
3.2. Konfiguracija poslužitelja Openfire .................................................................... 29
Zaključak ............................................................................................................................. 31
Literatura ............................................................................................................................. 32
Sažetak ................................................................................................................................. 33
Summary .............................................................................................................................. 34
Skraćenice ............................................................................................................................ 35
Ključni pojmovi ................................................................................................................... 36
Key terms ............................................................................................................................. 37
Privitak A ............................................................................................................................. 38
Privitak B ............................................................................................................................. 39
1
Uvod
Trenutno poručivanje je razmjena kratkih tekstualnih poruka među korisnicima na
Internetu. Zbog konciznosti poruka koje se izmjenjuju, ono predstavlja najbrže rastući
komunikacijski medij u povijesti. Osim što pruža mogućnost trenutne razmjene poruka
među korisnicima, trenutno poručivanje također omogućava razmjenu datoteka te
informacija o prisutnosti korisnika. Stoga sve više korporacija uvodi trenutno poručivanje
kao dio svoje komunikacijske strategije. U korporativnom okruženju poruke i datoteke
koje korisnici razmjenjuju često je nužno arhivirati, nadzirati i regulirati. Bez mehanizama
koji to omogućavaju korporacija nije u mogućnosti spriječiti razotkrivanje intelektualnog
vlasništva ili drugih povjerljivih informacija. Stoga se za razmjenu poruka koriste
poslužitelji koji su dio privatne infrastrukture korporacije.
Ovaj rad bavi se oblikovanjem i programskom izvedbom aplikacije za trenutno
poručivanje na uređajima s operacijskim sustavom Android. Aplikacija se temelji na
protokolu XMPP. Razvijena aplikacija povezuje se na XMPP poslužitelj otvorenog koda.
U radu je također objašnjena instalacija i podešavanje jednog takvog poslužitelja.
Prvo poglavlje pruža uvid u platformu Android. Drugo poglavlje bavi se analizom
protokola XMPP te njegovom implementacijom u Androidu. U trećem poglavlju opisana je
razvijena aplikacija za trenutno poručivanje.
2
1. Operacijski sustav Android
U ovom poglavlju biti će prikazan razvoj operacijskog sustava Android od njegovih
začetaka pa sve do danas. Biti će objašnjena motivacija prilikom stvaranja ove platforme
kao i odnos prema dugoročnim ciljevima. Nakon toga slijedi pregled osnovnih značajki
ove platforme gdje će biti razjašnjen odabir tehnologija na kojima se Android temelji.
Potom slijedi pregled osnovne strukture jedne Android aplikacije kroz objašnjenje
osnovnih gradivnih blokova kao što su aktivnosti, namjere, usluge,primatelji objava i
drugi. Poglavlje završava opisom komponenata korisničkog sučelja Androida te prikazom
osnovnih načina za izradu korisničko sučelja Android aplikacije.
1.1. Povijest operacijskog sustava Android
Android je platforma otvorenog koda posebno projektirana za mobilne uređaje.
Slijedi kratki prikaz povijesti Androida s ciljem upoznavanja ključnih događaja na ovom
području te razumijevanja što bi mogla donijeti budućnost. Evo ključnih događaja za
platformu iz nekoliko prethodnih godina:
Google je 2005. godine kupio tvrtku Android, Inc.
2007. godine objavljen je savez Open Handset Alliance. Android službeno
postaje projekt otvorenog izvornog koda.
2008. godine objavljen je Android alat za izradu softvera (eng. Software
Development Kit, skraćeno SDK).
Tokom 2009. godine Android pokreće više od dvadeset uređaja. Objavljene
su nove verzije operacijskog sustava: Cupcake, Donut i Eclair.
U 2010. godini Android je druga najprodavanija platforma pametnih
telefona. Objavljena je verzija Froyo. U ponudi je više od šezdeset uređaja
koji ga koriste.
Krajem 2013. godine Android pokreće 80% proizvedenih pametnih telefona
te preuzima dominaciju na tržištu tableta. Objavljene su verzije Jelly Bean i
KitKat.
3
Za razvoj Android platforme najviše se zalaže tvrtka Google. Međutim, kako
projekt ne bi obuhvaćao isključivo Google, osnovan je savez Open Handset Alliance,
neprofitna grupa koju su formirali veliki mobilni operateri, proizvođači mobilnih uređaja,
softverske kompanije i drugi. Savez se obavezao na otvorenost, a kao cilj ističe
„ubrzavanje inovacija u mobilnim tehnologijama te pružanje korisnicima bogatijeg,
jeftinijeg i boljeg iskustva rada s mobilnim uređajima“ [1]. Savez danas broji preko 90
tehnoloških kompanija među kojima su HTC, Asus, Samsung, T-Mobile, Intel, Motorola i
drugi.
Uspjeh Androida temelji se na nekoliko ključnih faktora. Prilikom projektiranja
Androida tražena su ograničenja mobilnih uređaja koja se neće promijeniti u skorijoj
budućnosti. Primjerice, mali kapacitet baterija koje napajaju uređaje neće se promijeniti u
skorije vrijeme. Male dimenzije uređaja znače da će oni uvijek imati ograničenu brzinu i
kapacitet memorije. Ovakva ograničenja uzeta su u obzir od samog početka i o njima se
vodi računa u svim dijelovima platforme. Android je dizajniran tako da može raditi na
različitim uređajima, ne pretpostavljajući ništa o veličini zaslona, rezoluciji, skupu čipova i
slično. Na taj je način mnogo veći broj uređaja u mogućnosti izvršavati iste aplikacije.
Danas je Android preuzeo dominaciju na tržištu pametnih telefona i tableta.
Android programerima pruža sve alate za brz i jednostavan razvoj mobilnih
aplikacija kroz Android SDK koristeći programski jezik Java. SDK se isporučuje sa
skupom alata i Android virtualnim uređajem (Android virtual device, skraćeno AVD) na
kojem je moguće pokrenuti i isprobati razvijenu aplikaciju. Kako bi ubrzali razvoj
programske potpore, većina programera za rad koristi neko od integriranih razvojnih
okruženja (Integrated Development Environment, skraćeno IDE).
Kao i sav drugi softver i Android se s vremenom poboljšava. Taj napredak
odražava se kroz broj verzije. Nove inačice donose promjene u sučelju za programiranje
aplikacija (Application Programming Interface, skraćeno API), poboljšanje performansi te
uklanjaju pogreške. Svaka verzija Androida okarakterizirana je razinom API-ja te kodnim
imenom. Tako je na primjer u vrijeme pisanja ovog rada najnovija inačica Androida verzija
4.4, razine API-ja 19 te kodnog imena KitKat. Programerima je najčešće cilj da aplikacija
radi na što većem broju uređaja. Kako bi se to ostvarilo potrebno je pokušati ciljati na što
nižu razinu API-ja.
4
1.2. Arhitektura operacijskog sustava Android
Arhitektura operacijskog sustava Android dijeli se na 5 cjelina, kao što je prikazano
na slici 1.1:
aplikacije (applications),
kostur aplikacije (application framework),
biblioteke (libraries),
Android izvršno okruženje (Android runtime),
Linux jezgra (Linux kernel).
Slika 1.1 Arhitektura operacijskog sustava Android
Android je izgrađen na Linuxu, operacijskom sustavu otvorenog koda izabranom za
osnovu Androida zbog značajki kao što su prenosivost, sigurnost, upravljanje memorijom,
upravljanje napajanjem, kontrola mreže i drugih. Linux je prenosiva platforma koja se
relativno lako prevodi na raznim hardverskim arhitekturama. Time je Androidu omogućen
prijenos na širok raspon uređaja. Android mnoga sigurnosna pitanja prepušta temeljnom
5
Linux sustavu koji se pokazao kao iznimno siguran sustav. Sve Android aplikacije
izvršavaju se u posebnim Linux procesima s dopuštenjima zadanim kroz Linux sustav.
Izvorne biblioteke su C/C++ biblioteke, često preuzete iz zajednica koje razvijaju
softver otvorenog izvornog koda kako bi se sloju Android aplikacija pružile potrebne
usluge. Između ostalog tu su Webkit biblioteka za prikazivanje Web stranica, SQLite baza
podataka, OpenGL biblioteke za 3D grafiku i druge.
Dalvik je virtualni stroj razvijen posebno za Android. Iako je virtualni stroj za Javu
projektiran kao univerzalno rješenje, kreiran je Dalvik koji se fokusira isključivo na
mobilne uređaje. Dalvik je razvijen kako bi od početka na pravilan način tretirao
ograničenja kao što su trajanje baterije i snaga procesora. Izvorni kôd napisan u Javi
prevodi se u Javin bajt-kôd koristeći Javin jezični prevoditelj. Nakon toga, Javin bajt-kôd
potrebno je ponovo prevesti u Dalvikov bajt-kôd korištenjem odgovarajućeg jezičnog
prevoditelja. Dalvikov bajt-kôd se zatim izvršava na Dalvikovom virtualnom stroju. Na taj
način moguće je napisati Android aplikaciju u bilo kojem drugom jeziku koji se može
prevesti u Javin bajt-kôd a za kojeg su dostupne odgovarajuće biblioteke koje su dio SDK
paketa. Primjeri takvih jezika su Scala, Python i C++. Ipak, ustaljena praksa je da se za
programiranje za Android koristi programski jezik Java.
Skup biblioteka Androidove Jave najbliži je izdanju Java Standard Edition. Najveća
razlika je u tome što su biblioteke korisničkog sučelja (AWT i Swing) zamijenjene
posebnim bibliotekama za korisničko sučelje specifično za Android. Programerima na
raspolaganju stoji većina Java biblioteka uz dodatak mnogo novih posebno napravljenih za
Android. Te biblioteke nalaze se u kosturu aplikacije. Kostur aplikacije sadrži mnoge
upravitelje koji omogućavaju povezivanje aplikacije sa uslugama kao što su lokacija,
senzori, WiFi, usluge telefonije i druge. To je najbolje dokumentiran i najdetaljnije
obuhvaćen dio platforme jer je to sloj koji programerima omogućava kreativnost pri izradi
aplikacija.
Na posljetku , tu je sloj aplikacija. U aplikacijski sloj spadaju aplikacije koje mogu
biti unaprijed instalirane na uređaju ili se mogu preuzeti iz neke od trgovina aplikacija za
Android. Skup osnovnih aplikacija sačinjavaju e-mail klijent, Internet preglednik, SMS
aplikacija, kalendar i druge. Za Android postoje mnoge trgovine s aplikacijama. Svaka od
njih ima vlastiti skup pravila koja reguliraju što je dopušteno a što nije, kako se dijeli
zarada i tako dalje. Najveća trgovina je Android Market kojom upravlja Google.
6
1.3. Struktura Android aplikacija
Svaka Android aplikacija sastoji se od gradivnih blokova. Gradivni blokovi su
komponente koje programeri koriste za gradnju Android aplikacija. Slijedi pregled
osnovnih gradivnih blokova u Androidu.
1.3.1. Aktivnosti
Aktivnost (activity) najčešće predstavlja jedan zaslon koji korisnik u nekom
trenutku može vidjeti na uređaju. Aplikacije se obično sastoje od više aktivnosti, međutim
postoje i aplikacije koje ne sadržavaju niti jednu aktivnost. To su aplikacije koje se
izvršavaju u pozadini bez potrebe za interakcijom sa korisnikom. Android aplikacija sadrži
jednu glavnu aktivnost, i to je obično početna aktivnost koja se prikazuje prilikom
pokretanja aplikacije. Između aktivnosti prelazi se pomoću namjera. Koristeći namjere
moguće je prijeći u drugu aktivnost koja je dio iste aplikacije, ali je također moguće
pokrenuti aktivnost u potpuno drugoj aplikaciji. Na primjer, koristeći aplikaciju imenika
moguće je pronaći osobu kojoj želimo poslati poruku te zatim iz imenika pokrenuti
aktivnost aplikacije za slanje SMS poruka.
Pokretanje nove aktivnosti može značiti pokretanje novog Linux procesa, alociranje
memorije, napuhavanje svih objekata korisničkog sučelja iz XML rasporeda i sređivanje
zaslona. Iz svega navedenog može se zaključiti da je pokretanje aktivnosti vrlo skupa
operacija. Stoga se aktivnost ne odbacuje odmah nakon što korisnik napusti zaslon.
Upravitelj aktivnosti (activity manager) upravlja životnim ciklusom aktivnosti. On je
odgovoran za izradu i uništavanje aktivnosti te upravljanje njihovim radom. Nakon što
korisnik napusti aktivnost, upravitelj aktivnosti će tu aktivnost staviti na čekanje. Ako
korisnik poželi ponovo pristupiti toj aktivnosti, ona će se brže pokrenuti. Aktivnosti kojima
korisnik nije pristupao određeno vrijeme uništavaju se kako bi se oslobodio prostor za
nove aktivnosti. Ovim mehanizmom pokušalo se poboljšati brzinu korisničkog sučelja te
tako unaprijediti korisničko iskustvo pri korištenju aplikacije. Svaka aktivnost može se
naći u nekom od sljedećih stanja: stanje pokretanja, stanje izvršavanja, pauzirano stanje,
zaustavljeno stanje i uništeno stanje. Prelazak iz jednog stanja u drugo događa se pozivom
nekih od metoda: onCreate(), onStart(), onResume(), onPause(),
onStop(), onDestroy(). Slika 1.2 prikazuje stanja kroz koja aktivnost može proći,
takozvani životni ciklus aktivnosti (activity lifecycle).
7
Slika 1.2 Životni ciklus aktivnosti
Kada aktivnost ne postoji u memoriji kaže se da se nalazi u stanju pokretanja
(starting state). Dok se aktivnost pokreće ona prolazi skup metoda, koje su prepuštene
programerima za implementaciju, kako bi na posljetku završila u stanju izvršavanja
(running state). Prijelaz između stanja pokretanja i stanja izvršavanja jedna je od
najskupljih operacija te je to glavna motivacija zbog koje se aktivnosti ne uništavaju
automatski nakon što se više ne prikazuju.
Aktivnost je u pokrenutom stanju kada je prikazana na zaslonu uređaja. U jednom
trenutku može postojati samo jedna aktivnost u pokrenutom stanju. Kada je u pokrenutom
stanju, aktivnosti ima prioritet pristupanja memoriji i resursima koji su joj potrebni za
učinkovito izvršavanje.
Aktivnost je u pauziranom stanju kada nije u fokusu ali je i dalje vidljiva na
zaslonu uređaja. Ta se situacija najčešće događa kada se ispred aktivnosti prikaže dijaloški
okvir i pauzira je. Sve aktivnosti prolaze kroz pauzirano stanje na putu prema
zaustavljenom stanju.
8
Kada aktivnosti nije prikazana na zaslonu, ali je i dalje u memoriji, kažemo da je u
zaustavljenom stanju. Iz zaustavljenog stanja aktivnost se može ponovo dovesti u prvi plan
te postati pokrenuta aktivnost ili može biti uništena i uklonjena iz memorije. Upravitelj
aktivnosti drži aktivnosti u zaustavljenom stanju kada je vjerojatno da bi im se korisnik
mogao vratiti. Pokretanje zaustavljene aktivnosti mnogo je jeftinije od pokretanja
aktivnosti od početka iz razloga što je ona već učitana u memoriji i potrebno ju je
jednostavno dovesti u prvi plan. Zaustavljene aktivnosti mogu se ukloniti iz memorije u
bilo kojem trenutku.
Aktivnost se uništava kada upravitelj aktivnosti procijeni da ona više nije potrebna.
Na taj način oslobađaju se resursi sustava. Prije nego što je uništena, aktivnost može
obaviti neke poslove kao što je na primjer spremanje podataka. Navedeno je također
prepušteno programerima za implementaciju.
1.3.2. Namjere
Namjere (intents) su poruke koje se šalju između gradivnih blokova Androida.
Namjere se između ostalog koriste za pokretanje aktivnosti. Postoje dvije vrste namjera:
eksplicitne i implicitne. Eksplicitna namjera jasno definira primatelja poruke. Kod
implicitnih namjera definira se tip primatelja. Na primjer, aktivnost može poslati namjeru
otvaranja Web stranice. U tom slučaju sve aplikacije koje mogu otvarati Web stranice
mogu se natjecati da obave taj posao. Sustav će pitati korisnika koju aplikaciju želi
upotrijebiti za obavljanje posla. Također, moguće je zadati podrazumijevane aplikacije za
obavljanje određenih poslova što korisniku omogućava da zamijeni bilo koju aplikaciju na
sustavu sa prilagođenom.
1.3.3. Usluge
Usluge (services) se izvršavaju u pozadini i nemaju grafičko sučelje. One mogu
obavljati sve poslove kao i aktivnosti ali ne omogućavaju direktnu interakciju s
korisnikom. Usluge se mogu izvršavati u pozadini bez obzira na to koja je aktivnost
trenutno aktivna odnosno što je prikazano na ekranu. Činjenica da se izvršava u pozadini
ne znači da se izvršava u posebnoj dretvi. Naime, usluge i aktivnosti izvršavaju se u istoj
dretvi aplikacije koja se naziva i dretva korisničkog sučelja. Ako usluga treba obavljati
obradu koja traje duže vrijeme ona može blokirati glavnu dretvu te tako usporiti korisničko
sučelje. U tom slučaju, potrebno je pokrenuti uslugu u zasebnoj dretvi što je čest primjer
9
prilikom upućivanja mrežnih poziva. Usluga ne zavisi o aktivnosti kao ni o samoj
aplikaciji, što znači da može ostati aktivna čak i nakon što je korisnik ugasio aplikaciju.
1.3.4. Primatelji objava
Primatelji objava (broadcast receivers) Androidov su mehanizam pretplaćivanja na
događaje i reagiranja na njih. Sustav emitira događaje cijelo vrijeme. Neki od primjera
događaja su: pristigla SMS poruka, dolazni poziv, smanjenje napona u bateriji, promjena
vremenske zone, podizanje sustava i drugi. Aplikacija može imati neograničen broj
primatelja objava.
1.3.5. SQLite baza podataka
Kako bi podaci ostali sačuvani čak i kada korisnik zatvori aplikaciju ili isključi
uređaj, Android koristi SQLite bazu podataka. Iako se većina aplikacija oslanja na podatke
spremljene u oblaku, lokalno spremanje podataka omogućava pristup podatcima čak i kada
veza s mrežom nije dostupna - aplikacije obično koriste pozadinsku uslugu koja periodično
ažurira bazu preuzimanjem svježih podataka iz oblaka. Na taj način omogućava se brži
pristup podacima bez čekanja da se podaci preuzmu.
SQLite je relacijska baza podataka otvorenog izvornog koda popularna među
malim uređajima zbog toga što ne zahtijeva konfiguriranje i nema poslužitelja na kojem se
izvršava. Ona je u osnovi skup biblioteka koje pružaju funkcionalnost baze podataka.
SQLite sprema cijelu bazu podataka u jednu datoteku. Ta značajka pojednostavljuje
sigurnosne mjere jer se one svode na sigurnost sustava datoteka.
Android pruža DbHelper sučelje preko kojeg aplikacija može raditi sa SQLite
bazom podataka. Klasa DbHelper nudi sučelje visoke razine koje je mnogo
jednostavnije nego strukturirani jezik za postavljanje upita (Structured Data Language,
skraćeno SQL). DbHelper nudi metode insert(), query(), update() i delete().
Te metode zadovoljavaju četiri glavne operacije, koje se ukratko nazivaju kraticom CRUD:
Create (izradi), Read (čitaj), Update (ažuriraj) i Delete (obriši) [2].
Postoje tri dobra razloga zašto koristiti DbHelper, a ne izravno SQL. Prvi razlog
je sigurnost aplikacije. Unos korisnika ugrađuje se u SQL upit, što otvara mogućnost
napadima na aplikaciju putem metode injektiranja SQL koda. Ukoliko programer ne
provjeri i izolira korisnički unos, on bi mogao sadržavati SQL iskaze s neželjenim
10
efektima. Kao posljedica može doći do rušenja aplikacije i gubitka podataka. Nadalje, s
gledišta performansi, ponovljeno parsiranje SQL izraza prilikom svakog izvršavanja
izrazito je neučinkovito. Na posljetku, DbHelper metode mnogo su robusnije što znači
da je manja vjerojatnost da će proći kroz kompajliranje s neotkrivenim pogreškama.
Naime, pogreške u SQL kodu dolaze do izražaja tek u vrijeme izvršavanja.
1.3.6. Datoteka manifesta
Datoteka manifesta sadrži deklaracije svih komponenti aplikacije. Ta datoteka
strukturirana je kao XML datoteka naziva AndroidManifest.xml. Datoteka sadrži
deklaracije svih aktivnosti i usluga aplikacije kao i dozvole koje se dodjeljuju aplikaciji.
Na primjer, ako je aplikaciji za rad potreban pristup Internetu, potrebno je u datoteku
manifesta dodati odgovarajuću dozvolu oblika:
<uses-permission android:name=“android.permission.INTERNET“ />
Android ne vidi komponente koje nisu deklarirane u manifestu te se one stoga ne mogu
izvoditi.
1.3.7. Datoteka sa znakovnim nizovima
Datoteka sa znakovnim nizovima sadrži sav tekst koji aplikacija koristi: naziv
aplikacije, nazive gumba, natpise i slično. Datoteka je strukturirana kao tekstualna datoteka
naziva Strings.xml. Ukoliko aplikacija treba pružiti višejezičnu podršku, moguće je
kreirati više datoteka sa znakovnim nizovima, po jednu za svaki jezik. Odabir koja će se od
datoteka koristiti provodi sustav u ovisnosti o zadanim jezičnim postavkama uređaja.
1.4. Korisničko sučelje aplikacija za Android
U ovom poglavlju prikazati će se način na koji se gradi korisničko sučelje aplikacije za
operacijski sustav Android. Bit će navedeni osnovni rasporedi elemenata kao i najčešće
korištene komponente korisničkog sučelja. Dva su osnovna načina za izradu korisničkog
sučelja: deklarativno korisničko sučelje i programsko korisničko sučelje.
11
1.4.1. Deklarativno korisničko sučelje
Deklarativni pristup koristi proširivi jezik za označavanje (Extensible Markup
Language, skraćeno XML) za opisivanje izgleda korisničkog sučelja i obično se koristi za
deklariranje svih statičkih dijelova sučelja kao što je primjerice raspored elemenata na
zaslonu. Jedna od prednosti deklarativnog pristupa je mogućnost korištenja grafičkih alata
za izradu softvera (What You See Is What You Get, skraćeno WYSIWYG). Nedostatak
deklarativnog korisničkog sučelja je prije svega ograničenost XML-a. XML je odličan
način za deklariranje izgleda korisničkog sučelja, ali ne pruža adekvatan način za obradu
podataka koje unesu korisnici ili dinamičko mijenjanje sučelja prilikom interakcije s
korisnikom. U takvim i sličnim slučajevima u pomoć priskače programsko korisničko
sučelje.
1.4.2. Programsko korisničko sučelje
Programskim pristupom definira se što se događa uslijed interakcije korisnika s
različitim dijelovima korisničkog sučelja. Sve što se može postići deklarativno može se i
programski. Programsko korisničko sučelje gradi se pisanjem Java koda. U tom pogledu
Android je vrlo sličan alatima za razvoj korisničkih sučelja u drugim jezicima. Tako na
primjer, ako želimo izgraditi gumb, potrebno instancirati element gumba, dodati ga u
raspored te zadati svojstva kao što su visina, širina, boja, veličina teksta i ostalo. Kako bi
deklarirali što se događa pritiskom gumba potrebno je dodati još jedan dio koda koji se
aktivira na pritisak gumba.
1.4.3. Rasporedi elemenata
Android organizira elemente korisničkog sučelja u rasporede (layouts) i prikaze
(views). Prikazi su vidljive komponente kao što su gumb, natpis ili okvir za unos teksta.
Rasporedi organiziraju prikaze tako što ih grupiraju svaki na sebi svojstven način. Oni se
mogu ugnježđivati jedan unutar drugog. Postoji nekoliko najčešće korištenih rasporeda.
Linearni raspored (linear layout) jedan je od najčešćih rasporeda. On raspoređuje prikaze
jedan pored drugog. Važno svojstvo linearnog rasporeda je orijentacija (orientation) koja
može biti okomita ili vodoravna. Tablični raspored (table layout) raspoređuje prikaze u
tablicu. Sastoji se od više redaka koji mogu sadržavati druge elemente korisničkog sučelja.
Relativni raspored (relative layout) raspoređuje elemente relativno jednog u odnosu na
12
drugi. Apsolutni raspored (absolute layout) raspoređuje elemente prema apsolutnim
koordinatama na zaslonu. Korisničko sučelje definirano ovim rasporedom može dobro
izgledati na jednom zaslonu, međutim ako se veličina, orijentacija ili rezolucija zaslona
promijene neće se moći prilagoditi.
1.4.4. Komponente korisničkog sučelja
Komponente korisničkog sučelja (user interface components) pružaju standardiziran
raspored elemenata korisničkog sučelja za koje je potrebno samo definirati sadržaj.
Android programerima nudi nekoliko komponenata na korištenje sa pripadajućim API-
jima. Slijedi opis nekih od komponenata.
Izbornici su vjerojatno najčešće korištene komponente korisničkog sučelja. Izbornici
korisnicima pružaju jednostavnu i intuitivnu navigaciju kroz aktivnosti koje sadrži
aplikacija. Elemente izbornika također je moguće definirati u XML datoteci. U Androidu
postoje tri vrste izbornika. Izbornik opcija (options menu) sadrži osnovne akcije koje imaju
globalni utjecaj na cijelu aplikaciju. Otvara se pritiskom na gumb menija na samom
uređaju. Kontekstualni izbornik (context menu) otvara se dugim pritiskom na pojedini
element prikaza. Obično pruža akcije koje se tiču odabranog elementa prikaza. Skočni
izbornik (popup menu) prikazuje okomitu listu odabira koja je usidrena za prikaz koji je
aktivirao izbornik.
Dijalozi (dialogs) su mali prozori koji se pojavljuju iznad trenutno aktivne aktivnosti.
Aktivnost pri tome prelazi u pauzirano stanje. Dijalozi pružaju mogućnost interakcije s
korisnikom. Koriste se za obavijesti i dohvaćanje podataka od korisnika koji su neposredno
vezani uz aktivnost koja se izvodi. Android pruža nekoliko predefiniranih vrsta dijaloga,
međutim programer također ima mogućnost definirati svoj vlastiti izgled dijaloga. Od
osnovnih dijaloga tu su dijalog za odabir datuma (date picker dialog), dijalog za odabir
vremena (time picker dialog), dijalog za prikaz napretka (progress dialog) te dijalog za
upozorenje (alert dijalog).
Kratke obavijesti (toasts) su poruke koje se na kratko vrijeme prikazuju ispred
aktivnosti te automatski nestaju nakon zadanog intervala. Aktivnost pritom ne mijenja
svoje stanje tj. ostaje aktivna. Ova vrsta obavijesti ne pruža mogućnost nikakve interakcije.
Obično se koriste za pružanje povratne informacije korisniku vezane za rezultat izvođenja
neke operacije. Kôd 1.1 prikazuje upotrebu jedne takve kratke obavijesti. Primjer je
13
preuzet sa službenih Android stranica za programere [3]. Kao što je iz primjera vidljivo,
potrebno je instancirati Toast objekt koristeći makeText() metodu. Ova metoda
prihvaća tri parametra: kontekst aplikacije, tekst poruke te trajanje obavijesti. Nakon što je
instanciran, Toast objekt potrebno je prikazati koristeći metodu show().
Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
Kôd 1.1 Upotreba kratkih obavijesti
14
2. Protokol XMPP
Protokol XMPP (Extensible Messaging and Presence Protocol, skraćeno XMPP) je
komunikacijski protokol koji se temelji na tehnologijama otvorenog koda i otvorenim
standardima. Omogućava razmjenu malih strukturiranih dijelova podataka između dva ili
više entiteta u računalnoj mreži. Entiteti su uobičajeno klijent i poslužitelj, međutim XMPP
također podržava komunikaciju između dva poslužitelja ili dva klijenta (peer-to-peer
communication). Poruke koje se prenose temelje se na XML-u.
XMPP se koristi u širokom rasponu aplikacija uključujući aplikacije za trenutno
poručivanje (Instant Messaging, skraćeno IM), grupnu razmjenu poruka, video
konferencije, sinkronizaciju podataka, pretraživanje i druge. Većina današnjih društvenih
mreža kao što su Facebook, MySpace i Twitter također koriste protokol XMPP.
2.1. Povijest protokola XMPP
Protokol je razvijen od strane zajednice otvorenog koda Jabber 1999. godine odakle i
njegovo originalno ime „Jabber“. Motivacija prilikom razvoja ovog protokola bila je
pružanje jedinstvenog standarda za trenutno poručivanje. U to vrijeme svaka aplikacija
koristila je vlastiti protokol razvijen od strane korporacije koja je aplikaciju i proizvela. To
je onemogućavalo međusobnu komunikaciju korisnicima različitih IM servisa. Kao
posljedica toga razvijene su neke klijentske aplikacije koje su podržavale više IM servisa,
međutim to se nije pokazalo kao dobro rješenje. Protokol XMPP pružio je jedinstveno
rješenje za ovaj problem. Slijedi pregled nekoliko ključnih događaja prilikom razvoja
protokola:
1999. godine Jeremie Miller predstavlja poslužiteljsku implementaciju Jabber
protokola. Formira se zajednica i razvijaju implementacije koje uključuju sve
više klijenata.
U svibnju 2000. objavljena je prva produkcijska verzija protokola.
2001. osnovana je organizacija Jabber Software Foundation (JSF) koja nadzire
Jabber protokol i njegove implementacije.
15
2002. formirana je IETF (Internet Engineering Task Force) grupa posvećena
razvoju formalne specifikacije Jabber protokola pod neutralnim imenom
Extensible Messaging and Presence Protocol (XMPP).
Uslijedio je nagli rast popularnosti ovog protokola. Kao posljedica toga, sve više
Internetskih servisa pruža podršku za XMPP:
1999. godine pokrenut Jabber.org, prvi IM servis baziran na XMPP protokolu.
2005. godine Google predstavlja Google Talk, sustav koji koristi XMPP za
trenutno poručivanje, prijenos govora i prijenos datoteka.
2010. godine društvena mreža Facebook predstavlja XMPP podršku za svoju
uslugu razmjene kratkih poruka (Chat). Facebook ne sadrži interni XMPP
poslužitelj, već pruža XMPP sučelje klijentskim aplikacijama. Posljedica toga
jest da je XMPP podrška ograničena te pojedine značajke nisu dostupne.
2011. godine Microsoft Messenger i Skype također pružaju ograničenu XMPP
podršku.
U današnje vrijeme postoje mnoge implementacije XMPP klijenata i poslužitelja, kako
komercijalnih tako i otvorenog koda. Programeri skoro svakog programskog jezika mogu
pronaći odgovarajuću biblioteku kako bi ubrzali razvoj XMPP aplikacija.
2.2. Osnovne značajke protokola XMPP
Slijedi opis osnovnih značajki protokola XMPP kao što su arhitektura, adresiranje i
transport podataka. Na ovim značajkama temelji se svaka XMPP aplikacija.
2.2.1. Arhitektura
XMPP koristi decentraliziranu klijent-poslužitelj arhitekturu. Slika 2.1 prikazuje
pojednostavljenu verziju arhitekture sa tri poslužitelja od kojih svaki poslužuje po nekoliko
klijenata. Poslužitelji obično koriste softver kao što je eJabberd ili Openfire, dok klijente
najčešće pokreće softver kao što je Adium, Pidgin ili Psi.
16
Slika 2.1 Arhitektura protokola XMPP
Decentralizirana klijent-poslužitelj arhitektura omogućava učinkovito razdvajanje
obaveza. Poslužiteljska strana obično je zadužena za sigurnost, autentifikaciju korisnika,
enkripciju podataka i slično. S druge pak strane, to omogućava programerima koji razvijaju
klijentske aplikacije da se mogu više usredotočiti na korisničko iskustvo. Za razliku od
Web arhitekture, u XMPP arhitekturi poslužitelji su međusobno povezani. Kada klijent
šalje poruku drugome klijentu koji se nalazi na drugoj domeni, on se povezuje na svoj
poslužitelj, koji se tada direktno povezuje na poslužitelj na kojem se nalazi primatelj.
Poruka na taj način ne prolazi kroz posredničke poslužitelje kao što je to slučaj kod email
arhitekture.
2.2.2. Adresiranje
S obzirom da se komunikacija protokolom XMPP odvija na mreži, svakom XMPP
korisniku mora biti dodijeljena jedinstvena adresa koja se naziva JabberID (skraćeno JID).
JabberId je oblika [email protected], slično kao mail adresa. Kao što je iz oblika
adrese vidljivo, svaki JabberID sadrži domenski dio. Domenski dio služi za određivanje
poslužitelja na kojeg se klijent spaja. Pri tome se koristi sustav DNS (Domain Name
System) koji služi za dobivanje IP adrese poslužitelja iz simboličkog imena.
17
Kada se klijent povezuje na XMPP poslužitelj, na adresu se dodaje identifikator
resursa za tu jedinstvenu konekciju. Taj resurs se tada koristi da bi se poruke usmjerile na
točno tu konekciju umjesto na neku drugu koju je korisnik mogao otvoriti istovremeno
koristeći više uređaja. Resurs se dodaje na kraj adrese, te je adresa tada oblika
[email protected]/resurs. Resurs se obično sastoji od imena računala, lokacije ili
klijentskog softvera.
2.2.3. Prijenos podataka
Prijenos podataka temelji se na XML-u. Prilikom stvaranja sjednice sa
poslužiteljem otvara se TCP konekcija te uspostavlja dvosmjerni tok podataka sa
poslužiteljem. Nakon uspostave veze, klijent i poslužitelj mogu asinkrono izmjenjivati
neograničen broj XML poruka, takozvanih XMPP strofa (XMPP stanzas). Postoje 3 vrste
strofa: <message/>, <presence/> i <iq/>.
Strofa <message/> koristi se za slanje poruka, upozorenja, obavijesti te za
grupni razgovor. Postoji pet vrsta strofe <message/> ovisno o atributu type: normal,
chat, groupchat, headline i error. Atributi from i to sadrže JabberID
pošiljatelja i primatelja poruke. Kôd 2.1 prikazuje XMPP strofu <message/> poslanu od
strane klijenta poslužitelju.
<message type="chat"
from="[email protected]"
to="[email protected]">
<body>Hello World!</body>
</message>
Kôd 2.1 XMPP strofa
Strofa <presence/> koristi se za razmjenu informacije o prisutnosti korisnika na
mreži. Svaki korisnik ima mogućnost postaviti svoje stanje prisutnosti, koje drugi korisnici
mogu vidjeti ako su za to autorizirani. Autorizacija se odvija kroz jednostavan zahtjev za
pretplatom kojeg korisnik treba odobriti ukoliko želi da drugi korisnik vidi njegovo stanje
prisutnosti. Ako je autorizacija odobrena, korisnici će redovito biti obaviješteni o
promjenama stanja prisutnosti.
Strofa <iq/> koristi se za slanje zahtjeva i odgovora kao što su zahtjev za
registracijom, zahtjev za dohvatom liste kontakata i slično. Sadrži atribut type koji može
18
poprimiti jednu od četiri vrijednosti: get, set, result i error. Vrijednost get koristi
se za dohvat informacije, dok se set koristi za pružanje informacije. Vrijednost result
koristi se kao odgovor na operaciju get ili potvrda operacije set. Vrijednost error služi
za dojavu greške prilikom procesiranja zahtjeva.
XMPP ne zahtijeva potvrdu o isporuci za sve vrste strofa. Pretpostavlja se da su
strofe <message/> i <presence/> uspješno dostavljene ako nije dojavljena greška te
se ne zahtijeva potvrda primatelja. Strofa <iq/> s druge strane zahtijeva odgovor o
uspješnom primitku poruke ili dojavu greške.
2.3. Podrška za protokol XMPP u Androidu
Za implementaciju protokola XMPP u Androidu na raspolaganju stoji nekoliko
bilblioteka od kojih je najpopularnija biblioteka otvorenog koda aSmack [4]. Biblioteka
aSmack predstavlja za Android prilagođenu inačicu Smack biblioteke dostupne za
programski jezik Java. Korištenje biblioteke aSmack ne zahtijeva poznavanje XML
formata na kojem se temelji XMPP, već omogućava efikasnije programiranje na višoj
razini apstrakcije pružajući klase kao što su Connection, Chat, Roster itd. Slijedi
nekoliko primjera uporabe navedene biblioteke u svrhu upoznavanja mogućnosti koje
pruža. Detaljniji opis korištenja biblioteke moguće je pronaći u dokumentaciji [5].
Uspostavu konekcije sa XMPP poslužiteljem moguće je izvesti na način prikazan u
kodu 2.2. Uspostava konekcije provodi se instanciranjem klase XMPPConnection.
Korištenjem klase ConnectionConfiguration moguće je specificirati adresu i vrata
(port) na kojima sluša poslužitelj, omogućiti kompresiju, podesiti postavke sigurnosti itd.
ConnectionConfiguration config = new
ConnectionConfiguration("jabber.org", 5222);
config.setCompressionEnabled(true);
config.setSASLAuthenticationEnabled(true);
Connection connection = new XMPPConnection(config);
connection.connect();
connection.login("username", "password");
Kôd 2.2 Uspostava konekcije sa poslužiteljem
19
Slanje poruka odvija se koristeći klasu Chat kao što je demonstrirano u kodu 2.3. Za
kreiranje nove poruke koristi se klasa Message te pripadna metoda setBody(). Poruci
je moguće pridodati dodatna svojstva koristeći metodu setProperty(). Prilikom
instanciranja klase Chat potrebno je zadati korisnika kojem se šalje poruka te definirati
novi MessageListener koji biva obaviješten svaki puta kada stigne nova poruka.
ChatManager chatManager = connection.getChatManager();
Chat chat = chatManager.createChat("[email protected]", new
MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.println("Received message: " + message);
}
});
Message message = new Message();
message.setBody("Hello World!");
message.setProperty("color","blue");
chat.sendMessage(message);
Kôd 2.3 Slanje poruka
Za dohvaćanje grupe korisnika i prisutnost koriste se klase Roster i Presence kao što
je prikazano u kodu 2.4. Svaki korisnik u grupi predstavljen je klasom RosterEntry.
Roster roster = connection.getRoster();
Presence presence = Roster.getPresence("[email protected]");
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {
System.out.println(entry);
}
Kôd 2.4 Dohvaćanje grupe korisnika i evidencije prisutnosti
Kôd 2.5 prikazuje način na koji se šalje datoteka drugom korisniku. Korisnik koji prima
datoteku ima mogućnost prihvaćanja, odbijanja ili ignoriranja zahtjeva za primanjem
datoteke. Kako bi se poslala datoteka potrebno je instancirati klasu
FileTransferManager koja kao parametar prima konekciju. Klasa
FileTransferManager omogućava instanciranje klase OutgoingFileTransfer
pomoću metode createOutgoingFileTransfer(String) koja kao parametar
20
prima identifikator korisnika. Datoteka se šalje pozivom metode sendFile(File,
String) nad instancom klase OutgoingFileTransfer.
FileTransferManager manager = new FileTransferManager(connection);
OutgoingFileTransfer transfer =
manager.createOutgoingFileTransfer("[email protected]");
transfer.sendFile(new File("file.txt"), "message");
Kôd 2.5 Slanje datoteka
Potpuni opis svih klasa i metoda moguće je pronaći u službenoj Javadoc dokumentaciji [6].
Biblioteka aSmack sadržava ugrađen alat za ispravljanje grešaka (debugging)
Enhanced Debugger koji omogućava praćenje XML prometa između klijenta i poslužitelja.
Ispravljanje pogrešaka potrebno je omogućiti u kodu dodavanjem linije
Connection.DEBUG_ENABLED = true; prije kreiranja nove konekcije. Također je
potrebno podesiti sistemske postavke Jave upisivanjem naredbe java -
Dsmack.debugEnabled=true AppName u komandnom prozoru. Sav XML promet
pohranjuje se u Android dnevniku (Android log) kojem je moguće pristupiti korištenjem
alata LogCat. Alat LogCat isporučuje se kao sastavni dio Android SDK.
21
3. Aplikacija za trenutno poručivanje
U praktičnom dijelu ovog završnog rada je razvijena aplikacija za trenutno
poručivanje koja se temelji na protokolu XMPP. Aplikacija omogućava razmjenu kratkih
tekstualnih poruka, razmjenu datoteka te informacija o prisutnosti korisnika. Namijenjena
je uređajima s operacijskim sustavom Android.
Aplikacija se spaja na prethodno instaliran i podešen XMPP poslužitelj sa kojeg
dohvaća sve potrebne podatke o korisnicima. Sva razmjena poruka i datoteka odvija se
posredstvom poslužitelja.
Za izradu aplikacije korištena je razvojna okolina Eclipse. Upute za instalaciju i
podešavanje razvojne okoline i Android SDK paketa moguće je pronaći u Privitaku.
Testiranje rada aplikacije provedeno je na stvarnim uređajima. Za implementaciju
protokola XMPP u realiziranoj aplikaciji korištena je biblioteka aSmack opisana u
poglavlju 2.3. Biblioteka je dostupna na adresi http://asmack.freakempire.de/. Izabrana je
verzija biblioteke asmack-android-19-0.8.10.jar koja odgovara ciljanoj verziji
Androida.
Aplikacija pruža podršku za hrvatski i engleski jezik. Koji jezik će se odabrati za
prikaz aplikacije ovisi isključivo o korisničkim postavkama samog uređaja na kojem se
aplikacija izvršava.
3.1. Programska izvedba aplikacije
Ovo poglavlje nudi opis razvijene aplikacije. Detaljno su opisane sve razvijene
komponente aplikacije te navedene moguće buduće dorade.
3.1.1. Podržane verzije operacijskog sustava
Kao prvi korak u realizaciji svake Android aplikacije potrebno je odrediti
minimalnu verziju Androida na kojoj je moguće pokrenuti aplikaciju (Minimum required
SDK) i ciljanu verziju Androida (Target SDK). Android će spriječiti instalaciju aplikacije
ako je verzija platforme manja od minimalne verzije SDK. Ciljana verzija eksplicitno
navodi Androidu da je aplikacija testirana na toj verziji Androida te da ju je moguće
22
pokrenuti na svim nižim verzijama sve do minimalne verzije SDK. Na verzijama višim od
ciljane verzije Android može primijeniti postavke kompatibilnosti. Kao minimalna verzija
aplikacije odabran je Android 4.0 (API 14, IceCreamSandwich), dok je kao ciljana verzija
odabrana najnovija verzija Androida u vrijeme izrade ovog rada Android 4.4 (API 19,
KitKat).
3.1.2. Komponente aplikacije
Slijedi opis glavnih komponenti aplikacije. Glavne aktivnosti aplikacije prikazane
su slikom 3.1. Radi sažetosti prikaza, u dijagramu klasa izostavljen je prikaz atributa i
metoda.
Slika 3.1 Dijagram klasa - Aktivnosti
Aktivnost LoginActivity.java omogućava prijavu korisnika. Aktivnost
SettingsActivity.java omogućava odjavu korisnika te pruža osnovne informacije
o aplikaciji i prijavljenom korisniku. Aktivnosti RosterActivity.java i
ConversationActivity.java nasljeđuju ListActivity.java. Aktivnost
RosterActivity.java prikazuje popis kontakata te informaciju o prisutnosti za svaki
pojedini kontakt iz liste dok aktivnost ConversationActivity.java omogućava
razmjenu poruka i datoteka između korisnika te ujedno i prikazuje razmijenjene poruke i
datoteke. Aktivnost RosterActivity.java koristi klasu RosterAdapter.java
za popunjavanje liste kontakata dok aktivnost ConversationActivity.java koristi
klasu ConversationAdapter.java za popunjavanje liste poruka.
23
Za komunikaciju sa poslužiteljem koristi se pozadinska usluga
BackgroundService.java. Klasa StartServiceReceiver.java omogućava
pokretanje usluge prilikom paljenja uređaja. Baza podataka predstavljena je klasom
MessengerDBOpenHelper.java dok klasa MessengerDataSource.java služi
za dohvat podataka postavljanjem upita bazi podataka. Klasa Contact.java predstavlja
model kontakta koji se sastoji od jedinstvene adrese, imena te prisutnosti. Osnovne
informacije o aplikaciji prikazane su klasom AboutDialog.java. Na posljetku, tu su
još i pomoćne klase Constants.java koja pruža definicije konstanti i klasa
Util.java koja pruža funkcionalnosti korištene od strane ostalih klasa u aplikaciji.
3.1.3. Prijava i odjava
Aktivnost LoginActivity.java omogućava
prijavu korisnika. Slika 3.2 prikazuje korisničko sučelje
aktivnosti. Korisnik se prijavljuje upisom korisničkog imena
i lozinke u za to predviđena polja. Pritiskom na gumb
Prijava aktivnost šalje zahtjev za prijavom pozadinskoj
usluzi BackgroundService.java, dok se pritiskom na
gumb Odustani aktivnost gasi. Jednom kada je zahtjev za
prijavom poslan, aktivnost prikazuje dijalog u kojem se
korisnika moli da pričeka dok se ne uspostavi veza sa
poslužiteljem i provjere upisani podatci za prijavu. Dijalog je
aktivan sve dok aktivnost ne primi odgovor od pozadinske
usluge. Po primitku odgovora, ako je prijava uspješna
korisnika se prosljeđuje u aktivnost za prikaz kontakata.
Korisničko ime i lozinka spremaju se koristeći klasu
SharedPreferences.java kako bi se korisnika ubuduće moglo automatski prijaviti.
Ako prijava nije uspješna ili poslužitelj nije dostupan, korisnik se obavještava prikazom
kratke poruke za što se koristi klasa Toast.java. Jednom kada je korisnik prijavljen,
pozadinska usluga će neprestano osluškivati nadolazeće poruke od poslužitelja te po
primitku istih obavještavati korisnika.
Pozadinska usluga gasi se kada korisnik podnese zahtjev za odjavom. Odjava je
moguća iz aktivnosti SettingsActivity.java. Klikom na ikonu odjave, otvara se
Slika 3.2 Prijava korisnika
24
dijaloški okvir koji od korisnika traži potvrdu odjave. U slučaju potvrdnog odgovora,
aktivnost šalje zahtjev za odjavom pozadinskoj usluzi. Brišu se spremljeno korisničko ime
i lozinka. Usluga šalje zahtjev za odjavom poslužitelju te se nakon toga gasi.
3.1.4. Pozadinska usluga i komunikacija s poslužiteljem
Sva komunikacija sa poslužiteljem odvija se preko pozadinske usluge koji se izvodi
u zasebnoj dretvi. Aktivnosti upućuju zahtjeve usluzi koristeći namjere nakon čega usluga
razmjenjuje podatke sa poslužiteljem te odgovara na zahtjev aktivnostima odašiljanjem
namjera (Brodcast Intent). Svaka odaslana namjera ima zadanu akciju na koje se aktivnosti
pretplaćuju koristeći klasu BroadcastReceiver.java. Ako je aktivnost pretplaćena
na određenu vrstu namjere, ona će tu namjeru primiti te obraditi. Tipični primjeri zahtjeva
koje aktivnosti upućuju usluzi su zahtjevi za prijavom i odjavom te zahtjev za slanje
poruke ili datoteke.
Slika 3.3 prikazuje vremenski slijed događaja za slučaj primitka nove poruke.
Najprije pozadinska usluga prima novu poruku od poslužitelja. Nakon toga usluga sprema
poruku u bazu koristeći jednu od metoda klase MessengerDataSource.java. Nakon
što je poruka spremljena u bazu, usluga odašilje namjeru sa postavljenom akcijom primitka
nove poruke. Aktivnost koja je pretplaćena na navedenu akciju, u ovom slučaju
ConversationActivity.java, prima namjeru te na temelju toga određuje da mora
dohvatiti novu poruku iz baze podataka što također čini pozivom jedne od metoda klase
MessengerDataSource.java. Po dohvatu nove poruke iz baze podataka, aktivnost
dodaje novu poruku na dno liste poruka te osvježava prikaz istih.
25
Slika 3.3 Sekvencijski dijagram - primanje nove poruke
Usluga je aktivna od trenutka prijave korisnika pa sve do trenutka odjave. Prijavom
korisnika usluga se spaja na poslužitelj te osluškuje nove poruke, informacije o
promjenama prisutnosti, informacije o promjenama grupe kontakata te zahtjev za
prijenosom datoteke. Usluga se također pokreće prilikom pokretanja uređaja nakon čega
provjerava postoje li spremljeni korisničko ime i lozinka te ako postoje prijavljuje se na
poslužitelj i nastavlja osluškivati u pozadini. Razmjena datoteka i razmjena poruka
odvijaju se u zasebnim dretvama što omogućava nesmetanu razmjenu poruka između
kontakata za vrijeme trajanja prijenosa datoteke. Ako je usluga ugašena od strane
operacijskog sustava, usluga će se ponovno pokrenuti te pokušati uspostaviti vezu sa
poslužiteljem. U slučaju gubitka veze sa poslužiteljem, usluga će pokušavati ponovno
uspostaviti vezu slanjem periodičnih zahtjeva poslužitelju sve do uspješnog uspostavljanja
veze. Navedeno je ostvareno upotrebom klase ConnectionListener.java koja je
dio aSmack biblioteke. Važno je napomenuti da je period zahtjeva za ponovnom
uspostavom konekcije u početku kratak te se s vremenom postupno povećava.
26
3.1.5. Baza podataka
Podatke o korisnikovim kontaktima te primljenim i odaslanim porukama usluga
sprema u bazu podataka. Ukoliko aplikacija izgubi vezu s poslužiteljem, korisnik i dalje
može pregledavati poruke iz prošlosti, međutim ako pokuša poslati novu poruku biti će
obaviješten da je veza s poslužiteljem izgubljena.
Baza podataka predstavljena je klasom MessengerDBOpenHelper.java. Baza se
sastoji od 3 tablice: tablica korisnika, tablica poruka i tablica kontakata. Slika 3.4 prikazuje
tablice kreirane relacijske baze podataka.
Slika 3.4 Baza podataka
Tablica Kontakti sadrži popis korisnika i njemu pridruženih kontakata. Na istom
uređaju aplikaciju može koristiti više različitih korisnika. Ova tablica za svakog će
korisnika sadržavati informacije o pridruženim kontaktima. Tablica Kontakt sadrži
informacije o kontaktu: jedinstveno korisničko ime kontakta (JID), ime kontakta te
prisutnost. Tablica Poruke sadrži informacije o porukama: Id poruke, pošiljatelja,
primatelja, text poruke te vrijeme kada je poruka poslana.
3.1.6. Prikaz kontakata i prisutnosti
Aktivnost RosterActivity.java prikazuje listu kontakata te za svaki od
kontakata informaciju o prisutnosti te posljednju poruku koju je koju korisnik razmijenio
sa kontaktom. Lista kontakata popunjava se koristeći klasu RosterAdapter.java.
Kontakti koji su trenutno aktivni biti će prikazani zelenom ikonom, dok će kontakti koji
nisu prijavljeni biti prikazani sivom ikonom. Aktivnost je pretplaćena na primanje
informacija o promjenama prisutnosti kontakata te na primanje informacije o promjeni
grupe kontakata. U slučaju promjene prisutnosti nekog od kontakata, pozadinska usluga će
obavijestiti aktivnost te će aktivnost dohvatiti obnovljene podatke o kontaktu iz baze
27
podataka te osvježiti prikaz liste kontakata. Slično se također događa u slučaju da
administrator poslužitelja obriše određeni kontakt ili doda
novi kontakt u korisnikovu grupu kontakata. Aktivnost će o
tome biti obaviještena, nakon čega će iz baze podataka
dohvatiti nove podatke o kontaktima, osvježiti prikaz liste
kontakata te kratkom porukom obavijestiti korisnika da su
kontakti osvježeni. Slika 3.5 prikazuje korisničko sučelje
aktivnosti RosterActivity.java. Kontakti Davor,
Dodo i Ivona su trenutno aktivni te su prikazani zelenom
ikonom. Kontakti Edi, Silvija i Snježana nisu aktivni te su
prikazani sivom ikonom kontakta. Za svakog kontakta
također je prikazana posljednja poruka ispod nadimka
kontakta. U slučaju da poruka nema, umjesto posljednje
poruke prikazuje se tekst Nema poruka. Kratkim pritiskom
na pojedinog kontakta iz liste otvara se aktivnost
ConversationActivity.java koja prikazuje poruke
između korisnika i navedenog kontakta.
3.1.7. Razmjena poruka i datoteka
Aktivnost ConversationActivity.java omogućava
razmjenu poruka i datoteka između korisnika. Za popunjavanje
liste poruka aktivnost koristi klasu
ConversationAdapter.java. Slika 3.6 prikazuje
razgovor između korisnika Karlo Rogina i kontakta Dodo. Na
naslovnoj traci aktivnosti prikazuje se ikona kontakta koja
poprima zelenu boju ako je korisnik aktivan odnosno sivu ako
nije. Desno do ikone kontakta nalazi se ime kontakta. Na
desnoj strani naslovne trake nalaze se dvije ikone za odabir
datoteka za slanje. Prva ikona pokreće namjeru za otvaranjem
aplikacije za baratanje datotečnim sustavom (File Manager).
Ukoliko korisnik na uređaju nema instaliranu aplikaciju te
vrste, o tome će biti obaviješten kratkom porukom. Druga
ikona otvara aplikaciju Galerija (Gallery) te nudi korisniku
Slika 3.5 Prikaz kontakata i
prisutnosti
Slika 3.6 Razmjena poruka i
datoteka
28
mogućnost odabira slike za slanje. Nakon što korisnik odabere datoteku za slanje pomoću
jedne od navedenih aplikacija, putanja do datoteke vraća se u originalnu aktivnost te
korisnik ima mogućnost poslati datoteku. Tijekom slanja datoteke prikazuje se postotak
prijenosa datoteke.
Poruke se šalju unosom teksta u za to predviđeno polje te pritiskom na gumb Šalji.
Poslane poruke prikazuju se u okviru crvene boje te su desno poravnate. Primljene poruke
prikazuju se u okviru plave boje te su lijevo poravnate. Za svaku poruku prikazuje se ime
pošiljatelja, vrijeme kada je poruka poslana te tekst poruke. Okvir poruke automatski se
prilagođava veličini poruke. Poruke se u listu iz baze podataka učitavaju u skupinama od N
poruka. Prilikom pokretanja aktivnosti biti će učitano prvih N poruka. Aktivnost
implementira sučelje OnScrollListener što joj omogućava primanje događaja
vezanih za pomicanje liste poruka gore-dolje (scrolling). U trenutku kada prva odnosno
vremenski najstarija poruka iz liste postane vidljiva, iz baze podataka će se učitati novi set
od N poruka te dodati na početak liste poruka.
Aktivnost je pretplaćena na događaje promjene prisutnosti, prijenosa datoteke te
primitka poruke. U slučaju primitka nove poruke ili prijenosa datoteke nova poruka biti će
dodana na dno liste poruka. Ukoliko je poruka primljena od kontakta čiji je razgovor
trenutno aktivan, poruka neće izazvati obavijest (notification). S druge pak strane, ako je
pristigla poruka kontakta čiji razgovor nije trenutno aktivan, primitak poruke izazvati će
generiranje obavijesti. Obavijest je popraćena zvukom i prikazom pošiljatelja te teksta
poruke. Pritisak na obavijest otvara aktivnost razgovora sa kontaktom od kojeg je poruka
primljena. Jednom kada je poruka pročitana, obavijest se automatski uklanja.
Aplikacija stvara vlastitu strukturu direktorija u memoriji uređaja u koje pohranjuje
prenesene datoteke. Slike se pohranjuju u zaseban direktorij od ostalih datoteka. Potrebna
struktura direktorija će se kreirati prilikom primitka datoteke ako do tada već nije bila
kreirana.
3.1.8. Testiranje aplikacije
Tijekom razvoja aplikacije korišten je Android virtualni uređaj koji dolazi u Android
SDK paketu te Genymotion emulator koji se pokazao kao znatno brži i jednostavniji za
korištenje. Rad aplikacije također je testiran na sljedećim uređajima:
Sony Xperia J, Android 4.1.2
29
Samsung Galaxy Tab3, Android 4.1.2
Samsung Galaxy S3, Android 4.1.1
Sve uočene pogreške uspješno su otklonjene.
3.1.9. Buduće dorade aplikacije
Moguće buduće dorade aplikacije mogle bi uključivati proširenje usluge razmjene
poruka mogućnošću kreiranja grupnih razgovora. Svaki od korisnika imao bi mogućnost
kreirati grupni razgovor te pozvati kontakte iz svoje liste kontakata da prisustvuju u
razgovoru. Poruke koje se razmjenjuju unutar grupnog razgovora primali bi svi kontakti
koji prisustvuju razgovoru.
Sljedeća moguća dorada aplikacije uključivala bi prikaz informacije o lokaciji
pošiljatelja poruke. Korisnici bi mali mogućnost u postavkama aplikacije uključiti ili
isključiti ovu opciju. Ako je opcija uključena, uz svaku poslanu poruku primatelju bi se
prikazivala i lokacija uređaja sa kojeg je poruka poslana. Navedeno je moguće ostvariti
upotrebom Google-ovog Location Services API-ja.
3.2. Konfiguracija poslužitelja Openfire
Ovo poglavlje nudi opis konfiguracije poslužitelja Openfire za potrebe razvijene
aplikacije. Upute za instalaciju poslužitelja moguće je pronaći u privitku.
3.2.1. Konfiguracija postavki poslužitelja
Potrebno je podesiti nekoliko postavki poslužitelja čije predefinirane postavke neće
odgovarati potrebama razvijene aplikacije. Konfiguracija postavki odvija se iz
administratorske konzole odabirom izbornika Server/Server Settings.
Prema početno zadanim postavkama poslužitelj će raskinuti vezu sa klijentima koji
nisu bili aktivni duže od 360 sekundi. Za potrebe razvijene aplikacije ne želimo da se veza
ikada raskida jer korisnik u svakom trenutku treba biti obaviješten o pristiglim porukama.
Navedeno je moguće promijeniti odabirom izbornika Client Connections unutar kojeg je
potrebno odabrati opciju Do not disconnect clients that are idle.
Potrebno je zadati na koji način poslužitelj rukuje porukama koje su poslane
korisniku koji u tom trenutku nije prijavljen. Za potrebe aplikacije, želimo da poslužitelj
30
sprema takve poruke te ih isporučuje korisniku nakon što se prijavi. Da bismo ostvarili
navedeno, potrebno je odabrati opciju Store iz izbornika Offline Messages.
3.2.2. Dodavanje novih korisnika
Dodavanje novih korisnika u sustav odvija se preko administratorske konzole
poslužitelja Openfire. Potrebno se prijaviti u administratorsku konzolu. Odabirom kartice
User/Groups otvara se novi izbornik iz kojeg je potrebno odabrati Create New User.
Nakon popunjavanja osobnih podataka novog korisnika te zadavanja korisničkog imena,
lozinke i razine ovlasti, klikom na gumb Create User novi će korisnik biti dodan u sustav.
3.2.3. Dodavanje kontakata
Nakon kreiranja novog korisnika, potrebno mu je dodijeliti kontakte odnosno grupu
korisnika (roster) sa kojima može komunicirati. Navedeno se odvija odabirom izbornika
korisničke opcije (user properties) unutar koje je potrebno odabrati opciju Roster.
Odabirom Add new Item moguće je dodati bilo kojeg korisnika u grupu kontakata upisom
njegove jedinstvene adrese. Također, moguće je zadati korisnikov nadimak (nickname)
koji će se prikazivati umjesto korisnikovog imena i prezimena.
3.2.4. Pretplata korisnika na informacije o prisutnosti
Prema pretpostavljenim postavkama korisnici neće biti pretplaćeni na dohvat
informacija o prisutnosti. Kako bi se korisnicima omogućio prikaz prisutnosti, potrebno je
uredi postavke pretplate (subscription) tako da oba korisnika mogu vidjeti međusobne
informacije o prisutnosti. Za odabranog korisnika potrebno je otvoriti njegovu listu
kontakata kao što je opisano u prethodnom poglavlju. Prikazuje se tablica koja sadrži
popisa kontakata. Jedan od stupaca tablice je stupac pretplata koji prikazuje informaciju o
trenutnoj pretplati korisnika. Pretplata može poprimiti jednu od 5 vrijednosti: None, To,
From, Both, Remove. Ovisno o postavljenoj vrijednosti, korisnici neće biti pretplaćeni na
informacije o prisutnosti, samo jedan od korisnika će biti pretplaćen, ili će biti pretplaćena
oba korisnika. Za potrebe razvijene aplikacije, potrebno je za sve korisnike opciju pretplate
postaviti na Both.
31
Zaključak
Zadatak ovog rada bio je oblikovati i programski izvesti aplikaciju za trenutno poručivanje
na uređajima s operacijskim sustavom Android. Razvijena aplikacija trebala se temeljiti na
protokolu XMPP. Nadalje, bilo je potrebno istražiti poslužitelje otvorenog koda za
trenutno poručivanje protokolom XMPP te instalirati i podesiti jedan takav poslužitelj.
Praktični dio rada uspješno je ostvaren i omogućena je sva funkcionalnost koju je zadatak
zahtijevao.
Rad na ovoj aplikaciji bio je zanimljiv, ali isto tako i vrlo zahtjevan. Razvoj operacijskog
sustava Android praćen je razvojem podrške od strane programerske zajednice koja nudi
velik broj primjera zbog čega je razvoj aplikacije tekao glatko i problemi su se brzo
rješavali. S druge pak strane, najviše problema pojavljivalo se zbog nešto slabije podrške
za protokol XMPP u Androidu.
Moguće buduće dorade aplikacije mogle bi uključivati proširenje usluge razmjene poruka
mogućnošću kreiranja grupnih razgovora te prikaz informacije o lokaciji pošiljatelja
poruke.
32
Literatura
[1] WHAT WOULD IT TAKE TO BUILD A BETTER MOBILE PHONE?, Open Handset Alliance,
www.openhandsetalliance.com/index.html, 16.03.2014.
[2] CREATE, READ, UPDATE AND DELETE, Wikipedia,
http://en.wikipedia.org/wiki/Create,_read,_update_and_delete, 16.03.2014.
[3] TOASTS, Android Developers,
https://developer.android.com/guide/topics/ui/notifiers/toasts.html, 18.03.2014.
[4] ASMACK, Github aSmack, https://github.com/Flowdalic/asmack, 20.03.2014.
[5] SMACK, Smack Documentation,
http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html,
20.03.2014.
[6] SMACK, Javadoc, http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/,
21.03.2014.
33
Sažetak
U ovom radu izrađena je aplikacija za trenutno poručivanje na uređajima s operacijskim
sustavom Android. Aplikacija korisnicima omogućava razmjenu kratkih tekstualnih
poruka, informacija o prisutnosti te razmjenu datoteka. Razvijena aplikacija temelji se na
protokolu XMPP (Extensible Messaging and Presence Protocol). U sklopu ovog rada
također je instaliran i podešen XMPP poslužitelj. Razvijena aplikacija spaja se na
poslužitelj sa kojeg dohvaća podatke o korisnicima. Razmjena poruka, informacija o
prisutnosti i datoteka odvija se posredstvom poslužitelja. Aplikacija je ispitana u radu s
instaliranim poslužiteljem.
34
Summary
The result of this work is Android Application for Instant Messaging. The application
allows users to exchange short text messages, presence information and files. The
developed application is based on XMPP protocol (Extensible Messaging and Presence
Protocol). Part of this work was also to install and configure XMPP server. The developed
application connects to the server from which it retrieves information about users. The
exchange of instant messages, presence information and files takes place through the
server. The application has been tested to work with the installed server.
35
Skraćenice
XMPP Extensible Messaging and Presence
Protocol
proširivi protokol za trenutno
poručivanje i evidenciju
prisutnosti
SDK Software Development Kit alat za izradu softvera
AVD Android Virtual Device Android virtualni uređaj
API Application Programming Interface sučelje za programiranje
aplikacija
XML Extensible Markup Language proširivi jezik za označavanje
WYSIWYG What You See Is What You Get grafički alat za izradu softvera
SQL Structured Query Language strukturirani jezik za postavljanje
upita
IM Instant Messaging trenutno poručivanje
IDE Integrated Development Environment integrirano razvojno okruženje
DNS Domain Name System sustav domenskih imena
TCP Transmission Control Protocol transmisijski kontrolni protokol
36
Ključni pojmovi
Operacijski sustav Android, aplikacija za Android, arhitektura operacijskog sustava
Android, Dalvik virtualni stroj, aktivnost, životni ciklus aktivnosti, usluga, namjera,
pružatelji sadržaja, primatelji objava, SQLite baza podataka, datoteka manifesta,
korisničko sučelje, Java, protokol XMPP, XMPP strofa, klijent-poslužitelj arhitektura,
adresiranje, Openfire, Jabber, JabberID, trenutno poručivanje, prisutnost, prijenos datoteka,
ispravljanje pogrešaka, Eclipse, aSmack.
37
Key terms
Android Operating System, Android Application, Android architecture, Dalvik virtual
machine, activity, activity lifecycle, service, intent, broadcast receiver, content providers,
SQLite database, manifest file, user interface, Java, XMPP protocol, XMPP stanzas, client-
server architecture, addressing, Openfire, Jabber, JabberID, instant messaging, presence,
file transfer, debugging, Eclipse, aSmack.
38
Privitak A
Instalacija razvojne okoline Eclipse i Android SDK paketa
Potrebno je preuzeti Androidov paket razvojnih alata (eng. Android Developer Tools
Bundle, skraćeno ADT Bundle). Paket je moguće preuzeti s adrese
http://developer.android.com/sdk/index.html. ADT Bundle uključuje sve što je potrebno za
razvoj Android aplikacija: Eclipse razvojno okruženje, ADT plugin za Eclipse, Android
SDK, najnoviju verziju Android platforme te najnoviju verziju Android virtualnog uređaja.
Paket je potrebno raspakirati na željenu lokaciju. Instalacija dodatnih verzija Androida i
drugih paketa odvija se kroz alat SDK Manager kojem je moguće pristupiti iz Eclipse-a.
Uvoz već postojećeg projekta u Eclipse odvija se odabirom File->Import. Otvara se novi
dijalog iz kojeg je potrebno odabrati General->Existing Projects into Workspace. Potrebno
je locirati direktorij na disku koji sadrži projekt te klikom na Finish projekt će biti uvezen u
Eclipse.
Eclipse omogućava pokretanje aplikacije kako na virtualnom tako i na fizičkom uređaju.
Za pokretanje aplikacije na virtualnom uređaju potrebno je najprije izraditi novi Android
virtualni uređaj što se odvija kroz alat AVD Manager dostupan također iz Eclipse-a. Za
pokretanje aplikacije na stvarnom uređaju potrebno je instalirati dodatni paket Google
USB driver koristeći SDK Manager. Nakon toga uređaj je potrebno spojiti na računalo
USB kablom te u postavkama uređaja omogućiti otklanjanje grešaka preko USB-a (eng.
USB debugging).
39
Privitak B
Instalacija poslužitelja Openfire
Openfire je poslužitelj otvorenog koda za trenutno poručivanje protokolom XMPP.
Sljedeće upute namijenjene su instalaciji poslužitelja Openfire na operacijskom sustavu
Windows. Više informacija kao i upute za instalaciju na drugim platformama moguće je
pronaći na adresi www.igniterealtime.org/projects/openfire/documentation.jsp.
Za instalaciju poslužitelja potrebno je preuzeti izvršnu openfire_3_9_1.exe datoteku sa
adrese http://www.igniterealtime.org/downloads/index.jsp#openfire te pokrenuti
instalaciju. Potrebno je odabrati instalacijski direktorij. Nakon uspješne instalacije
poslužitelj je moguće pokrenuti pokretanjem openfire.exe izvršne datoteke koja se nalazi u
bin/ direktoriju. Otvara se novi prozor u kojem je potrebno odabrati Launch Admin čime se
otvara Openfire administratorska konzola u Web pregledniku te omogućava dovršetak
postupka instalacije.
Daljnje podešavanje poslužitelja odvija se kroz administratorsku konzolu kojoj je moguće
pristupiti iz Web preglednika. Pretpostavljeni port za administratorsku konzolu je 9090.
Ako poslužitelju pristupamo sa istog računala na kojem je poslužitelj pokrenut, konzoli je
moguće pristupiti na adresi http://127.0.0.1:9090. Korištenjem administratorske konzole
moguće je dodavati nove korisnike, stvarati grupe korisnika, grupne razgovore, podešavati
postavke poslužitelja itd.
Openfire također omogućava instalaciju dodatnih komponenata (eng. plugins) kako bi
unaprijedili poslužitelj. Podatke je moguće spremati u ugrađenu (eng. embedded) HSQLDB
bazu podataka ili je moguće koristiti vanjsku bazu podataka. Ukoliko se želi koristiti
vanjska baza podataka, potrebno ju je pripremiti prije instalacije samog poslužitelja.
Opefire podržava povezivanje sa MySQL, Postgres, Microsoft SQL Server i HSQLDB
bazama podataka.