aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

43
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA ZAVRŠNI RAD br. 4089 APLIKACIJA ZA BRZO DOGOVARANJE SASTANAKA PAMETNIM TELEFONIMA S OPERACIJSKIM SUSTAVOM ANDROID Filip Popić Zagreb, lipanj 2015.

Upload: buidien

Post on 21-Dec-2016

232 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

SVEUČILIŠTE U ZAGREBU

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

ZAVRŠNI RAD br. 4089

APLIKACIJA ZA BRZO DOGOVARANJE

SASTANAKA PAMETNIM TELEFONIMA S

OPERACIJSKIM SUSTAVOM ANDROID

Filip Popić

Zagreb, lipanj 2015.

Page 2: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s
Page 3: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s
Page 4: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

Sadržaj

Uvod ...................................................................................................................................... 1

1. Operacijski sustav Android ........................................................................................... 2

1.1. Osnove i razvoj operacijskog sustava Android ..................................................... 2

1.2. Arhitektura operacijskog sustava Android ............................................................ 3

1.3. Struktura Android aplikacija ................................................................................. 6

1.3.1. Aktivnosti ...................................................................................................... 6

1.3.2. Usluge ............................................................................................................ 8

1.3.3. Primatelji namjera.......................................................................................... 9

1.3.4. Pružatelji sadržaja ........................................................................................ 10

1.3.5. Namjere ....................................................................................................... 10

1.4. Korisničko sučelje Android aplikacija ................................................................ 10

2. Vanjska komponenta za razmjenu poruka i informacija o prisutnosti ........................ 13

2.1. Osnove protokola XMPP ..................................................................................... 13

2.2. Opis javnog sučelja vanjske komponente ............................................................ 16

2.3. Ugradnja vanjske komponente ............................................................................ 17

3. Aplikacija za brzo dogovaranje sastanaka ................................................................... 19

3.1. Programsko ostvarenje ........................................................................................ 19

3.2. Podržane funkcionalnosti aplikacije .................................................................... 27

3.3. Testiranje aplikacije ............................................................................................. 30

Zaključak ............................................................................................................................. 32

Literatura ............................................................................................................................. 33

Sažetak ................................................................................................................................. 34

Summary .............................................................................................................................. 35

Skraćenice ............................................................................................................................ 36

Ključni pojmovi ................................................................................................................... 37

Page 5: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

Key terms ............................................................................................................................. 38

Page 6: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

1

Uvod

Brzo dogovaranje sastanaka svodi se na kratku i jednostavnu komunikaciju između više

uključenih strana, koje u što kraćem vremenu žele organizirati zajednički sastanak, na

određenom mjestu u dogovoreno vrijeme. Za uspješno dogovaranje sastanaka između

različitih strana, potrebno je prilagoditi slanje i primanje zahtjeva te povrat odgovora o

nekom prijedlogu za sastanak. Komunikacija preko pokretnih uređaja sve više se nameće

kao prigodno sredstvo za ostvarivanje navedenih zahtjeva, koja zbog svoje jednostavne

strukture omogućuje prijenos sažetih, ali ipak potpunih informacija.

Rad se bavi istraživanjem postojećih rješenja temeljenih na protokolu XMPP i praktičnom

izradom aplikacije za pokretne uređaje s operacijskim sustavom Android. Povezivanje s

poslužiteljem i ostvarivanje cjelokupne komunikacije ostvaruje se preko vanjske

komponente koja omogućuje neovisnu implementaciju te pruža sve potrebne usluge za

ostvarivanje komunikacije na spomenutom protokolu.

U prvom poglavlju opisuje se operacijski sustav Android, nakon čega slijedi opis protokola

XMPP te pregled i način ugradnje vanjske komponente. Posljednje poglavlje opisuje

oblikovanje i izradu programskog rješenja te pruža uvid u ostvarene funkcionalnosti

aplikacije.

Page 7: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

2

1. Operacijski sustav Android

U ovom poglavlju opisan je nastanak i razvoj operacijskog sustava Android. Popraćen je

vremenski razvoj operacijskog sustava Android s pregledom najvažnijih trenutaka i značajki

koje su utjecale na daljnji razvoj i smjer operacijskog sustava. Nakon početnog dijela

prikazuje se arhitektura operacijskog sustava Android. Zatim slijedi opis strukture Android

aplikacije sa svojim komponentama i korisničkim sučeljem koje je opisano u posljednjem

dijelu poglavlja.

1.1. Osnove i razvoj operacijskog sustava Android

Android je platforma bazirana na otvorenom kodu, namijenjena različitim kategorijama

uređaja, koju najčešće čine pokretni uređaji (mobiteli, tableti, pametni satovi). Najvažniji

pojmovi koji se vežu uz Android su otvorenost i neovisnost, zbog kojih se značajno

promijenio odnos između proizvođača sklopovlja uređaja i proizvođača programske potpore,

koji su dosada najčešće bili unutar iste kompanije, a često i jedini razvijatelji aplikacija za

svoje uređaje. Tvrtka Google, Inc. je 2005. godine kupila tvrtku Android, Inc., a kako bi se

sačuvala ideja o otvorenosti dvije godine nakon preuzimanja, tvrtka službeno objavljuje

cijeli projekt temeljen na otvorenom kodu uz osnivanje neovisnog konzorcija Open Handset

Alliance, sastavljenog od najvećih svjetskih kompanija sa osnovnom idejom daljnjeg razvoja

otvorenih tehnologija na području pokretnih uređaja. Članice su se obvezale na korištenje

operacijskog sustava Android što je omogućilo veću rasprostranjenost platforme na

uređajima različitih arhitektura i sklopovlja. Prekretnica za razvoj aplikacija predstavlja

2008. godina, odnosno izdavanje programskog paketa za izradu aplikacija Android SDK

(Software Development kit), zajedno sa svim potrebnim alatima koji omogućuju izradu,

pokretanje i testiranje aplikacija na računalu bez potrebe prisustva stvarnog uređaja. Android

u međuvremenu izdaje nove verzije operacijskog sustava kodnih imena Cupcake, Donut,

Eclair, koje se i dalje izvode na relativno ograničenom broju uređaja. Ubrzani porast broja

korisnika i podržanih uređaja Android postiže konstantnim izdavanjem novijih verzija

operacijskog sustava koje donose brojna poboljšanja i novitete, uključujući i razvoj

korisničkog sučelja kojemu se sve više pridodaje na važnosti. Izdavanjem verzije KitKat

2013. godine, Android je dostigao broj od milijardu uspješnih aktivacija operacijskog

sustava, čime je izašao izvan svih dosadašnjih okvira cjelokupne industrije.[1] Trenutno

Page 8: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

3

najnovija verzija sustava je Lollipop, koja je svojim novim korisničkim sučeljem,

izgrađenom na osnovama materijalnog dizajna (material design), uvela sasvim novi pristup

pri oblikovanju i dizajniranju korisničkih sučelja, kojega su prihvatile i ostale tehnologije

poput Weba.

1.2. Arhitektura operacijskog sustava Android

Arhitektura operacijskog sustava Android podijeljena je na slojeve kao što je prikazano na

slici Slika 1.1.:

Aplikacijski sloj

Sloj aplikacijskog okvira (application framework)

Programske knjižnice

Radno okruženje Android (Android runtime)

Linux jezgra (Linux kernel)

Page 9: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

4

Slika 1.1 Arhitektura operacijskog sustava Android

Linux jezgra

Najniži sloj operacijskog sustava Android čini Linuxova jezgra 2.6 koja se pokazala

primjerenim odabirom, ponajprije zbog svoje prenosivosti i sigurnosti, ali i konstantnog

