3. aplikacija za trenutno poručivanje

43
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.

Upload: habao

Post on 23-Dec-2016

227 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 3. Aplikacija za trenutno poručivanje

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.

Page 2: 3. Aplikacija za trenutno poručivanje
Page 3: 3. Aplikacija za trenutno poručivanje
Page 4: 3. Aplikacija za trenutno poručivanje

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

Page 5: 3. Aplikacija za trenutno poručivanje

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.

Page 6: 3. 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.

Page 7: 3. Aplikacija za trenutno poručivanje

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.

Page 8: 3. Aplikacija za trenutno poručivanje

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

Page 9: 3. Aplikacija za trenutno poručivanje

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.

Page 10: 3. Aplikacija za trenutno poručivanje

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).

Page 11: 3. Aplikacija za trenutno poručivanje

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.

Page 12: 3. Aplikacija za trenutno poručivanje

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

Page 13: 3. Aplikacija za trenutno poručivanje

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

Page 14: 3. Aplikacija za trenutno poručivanje

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.

Page 15: 3. Aplikacija za trenutno poručivanje

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

Page 16: 3. Aplikacija za trenutno poručivanje

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

Page 17: 3. Aplikacija za trenutno poručivanje

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

Page 18: 3. Aplikacija za trenutno poručivanje

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.

Page 19: 3. Aplikacija za trenutno poručivanje

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.

Page 20: 3. Aplikacija za trenutno poručivanje

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.

Page 21: 3. Aplikacija za trenutno poručivanje

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

Page 22: 3. Aplikacija za trenutno poručivanje

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

Page 23: 3. Aplikacija za trenutno poručivanje

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

Page 24: 3. Aplikacija za trenutno poručivanje

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.

Page 25: 3. Aplikacija za trenutno poručivanje

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

Page 26: 3. Aplikacija za trenutno poručivanje

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.

Page 27: 3. Aplikacija za trenutno poručivanje

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

Page 28: 3. Aplikacija za trenutno poručivanje

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.

Page 29: 3. Aplikacija za trenutno poručivanje

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.

Page 30: 3. Aplikacija za trenutno poručivanje

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

Page 31: 3. Aplikacija za trenutno poručivanje

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

Page 32: 3. Aplikacija za trenutno poručivanje

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

Page 33: 3. Aplikacija za trenutno poručivanje

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

Page 34: 3. Aplikacija za trenutno poručivanje

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.

Page 35: 3. Aplikacija za trenutno poručivanje

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.

Page 36: 3. Aplikacija za trenutno poručivanje

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.

Page 37: 3. Aplikacija za trenutno poručivanje

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.

Page 38: 3. Aplikacija za trenutno poručivanje

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.

Page 39: 3. Aplikacija za trenutno poručivanje

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

Page 40: 3. Aplikacija za trenutno poručivanje

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.

Page 41: 3. Aplikacija za trenutno poručivanje

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.

Page 42: 3. Aplikacija za trenutno poručivanje

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).

Page 43: 3. Aplikacija za trenutno poručivanje

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.