# <center> News App(i) - aplikacija koja koristi Web API </center> ##### Prirodno-matematički fakultet ##### Odsjek za matematiku ##### Teorijska kompjuterska nauka ##### Razvoj mobilnih aplikacija <hr> Projekat radile: Ermina Nezić Sanja Salihović Predmetni profesor: Prof. Dr. Elmedin Selmanović Predmetni asistent: Eldina Maslo, MA <hr> # O aplikaciji <div style="text-align: justify"> Ova aplikacija je podrazumijevala razvoj Android aplikacije putem koje će se vršiti prezentacija podataka dobivenih kroz Web API po našem izboru. Besplatan Web API koji smo mi iskoristile je News API sa stranice newsapi.org, na koju smo se registrovale kako bismo dobile API KEY koji je ključni za pristup podacima ovog News API-a. U suštini aplikacija prezentuje vijesti iz svijeta, gdje postoji mogućnost spašavanja vijesti koje želimo. Pregled vijesti se vrši preko Web VIEW-a, a podaci se spašavaju u Room Database. Također nudi nam se mogućnost pregleda najvažnijih vijesti, te traženja vijesti ovisno o našim interesima. Ali smo mi izdvojile i četiri kategorije koje izdvajaju vijesti iz tehnologije i nauke, kao i vijesti vezane za poslove i zabavu. Ukoliko želite biti informisani i znati događanja u svijetu, ovo je idealna aplikacija za vas. </div> <br><br> <center> <img src ="https://i.imgur.com/fz43cro.png" height = 500px> </center> <hr> <center> <img src ="https://i.imgur.com/DaqNovx.jpg" height = 500px> </center> <hr> <div style="text-align: justify"> Dakle kao što je već rečeno aplikacija vrši prezentaciju vijesti iz svijeta dobijenih putem News API-a. Obzirom na dokumentaciju ovoj apija, mi smo iskoristile njegove mogućnosti, te putem bottom navigacije omogućile prvo pristup najvažnijim vijestima, koje se mogu čitati pristupajući direktnoj stranici gdje je vijest objavljena, te imamo mogućnost ukoliko nam se članak svidio da ga spasimo. Spašeni članak možemo ponovo izbrisati. Također se mogu pretražiti vijesti kucanjem određene riječi, ali se mogu pronaći i izdvojene kategorije (poslovi, zabava, nauka, tehnologija) klikom na "More News" unutar opcijskog menija na glavnoj stranici. O svemu detaljnije kroz aplikaciju. </div> <br> <center> <img src = "https://i.imgur.com/LwD9cNu.png" heigth = 500px> </center> <br> <hr> <br> <div style="text-align: justify"> Prvo kliknemo na dugme "OPEN HERE" koje nam otvara glavnu stranicu. </div> <br><br> <hr> <center> <img src = "https://i.imgur.com/EcvPjtf.png" height="400px"> <img src = "https://i.imgur.com/RJEthUL.png" height="400px"> <img src = "https://i.imgur.com/z86Di9t.png" height="400px"> </center> <br><br> <div style="text-align: justify"> U zavisnosti na koju opciju menija kliknemo, tako će nam se i prikazivati stranice. Prilikom otvaranja automatski se prikazuje stranica "Breaking News" koja prikazuje najvažnije vijesti (u našem slučaju za United States jer smo postavile atribut koji omogućava odabir države iz koje želimo predstaviti vijesti- naravno ovaj korak je opcionalan). </div> <hr> <center> <img src = "https://i.imgur.com/RJEthUL.png" height="500px"> <img src = "https://i.imgur.com/IvCPMQD.png" height="500px"> </center> <br> <div style="text-align: justify"> Ovdje vidimo mogućnost čuvanja artikala kao i brisanja tih istih spašenih artikala uz odgovarajuću poruku. Akcija brisanja se može opozvati klikom na "UNDO", a samo brisanje vršimo slajdovanjem sačuvanog artikla lijevo ili desno. </div> <hr> <center> <img src = "https://i.imgur.com/z86Di9t.png" height="500px"> <img src = "https://i.imgur.com/dt9CQ25.png" height="500px"> </center> <br> <div style="text-align: justify"> Na prikazanim slikama vidimo da kucanjem riječi u tražilicu dobijamo vijesti vezane za ukucanu riječ. U ovom slučaju na slici smo dobili sve članke vezane za riječ "API". Za pretraživanje vijesti je zanimljivo što smo stavili vremensko odlaganje tako da ne uzima svako slovo prilikom pretrage već samo konačnu riječ. Ovo je jako bitno za naš API jer ne šaljemo previše zahtjeva nego samo zahtjev vezan za pretaživanu riječ. </div> <hr> <center> <img src = "https://i.imgur.com/yI0FUtb.png" height="500px"> <img src = "https://i.imgur.com/eElEIZq.png" height="500px"> </center> <br> <center> <img src = "https://i.imgur.com/p0XKXFL.png" height="500px"> <img src = "https://i.imgur.com/Qx1kctQ.png" height="500px"> </center> <br> <div style="text-align: justify"> Dalje, ako kliknemo na ikonu koja predstavlja "share" opciju, ona nas vodi na stranicu koja prikazuje sliku i predefinisanu poruku za slanje aplikacije drugima. Klikom na "SHARE THIS APP" dugme našu aplikaciju zajedno sa predefinisanom porukom možemo poslati preko ponuđenih opcija. Također imamo i "back" dugme u gornjem lijevom uglu odnosno na "app baru" koji nas vodi nazad na vijesti. </div> <hr> <center> <img src = "https://i.imgur.com/mxh2xRs.png" height="500px"> </center> <br> <div style="text-align: justify"> Kao što je već pomenuto, da bismo prešli na dio koji nam nudi vijesti iz ponuđenih kategorija, kliknemo na opciju "More News" unutar opcijskog menija. Otvara nam se stranica koja u "bottom" navigaciji ima ponuđene četiri kategorije vijesti: Business, Entertainment, Science, Technology. </div> <br> <center> <img src = "https://i.imgur.com/6qvgceZ.png" height="500px"> <img src = "https://i.imgur.com/tit8wgc.jpg" height="500px"> </center> <br> <center> <img src = "https://i.imgur.com/MF0FDQI.png" height="500px"> <img src = "https://i.imgur.com/dg3QYWJ.jpg" height="500px"> </center> <br> <div style="text-align: justify"> Također vidimo da i na ovoj stranici imamo opciju za vraćanje nazad, odnosno na prvu stranicu sa najvažnijim vijestima. </div> <br> <center> <img src = "https://i.imgur.com/5vOKhLV.png" height="500px"> </center> <hr> <div style="text-align: justify"> Svaki naš članak se prikazuje preko web view-a odnosno prikazuje se na izvornoj stranici. Kada gledamo članak koji smo kliknuli imamo jedno dugme na dnu ekrana čijim klikom omogućavamo spašavanje članka za čitanje uz određenu poruku. Spašeni članak možemo naći u dijelu "Saved News". </div> <br> <center> <img src = "https://i.imgur.com/qTJgH2H.png" height="500px"> <img src = "https://i.imgur.com/I4vzVLb.png" height="500px"> </center> <hr> # Arhitektura Aplikacije <div style="text-align: justify"> Arhitektura aplikacije predstavlja način na koji dizajnirate raspored klasa aplikacije. Naša aplikacija je podijeljena u sljedeće foldere: ADAPTERS (klase adaptera za kreiranje recyclerView-a), API (klase koje omogućavaju korištenje API-a), DATABASE (klasa koja predstavlja bazu podataka i DAO), MODELS (klase koje su generisane API-em), REPOSITORY (reposytori klasa), UI (klase zadužene za korisnički intrfejs - aktivnosti i fragmenti), UTIL (utility klase). O svim fajlovima i klasama bit će riječi u nastavku teksta. </div> # UI <div style="text-align: justify"> Ovaj dio se sastoji od klasa vezane za aktivnosti i fragmente. On treba da sadrži samo logiku koja će upravljati korisničkim inteface-om i operativnim sistemom.Podklase ovog foldera su ACTIVITIES - sadrže aktivnosti aplikcije, FRAGMENTS - sadrže fragmente, VIEWMODEL - sadrže view modele. </div> ## activities <div style="text-align: justify"> Klasa aktivnost omogućava kreiranje interfejsa kojim omogućavamo interakciju sa korisnicima. Važna metoda koju je potrebno implementirati u klasu koja nasljeđuje aktivnost je onCreate(Bundle). Pomoću nje inicijaliziramo našu aktivnost i koristimo još jednu jako bitnu funkciju setContentView() koja služi za postavljanja layout-a (xml file koji definiše izgled korisničkog interface-a). Aktivnosti koje su bile potrebne za kreiranje ove aplikacije su: </div> ### MainActivity <div style="text-align: justify"> To je prva aktivnost koja se pojavljuje na aplikaciji prilikom pokretanja iste. U ovoj klasi samo je uspostavljena funkcija na dodano dugme pomoću kojeg prelazimo dalje na aplikaciju (otvaramo novu aktivnost). To vršimo pomoću Intenta. Intent je u osnovi pasivna struktura podataka koja sadrži opis akcije koju mora izvšiti. Najviše se upotrebljava kao „ljepilo“ između aktinosti, iz jedne aktivnosti pokrećemo drugu, a pritom možemo slati i informacije. Također ova aktivnost ima jedan ImageView koji je postavljen kao pozadina cijele stranice, uz odgovarajući natpis. </div> ### NewsActivity <div style="text-align: justify"> Aktivnost koja se druga prikazuje na aplikaciji. Prikazuje layout "activity_news" i to nam je navHostFragment odnosno fragment koji hostira fragmente podržane u "bottom navigaciji" koja se također pojavljuje u ovoj aktivnosti. U "app baru" imamo opcijski meni koji nudi opciju za dijeljenje aplikacije i prelazak na iduću aktivnost koja nudi više vijesti podijeljenih u kategorije. </div> ### SharingActivity <div style="text-align: justify"> Ovo je aktivnost koja se pojavljuje klikom opcije "share" koja je "item" opcijskog menija prikazan preko ikonice. Ona se sastoji iz ImageView-a, predefinisane poruke koja se šalje preko Intenta, te dugme koje klikom omogućava to slanje. Iz ove aktivnosti se vraćamo u NewsActivity sa "back" dugmetom u "app baru" a to smo postigli tako što smo u manifestu ovoj aktivnosti dodali NewsActivity kao roditeljsku aktivnost. </div> ### NavigationNewsActivity <div style="text-align: justify"> Ova aktivnost se otvara kada se klikne na opciju "More News" koja se nalazi kao opcija unutar menija NewsActivity-a. Ona je gotovo ista kao i aktivnost NewsActivity samo što joj je "bottom" navigacija podijeljena u četiri dijela koji nam nude vijesti iz različitih kategorija. Ona u "app baru" posjeduje samo jedan "item", koji je ikonica, čijim klikom se vraćamo nazad. </div> <br><br><hr> ## fragments ### ArticleFragment <div style="text-align: justify"> ArticleFragment je fragment u kojem se prikazuju svi kliknuti članci koji se prikazuju na NewsActivity-u. Ovaj fragmenat je u suštini jedan WebView koji nam omogućava da pregledamo naš članak te da imamo mogućnost čuvanja kliknutog članka, a to postižemo tako što implementiramo funkciju za klik na "floating" dugme koje se prikazuje na ovom fragmentu. Postavljamo WebView klijenta koji će osigurati da će se stranica uvijek učitavati unutar ovog WebViewa, a ne u standardnom pretraživaču telefona. Prihvatamo članke koje smo proslijedili iz preostala 3 fragmenta unutar "bottom" navigacije NewsActivity-a. Ovo je vrlo jednostavno. Prvo uzimamo argumente kao globalne varijable. U onViewCreated funkciji želimo dobiti trenutni članku koji je proslijeđen kao argument ovome fragmentu. </div> ### ArticleNavFragment <div style="text-align: justify"> Potpuno identičan prethodnom fragmentu, samo što prihvata članke iz kategorija unutar NavigationNewsActivity-a. </div> ### BreakingNewsFragment <div style="text-align: justify"> Ovo je fragment koji se prvi prikaže na NewsActivity. On sadrži sve najnovije vijesti iz US-a jer smo kod te zemlje proslijedili. Ovaj fragment je RecyclerView lista sa svim člancima koji se pojavljuju unutar ove kategorije. Dakle imamo instancirane sve potrebne liste, adapter, viewModel. Ovaj fragment u suštini ima zadatak da za svaki članak koji će biti prikazan unutar liste provjeri da li je moguće da ga prikaže ili nije i na osnovu toga ga stavlja u pregled na listi ili vraća poruku. Za navedeno su implementirane funkcije unutar fragmenta. Također imamo i onScrollListener kojim se vrši paginacija stranica koja je dobijena na osnovu nekih kalkulacija, jer u početku možemo prikazati samo 20 članaka na stranici, a ova funkcija će se pobrinuti da kada skrolanjem dođemo do kraja stranice, dobijemo nove artikle, tako da ne budemo ograničeni na samo 20 ponuđenih članaka. </div> ### SavedNewsFragment <div style="text-align: justify"> Ovaj fragment nam omogućava čuvanje članaka proslijeđenih iz ArticleFragmenta u bazu podataka. Osim što ima mogućnost čuvanja članaka također su implementirane funkcije koje daju mogućnost brisanja članka iz baze "swipe" metodom lijevo ili desno. Ovu akciju je moguće opozvati, odnosno možemo izbrisani članak vratiti opet u bazu podataka. Da napomenemo i ovaj fragment je RecyclerView jer da bi prikazao sačuvane članke mora ih prikazati unutar liste. </div> ### SearchNewsFragment <div style="text-align: justify"> Fragment koji je RecyclerView jer kada ukucamo riječ u ponuđenoj tražilici potrebno nam je da članke prikažemo u listi. Ovdje smo omogućili vremensko odlganje, tako da se za svako ukucano slovo ne šalje zahtjev API-u da vrati članke, nego tek da za ukucanu riječ ponudi članke vezane za tu temu. Omogućena je paginacija kao i u prethodnim fragmentima. Vrlo lahko se implementira uz pomoć korutina. Zbog toga pravimo varijablu za korutinski job koji je nula inicijalno. Zatim postavljamo etSearch (id za naš searchEditText) na kojeg pozivamo addTextChangeListener, što bi značilo kad god se naš tekst promijeni u editTextPolju ova funkcija će biti pozvana. Kada god nešto ponovo upišemo, želimo da prekinemo trenutni job. Kada započinjemo novi, postavljamo MainScope(), što predstavlja "courutine dispetcher main" čija je prednost to što ne moramo isporučivati svaki put. </div> ### BusinessNewsFragment <div style="text-align: justify"> Gotovo identičan fragmentu BreakingNewsFragment. </div> ### EntertaimentNewsFragment <div style="text-align: justify"> Gotovo identičan fragmentu BreakingNewsFragment. </div> ### ScienceNewsFragment <div style="text-align: justify"> Gotovo identičan fragmentu BreakingNewsFragment. </div> ### TechnologyNewsFragment <div style="text-align: justify"> Gotovo identičan fragmentu BreakingNewsFragment. </div> <hr> ## viewmodel ### ViewModel, ViewModelFactory <div style="text-align: justify"> <b><i>ViewModel i LiveData</i></b> su dio arhitekture androida, predstavljaju biblioteke i komponente koje nam omogućavaju pisanje aplikacija koje su kompaktne, povjerljive i održive. ViewModel je klasa koja je zadužena za upravljanjem (prikupljanjem i čuvanjem) podataka potrebnih za aktivnosti ili fragmente, a oni trebaju moći pratiti promjene u ViewModelu. Pored ovog ona obezbjeđuje komunikaciju fragmenata/aktivnosti sa ostatkom aplikacije. ViewModel se kreira zajedno sa scope-om (fragment ili aktivnost) i živi dok god živi i sam scope. ViewModelFactory intscira ViewModel objekat, sa ili bez parametara konstruktora. Factory pattern (obrazac) je design pattern (obrazac dizajna) koji se koristi za kreiranje objakata. Ovo je metoda koja vraća instancu iste klase. U ovom projektu implmentirana su dva ViewModel-a, ponovo, jedan za kategorije, drugi za dnevne kategorije. Oni nam služe za prenos liste ili funkcije iz repositorija na UI i na taj način obezbijeđuju da informacije budu prenesene u adaptere. Kod nas su kreirani <b>NavigationNewsViewModel</b>, <b>NavigationNewsViewModelFactory</b> te <b>NewsViewModel</b> i <b>NewsViewModelFactory</b>. </div> ## database <div style="text-align: justify"> Room je postojana biblioteka koja pruža sloj apstrakcije preko SQLite-a kako bi se omogućio sigurniji pristup bazi podataka uz istovremeno korištenje pune snage SQLite-a. Room je dio Android arhitekturni komponenti. Ona nam dozvoljava kreiranja i manipulaciju SQLite bazom podataka na puno jednostavniji način. Ona automatski prevodi anotacije u SQLite upite kako bi obavila željene instrukcije. Pomenuta biblioteka pomaže nam pri kreiranju predmemorije podataka aplikacije na uređaju koji pokreće aplikaciju. Tri (velike) najvažnije komponente Room baze su: </div> <br> <ul> <li><b>Database (baza podataka):</b> ovo je klasa koja sadrži anotaciju @Database. Ona predstavlja objekt koji sadži konekciju sa SQLite bazom i sve funkcije koje su potrebne za njeno pokretanje i upravljanje. U našoj aplikaciji to je <i>ArticleDatabase</i>.</li> <br> <li><b>Entiteti (Entity):</b> je tabela u Room bazi. Ovdje pohranjujemo sve podatke potrebne za rad jedne tabele. Raspoznajemo ih po anotaciji @Entity. Kod nas je kao entitet uzeta generisana klasa <i>Article</i>.</li> <br> <li><b>DAO (Database Acces Object):</b> je interfejs koji u sebi sadrži metode potrebne za pristup bazi i njenim upravljanjem. Analogno, posjeduje anotaciju @Dao. Kod nas je to <i>ArticleDao</i> </li> </ul> <div style="text-align: justify"> Specifično za našu aplikaciju jeste što imamo generisanu klasu Source koju koristimo u bazi podataka, te smo morali napraviti klasu <i>Converters</i> koja pretvara tip podatka Source u primitivni tip podataka odnosno string. </div> <br> ## models <div style="text-align: justify"> U ovom folderu su smještene klase: <li> <b>NewsResponse</b> klasa koju smo kreirali tako što smo sa stranice newapi.org uzeli ponuđeni link i preveli ga iz json podatka u kotlin klasu, čime smo generisali potrebne klase za rad ovog API-a. </li> <li> <b>Article</b> je generisana klasa koja koja je entitet i sadrži primarni ključ, te sve podatke koje jedan članak sadrži i koje može prikazati. </li> <li> <b>Source</b> je generisana klasa koja vraća id i naziv izvora iz kojeg nam se prikaže članak. </li> </div> ## repository <div style="text-align: justify"> <b>Repository</b> u android aplikacijama nam omogućava podršku izvanmrežog predmemoriranja. Ako se ne implentira repository, aplikacije koje dohvataju podatke s poslužitelja (tj. servera) korisnik bi prilikom svakog pokretanja vidio zaslon za učitavanje, što nije dobra praksa i a sam klijent neće biti zadovoljan aplikacijom. Izvanmrežno programiranje se ogleda u tome da sama aplikacija sprema podatke preuzete sa mreže u svoju lokalnu memoriju uređaja, za brži pristup. Dakle podaci se neće preuzimati sa mreže svaki put, već samo jednom a potom će se isti prikupljati iz baze. Naravno, kada se primi novi mrežni rezultat, lokalna baza se ažurira i na zaslonu aplikacije se prikazuje novi sadržaj. Kao i sve do sada, repository se implemetira u vidu repozitorijske klase. U arhitekturi aplikacije ona bi trebala biti smještena između izvora podataka i ostatka aplikacije, jer repository pattern (repository obrazac) izoluje podatke od ostatka aplikacije. U našoj aplikaciji implementirana su dvije repository-ske klase: <li><b>NewsRepository</b></li> <li><b>NavigationNewsRepository</b></li> U njima su implementirane funkcije za pribavljanje vijesti iz zadane kategorije. </div> ## util <div style="text-align: justify"> Ovaj folder sadrži dvije klase: <li><b>Constants</b></li> <li><b>Resource</b></li> U klasi Constants su nam konstante koje koristimo u aplikaciji, a u klasi Resource implementirane su podklase koje se odnose na stanje uspjeha, učitavanja ili greške prilikom uzimanja članka uz pomoć API-ja. </div> ## api <div style="text-align: justify"> Ovaj folder sadrži dvije klase: <li><b>NewsAPI</b></li> <li><b>RetrofitInstance</b></li> <br> NewsAPI je interfejs koji koristimo da definišemo naše requeste(pojedinačne) koje uzimamo iz koda. Funkcije koje su implementirane služe za uzimanje svih vijesti iz te kategorije iz API-ja. Kad god napravimo HTTP request moramo specificirati vrijeme tog requesta. Koristimo metodu @GET(...) gdje upišemo odakle želimo vijesti. <i>newsapi.org</i> je bazni url, a ono što ide nakon "/" je nama potrebno. Iz dokumentacije koju naš API nudi možemo vidjeti koje kategorije možemo koristiti, kao i koje države i sve ostalo potrebno za pisanje upita. Napokon kreiramo funkciju koja dobavlja te vijesti. Obzirom da je ovo network call funkcija, moramo je izvršiti asinhrono i najbolji način za to jesu korištene "coroutines", a da bi se funkcija koristila u korutini moramo napraviti "suspend fun". Korutine su značajka Kotlina koja konvertuje asinhrone callback za dugo-pokrenute taskove access u sekvencijalni kod. Dalje o korutinama u nastavku. Unutar funkcije unosimo parametre, obzirom da je parametar dio requesta, onda ispred stavljamo @Query i naziv parametra(parametri se nalaze u dokumentaciji news API). Mi želimo državu ili kategoriju, zatim parametar page kojim ograničavamo broj vijesti koje dobijamo (na jednoj stranici dobijamo 20 artikala), te parametar api key tako da news api zna ko pravi requeste. <br> <br> Retrofit služi da vršimo NewsAPI pozive. Uspostavljamo ga tako da bismo mogli praviti "network request" (zahtjeve na internetu). Retrofit je singleton klasa, koja nam omogućava da pravimo requeste bilo gdje u kodu. Ova klasa ima "companion object" da ne moramo kreirati instancu klase, te privatnu varijablu retrofit by lazy. "By lazy" označava da mi jedino inicijaliziramo ovo jednom što postavljamo unutar {}. Pošto smo unutar projekta dodali "dependencies" koji omogućava da logujemo odgovore retrofita što je korisno za debugging, kreiramo "loging interceptor" kojeg zakačimo za naš retrofit objekat da bismo bili u mogućnosti vidjeti koji request ustvari pravimo i koji su odgovori. Moramo postaviti loging level kojim ćemo vidjeti "body" stvarnog requesta. Navedeni HTTP Logging Interpreter možemo iskoristiti da napravimo network client, koje dalje proslijeđujemo retrofit instanci. Kreiramo varijablu api by lazy gdje vraćamo klasu našeg interfejsa u našem slučaju, NewsApi i to je API objekat koji ćemo kasnije moći koristiti bilo gdje da napravimo request. </div> ### Korutine ( Coroutines ) <div style="text-align: justify"> <b>Korutine </b>su način upravljanja zadacima koji se dugo odrađuju. Kotlin korutine konvertuju callback bazirane kodove u sekvencijalne kodove, jer su sekvencijalni kodovi čitljiviji, lakši za upravljanje te nude više mogućnosti. Korutine su asinhrone, ne podržavaju blokove i koriste suspend funkcije (da bi pretvorili asinhroni kod u sinhroni). Asinhronost korutina se izražava u činjenici da se one izvršavaju nezavisno od koraka izvršavanja programa. Mogu raditi dok je program još u fazi čekanja na neki event. Suspend je kotlinova ključna riječ i služi za pravljenje funkcije ili tipa funkcje da bude vidljiv korutinama. Kada neka korutina pozove funkciju, ona vrši suspenziju sve dok ne dobije rezultat, potom korutina nastavlja tamo gdje je stala. Da bi mogli implementirali korutine u Kotlinu moramo se upoznati sa sljedeće tri stvari: job (zadataka), dispatcher i scope (oblast vidljivosti). <b>Job </b>je sve ono što može biti zaustavljeno. Svaka korutina posjeduje job i upravo se koristi za zaustavljanje korutine. Job može biti raspoređen u roditelj-dijete hijerarhiju, i zaustavljanjem roditeljskoj zadataka, instantno se zaustavljaju svi zadaci djece. <b>Dispatcher </b>šalje korake za pokretanje na različitim nitima. <b>Korutinski scope </b> ili oblast vidljivosti korutine definišu kontext u kojem korutine se pokreću. Scope povezuje tj. kombinuje informacije job-a (zadataka) i dispatcher. </div> ## adapters <div style="text-align: justify"> Unutar ovog foldera imamo klasu <b>NewsAdapter</b> koja nam omogućava da pravilno uspostavimo RecyclerView liste unutar naših fragmenata. Adapteri su komponente koje vežu podatke za View Groups koji su nasljeđeni iz klase AdapterView poput ListView-a ili Gallery . Adapteri kreiraju child View elemente i pune ih sa odgovarajućim podacima.Adapter pattern je jedan od design patterna koji ima za cilj da interfejs jedne klase pretvori u neki željeni interfejs kako bi se ona mogla koristiti u situaciji u kojoj bi inače problem predstavljali nekompatibilni interfejsi. Ovaj pattern možete vidjeti i u stvarnom životu npr. ako imate kabal koji ide u utičnicu A, međutim imate utičnicu B na raspolaganju, da bi uključili kabal A u utičnicu B treba vam adapter koji će dati novi interfejs kablu tako da on bude kompatibilan sa utičnicom. Adapteri navedeni u ovom poglavlju imaju sličnu svrhu, oni daju odgovarajući interfejs podacima kako bi se oni mogli iskoristiti u ViewGroups objektima. </div> <hr>