razvoja koji osigurava daljnji napredak cijelog sustava. Linuxova jezgra pomoću svojih

upravljačkih mehanizama omogućuje zaštićeno izvođenje naredbi unutar kontroliranih

procesa što znatno doprinosi sigurnosti i robusnosti cijelog operacijskog sustava.

Radno okruženje Android

Radno okruženje Android sastoji se od virtualnog stroja Dalvik (Dalvik Virtual Machine,

DVM) i jezgrenih programskih knjižnica (core libraries).

Dalvik je virtualni stroj izgrađen na temelju virtualnog stroja za Javu (Java Virtual Machine,

JVM), ali je svojim dizajnom prilagođen za pokretne uređaje kako bi se omogućila

učinkovita raspodjela i iskorištavanje ograničenih resursa sustava, poput radne memorije,

trajanja baterije i procesorske snage. Prevođenje izvorne datoteke napisane u Javi (Java

Page 10: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

5

source file, .java) započinje prevođenjem u međukod za Javu (Java bytecode, .class),

koristeći Javin prevoditelj. Zatim slijedi novo prevođenje dobivene datoteke u međukod

virtualnog stroja Dalvik (Dalvik bytecode, .dex), koristeći alat dx koji je sadržan u

programskom paketu Android SDK (Software development Kit). Dobivenu izvršnu datoteku

moguće je izvoditi na krajnjem uređaju pri čemu se svaka aplikacija zasebno izvodi u svojoj

instanci virtualnog stroja Dalvik.[2] Pored uobičajenog pisanja aplikacija u programskom

jeziku Java, moguće je programirati u većini jezika koji se mogu odgovarajućim

prevoditeljima prevesti u međukod za Javu, Primjeri takvih programskih jezika su Scala,

Groovy ili Kotlin, koji pojednostavljenom sintaksom i proširenim mogućnostima polagano

privlače sve veći udio programera.

Jezgrene programske knjižnice sastavljene su od pripremljenih razreda koji služe za

učinkovito obavljanje uobičajenih zadataka iscrtavanja sučelja i manipulacije različitim

strukturama podataka. Android je naslijedio većinu jezgrenih knjižnica programskog jezika

Java (Java Standard Edition, JavaSE), uz važniju iznimku jezgrenih programskih knjižnica

namijenjenih za prikaz korisničkog sučelja, koje su posebno izgrađene za operacijski sustav

Android.

Programske knjižnice

Skup programskih knjižnica za Android čine pouzdane i učestalo korištene programske

knjižnice za specifične namjene. Preuzete su iz različitih izvora i udruženja, koja javno

objavljuju postignuta rješenja na principima otvorenog koda. Većina ih je napisana u

jezicima C i C++ koji se jednostavno prevode u druge jezike, a osnovna namjena je pružanje

specifičnih usluga ostalim dijelovima sustava na višim slojevima. Primjeri korištenih

programskih knjižnica su SQLite koji implementira pristup i samu bazu podataka te Op koji

omogućuje prikazivanje različitih grafičkih struktura.

Sloj aplikacijskog okvira

Sloj aplikacijskog okvira sastoji se od brojnih komponenti upravitelja usluga i pružatelja

sadržaja. Osnovna zadaća sloja je omogućiti jednostavan pristup različitim dijelovima

sklopovlja uređaja, koje neprestano ili periodički preko različitih izvora (senzori, mrežni

podaci) prikuplja podatke koji se mogu u aplikaciji iskoristiti. Za razvijatelje aplikacija, sloj

aplikacijskog okvira od presudne je važnosti, jer osim osnovnih mobilnih usluga

telefoniranja i slanja tekstualnih poruka, omogućuje razvoj aplikacija za „pametne“ uređaje

(smartphone) u njihovom pravom smislu. Primjer takvih usluga su usluge objavljivanja

Page 11: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

6

obavijesti, praćenje stanja mreže, korištenje fotoaparata ili pristup podacima iz imenika, kao

i mnoge druge.

Aplikacijski sloj

Svaki uređaj baziran na operacijskom sustavu Android uobičajeno dolazi s unaprijed

instaliranim aplikacijama koje pružaju osnovne usluge za korisnike. Primjer takvih

aplikacija su kalkulator, kamera, klijent elektroničke pošte i druge. Osim unaprijed

instaliranih aplikacija u aplikacijski sloj pripadaju i sve ostale aplikacije preuzete s različitih

izvora (Google Play, Amazon Appstore) poput brojnih igrica (AngryBirds, DoodleJump) ili

aplikacija za brzo poručivanje (WhatsApp, Facebook Messenger) i ostalih.

1.3. Struktura Android aplikacija

Svaka Android aplikacija može se podijeliti na određeni broj međusobno neovisnih

komponenti, koje po potrebi mogu komunicirati međusobno ili s ostalim komponentama

drugih aplikacija. Postoje četiri osnovne kategorije komponenti koje se osim po namjeni

razlikuju i po vlastitom životnom ciklusu:

Aktivnost (activitiy)

Usluga (service)

Pružatelj sadržaja (content provider)

Primatelj namjera (broadcast receiver)

1.3.1. Aktivnosti

Aktivnosti su komponente aplikacije koje su u izravnoj vezi s korisnikom i ostatkom sustava,

a predstavljaju prikaz određenog prozora zaslona kojeg korisnik vidi. Za primjer jedne

aktivnosti može poslužiti aplikacija Kontakti (Contacts) sa svojom središnjom aktivnosti s

pregledom pojedinačnih zapisa iz imenika unutar zajedničke grupe elemenata prikaza (view

group). Svaka aplikacija sadrži jednu središnju aktivnost koja se korisniku otvara pri prvom

pokretanju aplikacije. Aktivnosti se mogu međusobno pozivati izražavajući svoju namjeru

sustavu (intent), ali se na zaslonu u svakom trenutku može nalaziti najviše jedna aktivnost,

o čemu se na razini operacijskog sustava brine upravitelj aktivnosti (activity manager).

Redoslijed stanja kroz koje aktivnost prolazi prikazan je na slici Slika 1.2, pri čemu se na

Page 12: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

7

prijelazima između stanja nalaze odgovarajuće metode koje poziva sustav, a implementiraju

ih programeri koji definiraju ponašanje komponente prije ulaska u sljedeće stanje.

Slika 1.2 Životni ciklus aktivnosti

Životni ciklus aktivnosti započinje pozivom metode onCreate() koja se automatski

poziva ukoliko se radi o početnoj aktivnosti aplikacije ili je rezultat izražene namjere

prethodne aktivnosti koja je proizišla iz interakcije s korisnikom. Pozivom metode izgrađuje

se nova instanca aktivnosti u memoriji, obilazi i gradi cijelo stablo elemenata prikaza (View)

korisničkog sučelja (definirano u XML datoteci), što predstavlja jednu od najzahtjevnijih

operacija, čije se ponovno izvođenje nastoji u što većoj mjeri izbjeći poznatim mehanizmima

pozadinskog stoga na kojemu se privremeno spremaju zaustavljene aktivnosti, koje se u

slučaju ponovnog pokretanja dohvate s stoga. Nakon izvršavanja metode

onCreate()sustav prelazi u stanje izgradnje u kojemu se kratko zadržava te slijedno

pozivima metoda onStart() i onResume() prelazi u stanje pokretanja, odnosno u

stanje prikazivanja u kojima je aktivnost vidljiva korisniku. U metodama se najčešće

registriraju ili obnavljaju pretplate primatelja namjera i postavljaju brojne komponente, što

dolazi do izražaja pri ponovnom pokretanju aktivnosti sa stoga. U stanju prikazivanja

aktivnost je vidljiva i u interakciji s korisnikom sve dok korisnik ne odluči izvesti određenu

Page 13: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

8

akciju ili se prikazivanje aktivnosti privremeno zaustavi zbog dolaznog poziva ili slične

izvanredne namjere. U tom slučaju operacijski sustav pozivom metode onPause()

privremeno prebacuje aktivnost u stanje pauziranja pri čemu je interakcija s korisnikom

prekinuta, iako je aktivnost djelomično vidljiva na zaslonu. Najčešće se unutar metode

onPause() odjavljuju pretplate za zauzete komponente kako bi ih ostale aktivnosti mogle

koristiti. Ovisno o prethodno izraženoj namjeri, aktivnost se iz stanja pauziranja, ponovnim

pozivom metode onResume(), može vratiti u stanje prikazivanja ili pozivom metode

onStop() ukloniti sa zaslona te pohraniti u memoriju u slučaju ponovnog pokretanja, što

je i dalje isplativije od započinjanja novog ciklusa i pozivanja metode onCreate().

Pozivom onDestroy() dolazi do brisanja aktivnosti iz memorije te se oslobađaju svi

zauzeti resursi. Ukoliko se pri radu, aktivnost koristi pozadinskim dretvama potrebno je

eksplicitno zaustaviti izvođenje i osloboditi zauzete resurse, kako bi se izbjeglo curenje

memorije (memory leak).

1.3.2. Usluge

Usluge su neovisne komponente koje mogu izvršavati uobičajene postupke, ali i zahtjevnije

zadatke. Najčešće se koriste za dugoročne ili periodičke poslove koji se obavljaju u pozadini,

bez interakcije s korisnikom. Zbog izostanka interakcije ne pružaju korisničko sučelje po

čemu se razlikuju od aktivnosti. Usluge svoje poslove obavljaju zajedno s aktivnostima u

dretvi korisničkog sučelja (user interface thread) koja ne trpi vremenski zahtjevnije

izvođenje, zbog čega je potrebno usluzi pridijeliti vlastitu pozadinsku dretvu u slučaju

obavljanja zahtjevnijih poslova, kako se ne bi ugrozila interakcija korisnika s ostatkom

aplikacije. Usluge za razliku od aktivnosti imaju nešto jednostavniji životni ciklus, ali je

potreban veći oprez pri modeliranju. Usluge zbog svoje neovisnosti mogu ostati uključene

prestankom izvođenja aplikacije. Pokretanje, kontroliranje i zaustavljanje usluga obavlja se

pozivima iz aktivnosti, primatelja objava ili drugih usluga.

Dva su osnovna račina rada usluga koji se po potrebi mogu kombinirati: pokrenuta usluga i

povezana usluga. Pokrenuta usluga pokreće se pozivom metode startService() iz

druge komponente, na neodređeno vrijeme, a najčešće obavlja jedan posao (npr. dohvaćanje

datoteke s Interneta) i ne vraća nikakav rezultat aplikaciji pokretaču. Povezana usluga

povezuje se s drugom komponentom pozivom metode bindService(). Ovakva usluga

komunicira sa svojim pokretačem prihvaćajući podatke i prosljeđujući odgovore. Više

Page 14: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

9

komponenti se može povezati s jednom uslugom, a prestaje se izvoditi kada više nijedna

komponenta nije povezana na uslugu.[3]

Nasljeđivanjem osnovnog razreda Service.java ostvaren je razred

IntentService.java u kojemu je definiran specifičan tip usluge namijenjene za

slijednu obradu namjera, koja automatski obrađuje pristigle namjere u vlastitoj dretvi, za

razliku od obične usluge. Primjer takve usluge bi bila usluga za objavljivanje obavijesti koja

nakon uspješne obrade dolazne namjere i prikazivanja obavijesti prekida s radom.

1.3.3. Primatelji namjera

Primatelji namjera su komponente zadužene za primanje objavljenih namjera koje je u sustav

razaslala određena komponenta. Mnoge objave potječu iz samog operacijskog sustava

pomoću kojih se obavještavaju različite aplikacije o brojnim asinkronim događajima poput

gašenja zaslona, promjenama na mreži, uspješnog fotografiranja i ostalih. Primatelji namjera

zamišljeni su kao jednostavne komponente koje najčešće služe kao pristupna postaja drugoj

komponenti, pa se izvođenje vrlo rijetko značajnije zadržava unutar osnovne asinkrone

metode onReceive(), koja se poziva pri primanju namjere. Svaki primatelj namjera

preko filtra namjera (intent filter) registrira pretplatu na određenu akciju, odnosno namjeru,

što se najčešće obavlja unutar metode onResume() za vrijeme životnog ciklusa aktivnosti.

Otkazivanje pretplate obavlja se unutar metode onPause()zbog nemogućnosti interakcije

aktivnosti s korisnikom pri čemu nije potrebno hvatati namjere koje se ionako neće moći

prikazati korisniku. Pretplate se mogu registrirati na razini komponenti (unutar datoteke

AndroidManifest.xml) ukoliko primatelji namjera trebaju biti stalno aktivni neovisno

o trenutnom stanju aplikacije.[4]

Proširenjem osnovnog razreda BroadcastReceiver.java ostvaren je razred

WakefulBroadcastReceiver.java koji je namijenjen za isporuku i pozivanje

usluga za obradu osjetljivih namjera ili transakcija poput objavljivanja obavijesti,

osiguravajući budnost sustava dok se namjera ne obradi. Pri završetku rada, usluga dojavi

završetak primatelju, nakon čega se ukloni privremena mjera zabrane gašenja uređaja u

pozadini.

Page 15: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

10

1.3.4. Pružatelji sadržaja

Pružatelji sadržaja su komponente, odnosno mehanizam koji upravlja pristupom različitih

podatkovnih struktura koje se trajno pohranjuju na uređaju. Ostale komponente uz pomoć

pružatelja sadržaja mogu pristupati osjetljivim ili zaštićenim podacima ako su prethodno

dobili dopuštenje operacijskog sustava, odnosno korisnika kao vlasnika.[5] Podacima se

pristupa pomoću uniformnog identifikatora resursa (Uniform Resource Identifier, URI) koji

jednoznačno određuje željeni resurs.

1.3.5. Namjere

Namjere su osnovni objekti namijenjeni za komunikaciju preko kojih različite komponente

mogu zatražiti određenu akciju od drugih komponenti. Namjere se razlikuju po načinu

određivanja primatelja namjere, koji mogu biti neodređeni ili eksplicitno zadani u samoj

strukturi objekta. Ukoliko primatelj nije naznačen, pretplaćene komponente sposobne za

obradu određene namjere sudjeluju u izvlačenju, kojeg operacijski sustav korisniku preko

odgovarajućeg izbornika ponudi. Objavljivači namjera često koriste mehanizam namjera za

slanje primitivnih podataka različitim komponentama ili aplikacijama koje ih prime preko

pretplaćenih primatelja.

1.4. Korisničko sučelje Android aplikacija

Korisničko sučelje većine Android aplikacija ima važnu ulogu za početno prihvaćanje i

ponovnu uporabu aplikacije. Osnovna svrha sučelja je korisniku u što većoj mjeri

pojednostaviti korištenje aplikacije. Sučelje za Android aplikacije može se izgraditi na dva

načina: deklariranjem elemenata prikaza unutar stablaste hijerarhijske strukture napisane u

jeziku XML (EXtensible Markup Language) i programskim instanciranjem objekata

elemenata prikaza, koji se pri pokretanju (runtime) ugrađuju u strukturu i prikazuju na

zaslonu. Ova dva načina izgradnje korisničkog sučelja međusobno se ne isključuju, već se

preporučuje korištenje oba načina za različite namjene. Deklarativni pristup preporučuje se

za izgradnju statičkog rasporeda elemenata (layout) na zaslonu u kojemu se definira položaj

i svojstva prikaza pojedinih elemenata prikaza. U priloženom isječku XML datoteke

prikazano je deklariranje elementa prikaza gumb (button) s postavljenim svojstvima za

identificiranje unutar rasporeda prikaza, za visinu i širinu kontrole koje su postavljene da se

Page 16: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

11

automatski prilagođavaju sadržaju (wrap content) te tekst koji će biti prikazan korisniku

unutar gumba.

<Button

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Pritisni me!"/>

Programsko postavljanje objekata elemenata prikaza unutar Java datoteka namijenjeno je za

izmjenu stanja, odnosno postavljanje svojstava i definiranje ponašanja objekta, koji može

reagirati na različite događaje u interakciji s korisnikom. Na ovaj način omogućena je

dinamička izgradnja i dodavanje novih kontrola koje za vrijeme početnog prikazivanja nisu

postojale na zaslonu. Postavljanjem slušača događaja (event listener) na prethodno

deklarirani gumb, definira se ponašanje koje u ovom primjeru postavlja tekst kontrole.

Button button = (Button) this.findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

button.setText("Hvala!")

}

});

Ovakva praksa odvajanja svojstava prikaza i definicije ponašanja objekata povećava

čitljivost i doprinosi boljoj organizaciji koda.

Svaki element korisničkog sučelja proširuje osnovni razred View.java u kojemu je

definirano ponašanje objekta i sva potrebna svojstva za prikaz objekta na zaslonu. Najčešće

korišteni elementi prikaza su različita polja za unos (razred EditText.java) i prikaz

teksta (razred TextView.java), gumbi (razred Button.java), kvačice (razred

CheckBox.java), izbornici (razred RadioButton.java) i prekidači (razred

Switch.java). Ukoliko je potrebno prikazati grupu elemenata prikaza, nasljeđuje se

podrazred ViewGroup.java koji definira razmještanje objekata i sadrži ostale elemente

prikaza. Najviše korišteni objekti implementirani su u razredima LinearLayout.java i

RelativeLayout.java koji linearno ili međusobno ovisno razmještaju elemente na

zaslonu. Za prikaz različitih kolekcija podataka potrebno je postaviti odgovarajući

prilagodnik (razred koji implementira sučelje Adapter.java), odnosno postaviti izvor

podataka i način prikazivanja članova što može biti definirano u posebnoj XML datoteci.

Page 17: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

12

Najčešće korištene implementaciju su: padajući izbornici (razred Spinner.java), prikazi

unutar liste (razred ListView.java), mrežni prikaz (razred GridView.java) i ostali.

Na slici Slika 1.3 prikazan je dio aktivnosti u čijem se zaglavlju nalazi statusna traka

operacijskog sustava te akcijska traka s nazivom aktivnosti, a u tijelu sadrži jedan linearni

razmještaj unutar kojega se nalazi ranije spominjani gumb Pritisni me!.

Slika 1.3 Prikaz dijela korisničkog sučelja

Primjer padajućeg izbornika koji je korišten za izradu aplikacije prikazan je na slici 1.4 , a

korisniku nudi izbor vrste sastanka poput Kava, Martinovka, Menza i ostali.

Slika 1.4 Padajući izbornik

Page 18: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

13

2. Vanjska komponenta za razmjenu poruka i

informacija o prisutnosti

U ovom poglavlju opisuje se protokol XMPP, na kojemu se bazira vanjska komponenta, koja

se koristi za razmjenu poruka i informacija o prisutnosti u Android aplikaciji. Zatim slijedi

pregled objavljenog sučelja komponente, nakon čega se opisuje način ugradnje i povezivanja

s ostatkom aplikacije koja je detaljnije opisana u posljednjem poglavlju.

2.1. Osnove protokola XMPP

Protokol XMPP (Extensible Messaging and Presence Protocol, XMPP) je komunikacijski

protokol, koji se koristi za asinkronu razmjenu kratkih poruka u što kraćem vremenu.

Otvoren je i slobodan za sve vrste korištenja. Uz otvorenost, glavne značajke protokola su

proširivost, sigurnost i decentraliziranost. Proširivost se postiže korištenjem jezika XML za

komunikaciju, koji svojom jednostavnom strukturom ostavlja brojne mogućnosti za

dodavanje vlastitih ekstenzija koje obogaćuju osnovnu uslugu. Protokol sadrži snažnu

potporu i mehanizme za šifriranje komunikacijskog kanala i autentifikaciju entiteta čime

zadovoljava potrebne sigurnosne standarde. Zbog svoje decentralizirane arhitekture klijent-

poslužitelj, jednostavno se prilagođava na ispadanje pojedinih dijelova mreže, osiguravajući

veću robusnost sustava. Nastao je iz potrebe za poboljšanjem usluge trenutnog poručivanja

(Instant Messaging, IM) koja se nije mogla učinkovito održavati s postojećim zatvorenim

komercijalnim rješenjima. U svojim začetcima projekt je bio baziran na otvorenom kodu

programerske zajednice Jabber, koji je nakon samo nekoliko godina uz brojne nadogradnje

i formalizaciju prerastao u standardizirani protokol. Ostale usluge koje protokol uređuje su:

prisutnost (presence), održavanje konferencije, grupni razgovori, mehanizam objavi-

pretplati (publish-subscribe), popis kontakata (roster), P2P medijske sjednice (peer-to-

peer), geolokacija i brojne druge.

Arhitektura protokola XMPP

Decentralizirana klijent-poslužitelj arhitektura pokazala se pogodnom za razvoj različitih

mrežnih tehnologija poput Weba i elektroničke pošte, koju je XMPP također prihvatio.

Osnovna prednost decentralizacije leži u razdvajanju odgovornosti između poslužiteljske i

Page 19: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

14

klijentske strane, što omogućuje neovisan razvoj i jednostavnije održavanje programske

potpore. Postupak slanja XMPP poruke započinje spajanjem XMPP klijenta s lokalnim

XMPP poslužiteljem, koji se zatim neposredno spaja na odredišni XMPP poslužitelj te

prosljeđuje poruku na odredište, što je prikazano na slici Slika 2.1. Ovaj način neposredne

komunikacije i povezivanja poslužitelja iz različitih domena karakterističan je za protokol

XMPP te njegovu osnovnu namjenu brzog razašiljanja sadržaja između korisnika.

Slika 2.1 Prikaz slanja XMPP poruke

Adresiranje

Protokol XMPP za jednoznačno određivanje svih entiteta na mreži koristi adrese nazvane

JabberID (skraćeno JID), koje po svojoj strukturi nalikuju e-mail adresama:

korisnickoIme@domena

JID se sastoji od korisničkog imena i domene, razdvojenih znakom @. Pri instalaciji

proizvoljnog XMPP poslužitelja, potrebno je odrediti domenu, koja se preslikavanjem,

koristeći sustav imenovanja domena (Domain Name System, DNS), može pretvoriti u IP

adresu te jednostavno locirati na mreži. Za potrebe komunikacije JID je dovoljan, ali se za

razliku od e-mail adrese može proširiti dodatnim zapisom resursa, koji najčešće opisuje

način pristupa usluzi, odnosno predstavlja identifikator klijentskog uređaja preko kojega je

klijent trenutno spojen na mrežu:

korisnickoIme@domena/resurs

Page 20: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

15

Struktura poruka

Postoje tri osnovna tipa XML poruka koji se nazivaju XMPP strofe: <message/>,

<presence/> i <iq/>. Strofa <message/> je osnovni mehanizam razmjene poruka sa

definiranim atributima koji su prikazani u tablici Tablica 1.

Tablica 1 Struktura strofe <message/>

atribut vrijednost

from JID pošiljatelja

to JID jednog ili više primatelja

type normal, chat, groupchat, headline, error

Pri slanju odlazne poruke, klijent naslovljava primatelja, ali izostavlja atribut from, koji se

ugrađuje na strani lokalnog poslužitelja, radi umanjivanja potencijalnih sigurnosnih prijetnji.

Osim upravljačkih polja, strofa sadrži takozvani korisni teret (payload) definiran unutar

<body/> oznake, čija struktura nije eksplicitno zadana, što daje dodatnu slobodu pri

oblikovanju sustava za različite primjene.

Informacija o prisutnosti (presence) entiteta na mreži i njegovoj dostupnosti za komunikaciju

prenosi se strofom <presence/>. Navedene informacije sadržane se unutar oznaka

<status/> i <show/>. Za razliku od običnih poruka, pristup podacima o prisutnosti

zahtjeva određenu vrstu pregovaranja uključenih strana. Usluga dijeljenja informacija o

prisutnosti ostvaruje se mehanizmom objavi-pretplati, pomoću koje entitet najprije zatraži

pristanak za informacijom drugog entiteta, koji ga može prihvatiti ili odbaciti. U slučaju

pristanka, entitet koji je zatražio informaciju, automatski se pretplaćuje na buduće objave

informacija o prisutnosti drugog entiteta.

Strofa <iq/> koristi se za slanje upita i odgovora slično kao u protokolu HTTP, a najčešće

se koristi za postupke registracije i dohvaćanja liste kontakata (roster), što je prikazano u

sljedećem isječku koda:

<iq from='[email protected]/android'

id='a12bcd3e' type='get'>

<query xmlns='jabber:iq:roster'/>

</iq>

Page 21: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

16

Za razliku od prethodno navedenih strofa <message/> i <presence/>, strofa <iq/>

zahtjeva potvrdu o isporuci ili dojavljenoj pogrešci.

2.2. Opis javnog sučelja vanjske komponente

Za izradu praktičnog dijela ovog rada korištena je vanjska komponenta za razmjenu poruka

i informacija o prisutnosti temeljena na protokolu XMPP. Komponenta je ostvarena u

razredu SmackService.java u kojemu je objavljeno javno sučelje komponente. Metode

javnog sučelja su:

connect() – metoda za povezivanje aplikacije s poslužiteljem

disconnect() – metoda za zatvaranje veze

register() – metoda za registracija korisnika

login() – metoda za prijavu korisnika

isConnected() – metoda za provjeru povezanosti s poslužiteljem

isRegistered() – metoda za provjeru o uspješnosti registracije

isLogged() – metoda za provjeru

sendMessage() – metoda za slanje poruke

sendStatus() – metoda za slanje statusa (informacije o prisutnosti)

sendMode() – metoda za slanje vrste prisutnosti

Uz objavljeno sučelje komponenta omogućuje pozivanje metoda razašiljanjem namjera koje

su definirane sljedećim nepromjenljivim znakovnim nizovima (parametar akcija):

INTENT_REGISTRATION_SUCCESSFUL – dojava o uspješnoj registraciji

INTENT_CONNECTED_SUCCESSFUL – dojava o uspješnom povezivanju

INTENT_LOGIN_SUCCESSFUL – dojava o uspješnoj prijavi

INTENT_UPDATE_ROSTER – dojava o ažuriranoj listi korisnika

INTENT_GET_ROSTER – namjera za dohvaćanje najnovije liste korisnika

INTENT_NEW_MESSAGE – namjera za slanje nove poruke

INTENT_SHOW_NOTIFICATION – namjera za prikazivanje obavijesti

Page 22: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

17

2.3. Ugradnja vanjske komponente

Pri pokretanju aplikacije pokreće se metoda startService() koja pokreće uslugu.

Prilikom pokretanja aktivnosti aplikacija se povezuje s uslugom pozivom metode

bindService(). Instanca razreda ServiceConnection.java pozivom asinkrone

metode onServiceConnected() dojavljuje uspješno povezivanje usluge s aplikacijom

te sprema referencu na uslugu. Na sljedećim slikama prikazano je slanje i primanje poruke

(prijedlog sastanka ili odgovor) koristeći zadužene komponente za specifične namjene, koje

su detaljnije opisane u posljednjem poglavlju.

Slika 2.2 – Sekvencijski dijagram, slanje poruke

Page 23: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

18

Slika 2.3 sekvencijski dijagram, primanje poruke

Page 24: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

19

3. Aplikacija za brzo dogovaranje sastanaka

Praktični dio rada bavi se izradom aplikacije za brzo dogovaranje sastanaka pametnim

telefonima s operacijskim sustavom Android. Osnovna namjena aplikacije je omogućiti

korisniku predlaganje termina za određeni sastanak, na koji može pozvati jednu ili više

osoba. Na temelju proširenih informacija o prisutnosti i lokaciji korisnika, moguće je

predložiti sastanak određenog trajanja. Aplikacija pruža prilagođeni pregled trenutnih

aktivnosti ostalih prisutnih korisnika, kako bi se pojednostavilo predlaganje te spriječilo

nepotrebno ometanje zauzetih korisnika. Aplikacija se brine i o redoslijedu održavanja

sastanaka te sprječava pojavu ugovaranja više istovremenih sastanaka, obavještavajući

korisnika o razlozima nemogućnosti dogovaranja sastanka.

3.1. Programsko ostvarenje

Programska potpora

Android aplikacija napisana je u programskom jeziku Java uz korištenje službenog

razvojnog okruženja Android Studio, verzije 1.2.1.1. Uobičajeno s instalacijom razvojnog

okruženja dolazi i programski paket s alatima za izradu aplikacija Android SDK, trenutne

verzije 24.2. Aplikacija je za vrijeme izgradnje testirana i pokretana na virtualnom uređaju

(Android Virtual Device, AVD) koji pokreće operacijski sustav Android 5.1.1 (Lollipop).

Podržani su svi uređaji koji koriste operacijski sustav Android 4.1 (Jelly Bean) te sve novije

verzije. Iako je projekt izgrađen na trenutno najnovijoj inačici Android platforme, korištene

su pomoćne knjižnice za podršku starijih uređaja (support libraries) koje omogućuje

pokretanje i na starijim uređajima. Za potrebe serijalizacije objekata korištena je programska

knjižnica GSON, koja stvara strukturiranu tekstualnu reprezentaciju objekta. Popis

korištenih knjižnica prikazan je isječku Kod 3.1.

dependencies {

compile 'com.android.support:appcompat-v7:22.1.1'

compile 'com.android.support:recyclerview-v7:22.1.0'

compile 'com.google.code.gson:gson:2.3.1'

}

Kod 3.1 Isječak datoteke build.gradle s popisom korištenih knjižnica

Page 25: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

20

Struktura aplikacije

Aplikacija je podijeljena na komponente, koje se prema svojoj namjeni i uslugama koje

pružaju mogu razdvojiti u različite slojeve, što je prikazano na slici Slika 3.1. Sva

komunikacija s poslužiteljem odvija se preko vanjske komponente koja je opisana u

prethodnom poglavlju.

Slika 3.1 Slojevita struktura aplikacije

Aktivnosti

Aplikacija se sastoji od dvije aktivnosti: RegisterActivity.java i

MainActivity.java koja je u datoteci AndroidManifest.xml definirana kao

početna i središnja aktivnost. Pri početnom pokretanju aplikacije, poziva se metoda

onCreate() u kojoj se prije napuhavanja elemenata korisničkog sučelja, provjeravaju

spremljeni podaci, koristeći razred SharedPreferences.java, vezani za uspješnost

registracije s poslužiteljem. Ukoliko registracija nije obavljena ili je aplikacija ponovno

instalirana, utoliko se pokreće aktivnost RegisterActivity.java koja prikazuje

tekstualna polja za unos podataka (korisničko ime i lozinka) potrebnih za registraciju

Page 26: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

21

korisnika. Na polja unosa postavljena je validacija, koja u slučaju pogrešnog ili nepotpunog

unosa odgađa postupak registracije što je prikazano na slici.

Slika 3.2 Prikaz validacije unosa aktivirane pritiskom na gumb „Registriraj me“

Informaciju o uspješnosti registracije aktivnost doznaje preko registriranog primatelja

namjera (razred BroadcastReceiver.java), koji je pretplaćen na odgovarajući

događaj kojega pravovremeno razašilja vanjska komponenta. Ukoliko je registracija uspjela,

korisnik se automatski prosljeđuje natrag u središnju aktivnost MainActivity.java, pri

čemu se izvođenje aktivnosti nastavlja pozivom metode onStart(), gdje se vrši prijava

korisnika u sustav (login). Istim mehanizmom razašiljanja i primanja namjera pri registraciji,

aktivnost se kroz slijed asinkronih događaja povezuje te prijavljuje u sustav, nakon čega

izražavanjem namjere zatraži osvježenu listu kontakata. Aktivnost prije prikazivanja liste

korisnika, korištenjem anonimnog objekta usporedbe, koje implementira sučelje

Comparator.java, grupira korisnike ovisno o podacima o trenutnoj prisutnosti i vrsti

sastanka na kojemu se trenutno nalaze.

Korisničko sučelje središnje aktivnosti sastoji se od korijenskog linearnog razmještaja

(razred LinearLayout.java) unutar kojega se nalazi reciklirajući element prikaza

(razred RecyclerView.java), koji slično kao i razred ListView.java, služi za

Page 27: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

22

prikazivanje različitih kolekcija objekata. Uz bogatiju manipulaciju nad prikazom,

najvažnija prednost reciklirajućeg prikaza ostvaruje se pri učestalom pomicanju prozora

(scrolling), pri čemu se prikazani članovi označavaju i spremaju u memoriju. Ponovnim

pomicanjem prozora na prethodno prikazanog člana, svi podaci uključujući i razmještaj

elemenata, dohvaćaju se (recikliraju) iz memorije. Postupkom se minimizira učestalost

izvođenja zahtjevne metode napuhavanja prikaza (view inflating), koja je navedena u

sljedećem isječku:

LayoutInflater.from(parent.getContext())

.inflate(R.layout.layout_user_item, parent, false);

Za dohvaćanje i prikazivanje članova kolekcije zadužen je objekt razreda

UsersRecyclerViewAdapter.java koji nasljeđuje i proširuje osnovni razred

RecyclerView.Adapter.java te realizira sučelje OnClickListener.java

zaduženo za osluškivanje događaja potaknutih pritiskom na kontrolu. Struktura i razmještaj

elemenata prikaza pojedinog člana kolekcije definirani su unutar datoteke

layout_user_item.xml, a prikazani izgled na zaslonu vidljiv je na slici Slika 3.3.

Slika 3.3 Izgled korisničkog sučelja za prikaz korisnika

Pri pokretanju središnje aktivnosti, pozivom metode onCreateOptionsMenu()

izgrađuje se aplikacijski izbornik (razred Toolbar.java), koji korisniku daje mogućnost

odabira određenih akcija koje trenutno može obaviti. Pritiskom na jednu od ponuđenih opcija

unutar izbornika (Predloži, Poništi oznake, Odjava), poziva se metoda

onOptionsItemSelected()koja u slučaju akcije Predloži, pokreće otvaranje

dijaloškog okvira (razred DialogFragment.java) za predlaganje novog sastanka. Na

slici Slika 3.4 lijevo, prikazan je dijaloški okvir u stanju nakon postavljanja podataka o

sastanku: vrsta sastanka, vrijeme početka i vrijeme završetka sastanka.

Page 28: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

23

Slika 3.4 Dijaloški okviri za predlaganje sastanaka

Podaci o vremenu održavanja sastanka postavljaju se unutar dijaloga za odabir vremena

(razred TimePickerDialog.java), koji je prikazan na slici Slika 3.4 desno. Na

kontrole je postavljena validacija koja provjerava međusobnu usklađenost termina početka i

završetka sastanka. U slučaju ispravnog postavljenja, na zaslonu se pojavljuje gumb Predloži

sastanak. Pritiskom na spomenuti gumb započinje se nova provjera koja sprječava pojavu

konfliktnih sastanaka.

Uz predlaganje sastanaka, unutar akcijskog izbornika ponuđena je dodatna opcija Poništi

oznake, koja briše oznake (element prikaza iz razreda CheckBox.java) korisnika koje su

prethodno razmatrani za dogovaranje sastanka. Posljednja opcija Odjavi odjavljuje korisnika

pri čemu vanjska komponenta automatski šalje informaciju o odsustvu korisnika ostalim

korisnicima.

Komponente za prikaz obavijesti

Za prikaz obavijesti unutar statusne trake operacijskog sustava koriste se dvije komponente:

primatelj namjera (razred NotificationBroadcastReceiver.java) i pozadinska

usluga za obradu namjera (razred NotificationIntentService.java). Obje

komponente popisane su unutar datoteke AndroidManifest.xml pri čemu je zatražena

dozvola od operacijskog sustava za postavljanje i uklanjanje zabrane odlaska uređaja u

pozadinsko stanje spavanja:

Page 29: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

24

<uses-permission android:name="android.permission.WAKE_LOCK"/>

Primatelj namjera nasljeđuje razred WakefulBroadcastReceiver.java, što mu

omogućuje postavljanje i uklanjanje spomenutih zabrana. Primatelj namjera pretplaćen je na

događaj primanja nove poruke, kojega razašilja zadužena vanjska komponenta. Prilikom

primanja namjere, unutar metode onReceive(), primatelj postavlja zabranu spavanja te

eksplicitno pokreće uslugu za obradu namjera kojoj se prosljeđuje razaslana namjera.

Pozadinska usluga (background service) nasljeđuje razred IntentService.java što

komponenti omogućuje neometani rad u vlastitoj dretvi. Aktivacijom asinkrone metode

onHandleIntent()obrađuje se primljena namjera. Na početku se dohvaćaju argumenti

namjere (intent extras), a potom korištenjem objekta iz knjižnice GSON obavlja obrnuti

postupak serijalizacije, koji tekstualni zapis tijela poruke (strukturirani format JSON1)

pretvara u instancu razreda MessageBody.java, koji sadrži sve potrebne atribute tijela

poruke. Postupak je prikazan u isječku Kod 3.2.

String body =

intent.getExtras().getString(MSG_EXTRA_JSON_BODY);

MessageBody messageBody =

new Gson().fromJson(body, MessageBody.class);

Kod 3.2 Dohvaćanje i izgradnja objekta tijela poruke

Nakon dohvaćanja i ponovne izgradnje objekta tijela poruke, aplikacija može započeti s

obradom sadržaja. Važno je napomenuti da se prije prikazivanja obavijesti, preko prethodno

spremljenih dogovorenih sastanaka, provjerava zauzetost korisnika te ukoliko je potrebno,

utoliko aplikacija potiho obavještava predlagatelja sastanka o zauzetosti pozvanog korisnika,

bez nepotrebnog ometanja pozvanog korisnika. Za uslugu prikazivanja obavijesti koristi se

instanca upravitelja obavijestima (razred NotificationManager.java) koji ovisno o

tipu dolazne poruke, prikazuje dvije vrste različito strukturiranih obavijesti. Ukoliko se radi

o nečijem prijedlogu za dogovaranje sastanka, aplikacija korisniku uz osnovne podatke o

sastanku, mora omogućiti unos odgovora kojim korisnik pristaje ili odbija prijedlog što je

prikazano na slici Slika 3.5:

1 JSON – JavaScript Object Notation, jednostavan format za razmjenu i prijenos podataka

Page 30: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

25

Slika 3.5 Prikaz obavijesti predlaganja sastanka

Sustav automatski prosljeđuje odgovor vanjskoj komponenti, koristeći instancu razreda

PendingIntent.java koja se veže na akcijski gumb na prikazanoj obavijesti.

Ukoliko se radi o nečijem odgovoru na poslani prijedlog, dovoljno je prikazati sadržaj tijela

odgovora, kao što je prikazano na slici Slika 3.6:

Slika 3.6 Prikaz obavijesti odgovora

Komponenta za praćenje vremena

Upravitelj alarmima (razred AlarmManager.java) je komponenta koja pruža uslugu

postavljanja alarma na razini operacijskog sustava. Komponenta pravovremeno obavještava

aplikaciju o ispunjenju vremenskog termina, odnosno okidanju postavljenog sata. Definicija

akcije koju je potrebno izvesti neposredno nakon okidanja, preko namjere se predaje objektu

Page 31: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

26

iz razreda PendingIntent.java. Komponenta se koristi pri svakom uspješnom

dogovaranju sastanka, pri čemu se na svim uređajima sudionika sastanka, alarm postavlja na

vrijeme početka i završetka sastanka, što osigurava pravovremeno ažuriranje informacije o

trenutnoj zauzetosti korisnika. Koristeći instancu razreda SharedPreferences.java,

svaki postavljeni alarm se sprema za slučaj ponovnog paljenja uređaja, pri čemu je potrebno

ponovno postaviti sve okidače. Isječak Kod 3.3 demonstrira postavljanje alarma koji će

okinuti za 10 sekundi nakon izvođenja:

// Dohvaćanje konteksta na razini aplikacije.

Context appContext = getApplicationContext();

// Varijable koje jednoznačno definiraju alarm.

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.SECOND, +10);

long alarmTime = calendar.getTimeInMillis();

int alarmId = new Random().nextInt();

// Postavljanje akcije koja se treba obaviti,

// u ovom primjeru treba razaslati namjeru.

Intent intent = new Intent(INTENT_ALARM_DONE);

PendingIntent pendingIntent = PendingIntent

.getBroadcast(appContext, alarmId , intent, 0);

// Pozivanje upravitelja i postavljanje alarma

AlarmManager manager = (AlarmManager) appContext

.getSystemService(ALARM_SERVICE);

manager.set(RTC_WAKEUP, alarmTime, pendingIntent);

Kod 3.3 Postavljanje alarma

Komponenta za lokacijsku informaciju

Komponenta je namijenjena za pružanje informacija o lokaciji korisnika. Definirana je u

razredu PositionService.java koji nasljeđuje razred Service.java, a sastoji se

od dva upravitelja (manager) koji na razini operacijskog sustava, omogućuju pristup

informacijama o trenutnom stanju sklopovlja uređaja. Prvi upravitelj je objekt razreda

NetworkManager.java koji omogućuje pristup podacima o stanju mreže, dok je drugi

instanca razreda LocationManager.java koji je zadužen za pristup lokacijskim

Page 32: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

27

podacima. Usluga je pretplaćena na dvije vrste događaja koje objavljuje operacijski sustav:

promjena trenutne lokacije korisnika te promjena stanja bežične mreže. Ukoliko dođe do

promjene lokacije korisnika, vrši se provjera kojom se utvrđuje fizička prisutnost korisnika

na određenoj lokaciji.

Za potrebe rada odabrana je lokacija zgrade FER-a, pri čemu je dopušteno odstupanje u

krugu od 150 metara, unutar kojega se korisnik i dalje smatra prisutnim. Ukoliko je

informacija o lokaciji nedostupna (onemogućenost ili nepostojanje sklopovlja za

pozicioniranje, uređaj GPS), usluga se oslanja na informaciji o stanju bežične mreže. Za

potrebu utvrđivanja trenutnog stanja, odabrana je bežična mreža FER-a (s identifikatorom

skupa usluga, FERwlan), koja je dostupna isključivo u bližoj okolici zgrade fakulteta.

Ukoliko je korisnik spojen na mrežu, usluga pretpostavlja fizičku prisutnost korisnika, koji

se vjerojatno nalazi u samoj zgradi ili bližoj okolici zgrade fakulteta. Svakom promjenom

stanja, usluga razašilja namjere koje obrađuje vanjska komponenta. Na ovaj način

omogućuje se automatska promjena informacija o prisutnosti.

3.2. Podržane funkcionalnosti aplikacije

Osnovne funkcionalnosti aplikacije koje korisnik može obavljati podijeljene su unutar tri

kategorije, što je prikazano i na dijagramu na slici Slika 3.7:

upravljanje korisničkim računom: registracija, prijava, odjava

upravljanje podacima: pregled kontakata, označavanje kontakata

dogovaranje sastanka: predlaganje sastanka, odgovaranje na prijedlog sastanka

Page 33: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

28

Slika 3.7 Dijagram obrazaca uporabe: Korisnik

Za kategoriju upravljanja korisničkim računom između uređaja i poslužitelja, korisnik

isključivo unosi podatke te inicira radnje, dok sav preostali posao obavlja aplikacija. Zadaci

prikaza i osvježavanja podataka ostvaruju se automatski unutar glavnog zaslona, pri čemu

korisnik jednostavnim radnjama može postaviti ili ukloniti oznaku s prikaza kontakta.

Najvažnija kategorija u koju spadaju osnovne funkcionalnosti aplikacije je dogovaranje

sastanka. Postupak stvaranja prijedloga za sastanak sa svim provjerama sustava prikazan je

na slici Slika 3.8. Dijagram korišten na slici Slika 3.8 predstavlja ulaznu točku (početnu

poruku) za sekvencijski dijagram prikazan na slici Slika 3.9, koji opisuje cjelokupan

postupak predlaganja i odgovaranja na prijedlog o sastanku.

Page 34: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

29

Slika 3.8 Sekvencijski dijagram: Stvaranje prijedloga za sastanka

Slika 3.9 Sekvencijski dijagram: Dogovaranje sastanka

Page 35: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

30

U sljedećem popisu navedene su sve provjere koje aplikacija vrši:

provjera unosa korisničkih podataka pri registraciji

provjera isteka unesenog termina pri predlaganju sastanka

provjera termina početka i završetka sastanka

provjera konfliktnih sastanaka

provjera zauzetosti potencijalnog sudionika sastanka

3.3. Testiranje aplikacije

Za vrijeme izrade aplikacije, za potrebe testiranja korišteni su virtualni uređaji (takozvani

emulatori) koji na računalu pokreću operacijski sustav Android, verzije 5.1.1. Prije ugradnje

svih komponenti, vanjska komponenta za komunikaciju testirana je korištenjem dva

emulatora što je prikazano na slici Slika 3.10 Prikaz testiranja aplikacije, koji se spajaju s

poslužiteljem Openfire, verzije 3.10.0, postavljenim na računalu domaćinu (localhost) koji

je baziran na protokolu XMPP. Za praćenje kontrolnih poruka i stanja operacijskog sustava

uređaja korišten je alat logcat, koji dolazi zajedno s razvojnim okruženjem Android Studio.

Slika 3.10 Prikaz testiranja aplikacije

Posebno su ispitivani slučajevi kada aplikacija miruje u pozadini, pri čemu pokrenute usluge

neovisno nastavljaju s radom. U većini slučajeva aplikacija se ponašala kao što se i

očekivalo, ali je primijećen nedostatak pri oblikovanju usluga, koje se isključivo pokreću s

prvim pokretanjem aplikacije, što znači da se pri ponovnom paljenju uređaja aplikacija mora

pokrenuti da bi se korisnik prijavio u sustav i nastavio s uobičajenim radom. Ispitivane su

funkcionalnosti prikaza kontakata koji se pokazuju unutar liste na ekranu, a potrebno je bilo

Page 36: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

31

uočiti slučaj korištenja koji nastupa pri označavanju potencijalnih sudionika sastanka.

Ukoliko bi u aplikaciju pristigla namjera za dohvat nove liste korisnika, aplikacija je morala

sačuvati prethodno označene korisnike te ih nakon postavljanja nove liste ponovno označiti.

U ponovljenim testovima nakon ispravke aplikacija se ponašala u skladu s očekivanjima.

Komponenta za provjeru lokacije korisnika testirana je pri radu s emulatorom pri čemu su

zadavane nasumične koordinate, čija promjena bi trebala biti registrirana. Aplikacija se

ponašala kao što je i očekivano, ali trebalo bi se napraviti više stvarnih testova na pravim

uređajima u stvarnom okruženju. Usluga praćenja stanja mreže se očekivano ponašala pri

svim pokretanjima i testiranju u stvarnom okruženju. Nekoliko puta testirana je usluga

postavljanja alarma koji je pravovremeno okidao. Nakon ugradnje svih komponenti,

aplikacija je testirana na stvarnom uređaju koji pokreće operacijski sustav Android, verzije

4.1.

Page 37: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

32

Zaključak

Zadatak rada bio je oblikovati, programski izvesti i testirati aplikaciju za brzo dogovaranje

sastanaka pametnim telefonima s operacijskim sustavom Android. Korišteni su vanjski

poslužitelj te pripadna klijentska komponenta za operacijski sustav Android. Komunikacija

se odvijala protokolom XMPP, namijenjenim za brzu razmjenu kratkih poruka.

Na početku rada istraživane su različite tehnologije s postojećim rješenjima u području

aplikacija za trenutnu razmjenu poruka i dogovaranje sastanaka. Uočeni su brojni zahtjevi i

ograničenja za usklađivanje i održavanje istog sadržaja na više različitih uređaja, za što se

izvrsnim pokazao odabir vanjske komponente temeljenoj na protokolu XMPP. Ugradnja i

funkcionalnosti vanjske komponente uspješno su izvedene korištenjem pripremljenih

mehanizama operacijskog sustava, poput razašiljanja namjera i pozadinskog izvođenja

zadataka.

Uspješno su ostvarene osnovne funkcionalnosti aplikacije, uz nešto manje testiranje i

validaciju ponašanja, koje bi svakako trebalo provesti u slučaju daljnjeg rada na aplikaciji.

Moguće dorade aplikacije mogle bi se izvesti u oblikovanju korisničkog sučelja, ali i

proširenju lokacijske usluge, koja bi s više različitih izvora prikupljala podatke.

Page 38: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

33

Literatura

[1] GOOGLE OFFICIAL BLOG, ANDROID FOR ALL AND THE NEW NEXUS 5

http://googleblog.blogspot.com/2013/10/android-for-all-and-new-nexus-5.html

[2] SILVAR, I. KONTEKSTNO-SVJESNA USLUGA PRISUTNOSTI TEMELJENA NA PROTOKOLU

XMPP, 2012.

[3] ANDROID DEVELOPERS, APPLICATION FUNDAMENTALS

http://developer.android.com/guide/components/fundamentals.html

[4] RAZVOJ USLUGA I APLIKACIJA ZA OPERACIJSKI SUSTAV ANDROID, 2015.

Predavanje: 8. Usluge i asinkrono izvođenje zadataka u pozadini

[5] PREGLED SIGURNOSTI GOOGLE ANDROID OPERACIJSKOG SUSTAVA

http://www.cert.hr/sites/default/files/NCERT-PUBDOC-2014-07-342_0.pdf

Page 39: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

34

Sažetak

U ovom radu izrađena je aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

operacijskim sustavom Android. Za komunikaciju i predlaganje sastanaka koristi se vanjska

komponenta za razmjenu poruka i informacija o prisutnosti protokolom XMPP. Pri

dogovaranju sastanaka, na osnovu informacija o prisutnosti, filtriraju se potencijalni

sudionici. Na osnovu lokacijske informacije omogućeno je automatsko mijenjanje

informacija o prisutnosti korisnika. Za izradu aplikacije proučeni su operacijski sustav

Android te glavne značajke protokola XMPP.

Page 40: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

35

Summary

The result of this paper is a smartphone application for quick arrangement of meetings for

Android mobile devices. In order to exchange messages and presence with other users, an

external XMPP (Extensible Messaging and Presence Protocol) component was used. In

order to arrange meetings, application filters potential meeting participants by their presence

and automatically updates their location information. Android operating system and XMPP

protocol were studied in purpose of understanding technologies needed for the application

implementation.

Page 41: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

36

Skraćenice

XMPP EXtensible Messaging and

Presence Protocol

proširivi protokol za razmjenu poruka i

informacija o prisutnosti

HTTP HyperText Transfer Protocol protokol HTTP

DNS Domain Name System sustav imenovanja domena

JID JabberID jedinstvena adresa (identifikator) protokola

XMPP

XML Extensible Markup Language jezik za označavanje podataka

SDK Software Development Kit programski paket za izradu aplikacija

AVD Android Virtual Device Android virtualni uređaj

DVM Dalvik Virtual Machine virtualni stroj Dalvik

JVM Java Virtual Machine virtualni stroj Java

JavaSE Java Standard Edition Java standardno izdanje

IM Instant Messaging trenutno poručivanje

P2P peer-to-peer isti-s-istim

JSON JavaScript Object Notation jednostavan format za razmjenu i prijenos

podataka

GPS Global Positioning System sustav za globalno pozicioniranje

Page 42: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

37

Ključni pojmovi

Android, aplikacija, dogovor, sastanak, pametni telefon, operacijski sustav, platforma,

otvorenost, pokretni uređaj, programska potpora, Google, Open Handset Alliance, Android

SDK, Cupcake, Donut, Eclair, Jelly Bean, Kitkat, Lollipop, materijalni dizajn, Web,

programska knjižnica, Linux, Dalvik, Java, JavaSE, DVM, JVM, dex, aktivnost, usluga,

pružatelj sadržaja, primatelj namjera, kontakti, element prikaza, upravitelj, životni ciklus,

pokrenuta usluga, povezana usluga, razašiljanje, raspored prikaza, padajući izbornik,

protokol XMPP, XML, Jabber, Openfire, decentralizirana arhitektura, objavi-pretplati,

GSON, JSON, dijalog, komponenta, serijalizacija, obavijest, sat, okidač, informacija o

prisutnosti, lokacijska informacija

Page 43: aplikacija za brzo dogovaranje sastanaka pametnim telefonima s

38

Key terms

application, Android, arrangment, meeting, smartphone, operating system, platform,

opensource, mobile device, software, Google, Open Handset Alliance, Android SDK,

Cupcake, Donut, Eclair, Jelly Bean, Kitkat, Lollipop, material design, Web, software

library, Linux, Dalvik, Java, JavaSE, DVM, JVM, dex, activity, service, content provider,

broadcastreceiver, contacts, view, manager, lifecycle, started service, bound service,

broadcasting, layout, spinner, XMPP Protocol, XML, Jabber, Openfire, decentralized

architecture, publish-subscribe, GSON, JSON, dialog, component, serialization,

notification, time, alarm, presence, location information