VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra technických studií Obor Aplikovaná informatika
M o b i l n í a p l i k a c e p o r t á l u a g ro s e r v e r. c z p ro O S A n d ro i d bakalářská práce
Autor: Lukáš Zejda Vedoucí práce: Mgr. Antonín Přibyl Jihlava 2016
Abstrakt Cílem této práce je vytvoření aplikace pro platformu Android, která má sloužit v provozu jako aplikace pracující s daty z portálu Agroserver.cz. K parsování dat bude použita knihovna Jsoup, primárně určená k tomuto účelu. Práce obsahuje základní informace o samotném operačním systému Android, analýzu a návrh implementace.
Klíčová slova Android, Android Studio, Jsoup, Activity
Abstract The aim of this work is to create application for the Android platform for the portal Agroserver.cz. Application will download, parse and visualize data from this portal using Jsoup library, which is primarily designed for that. The thesis contains basic information about the Android operating system, application analysis and design implementation.
Key words Android, Android Studio, Jsoup, Activity
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutí licence. V Jihlavě dne
............................................... Podpis
Poděkování Na tomto místě bych rád poděkoval svému vedoucímu práce Mgr. Antonínu Přibylovi za poskytnutí tématu a možnost vytvářet ho pod jeho vedením.
Obsah 1
Úvod.......................................................................................................................... 8
2
Android ..................................................................................................................... 9 2.1
3
Architektura........................................................................................................ 9
2.1.1
Linux Kernel ............................................................................................... 9
2.1.2
Knihovny .................................................................................................... 9
2.1.3
Android Runtime ........................................................................................ 9
2.1.4
Aplikační vrstva ........................................................................................ 10
2.1.5
Aplikace .................................................................................................... 10
2.2
Verze systému Android .................................................................................... 11
2.3
Activity............................................................................................................. 11
2.3.1
Service ...................................................................................................... 11
2.3.2
Content provider ....................................................................................... 11
2.3.3
Broadcast receiver..................................................................................... 12
Popis řešeného problému ........................................................................................ 13 3.1
Webové rozhraní Agroserver.cz ....................................................................... 13
3.2
Aktéři................................................................................................................ 14
3.2.1
Aktér: Nepřihlášený uživatel .................................................................... 16
3.2.2
Aktér: Přihlášený uživatel ......................................................................... 16
3.2.3
Aktér: Platící uživatel ............................................................................... 16
3.2.4
Aktér: Webové rozhraní............................................................................ 16
3.2.5
Aktér: Čas ................................................................................................. 16
3.3
Funkce .............................................................................................................. 17
3.3.1
Zobrazování dat ........................................................................................ 17
3.3.2
Vytvoření nabídky a poptávky .................................................................. 17
3.3.3
Prohlížení nabídky a poptávky ................................................................. 18
3.3.4
Upozornění na novou nabídku nebo poptávku ......................................... 18
4
Rešeršní řešení ........................................................................................................ 19
5
Analýza ................................................................................................................... 20 5.1
6
Analýza požadavků .......................................................................................... 20
5.1.1
Primární funkční požadavky ..................................................................... 20
5.1.2
Požadavky do budoucna ........................................................................... 20
5.1.3
Mimofunkční požadavky .......................................................................... 20
Návrh ...................................................................................................................... 21 6.1
Možnosti řešení ................................................................................................ 21
6.1.1
Vytvoření API ........................................................................................... 21
6.1.2
Přístup k databázi ...................................................................................... 21
6.1.3
Parsování webové stránky ........................................................................ 21
6.2 7
Jsoup ....................................................................................................................... 23 7.1
8
Datová struktura ............................................................................................... 21 DOM ................................................................................................................ 24
Popis implementace ................................................................................................ 25 8.1
Nástroje ............................................................................................................ 25
8.1.1 8.2
9
Emulátor.................................................................................................... 25
Neobvyklé knihovny a funkce ......................................................................... 26
8.2.1
Načtení komodit do seznamu .................................................................... 27
8.2.2
Předávání dat další aktivitě a spuštění aktivity ......................................... 29
8.2.3
Internet Access Checker ........................................................................... 29
8.2.4
Automatické přihlašování aplikace ........................................................... 29
8.2.5
Notifikace.................................................................................................. 30
Závěr ....................................................................................................................... 31 9.1
Splnění cílů....................................................................................................... 31
9.2
Problémy a jejich řešení ................................................................................... 32
9.3
Možnosti rozšíření práce .................................................................................. 32
9.4
Shrnutí .............................................................................................................. 32
Seznam použité literatury ............................................................................................... 33 Seznam obrázků .............................................................................................................. 35 Seznam použitých zkratek .............................................................................................. 36 10 Obsah přiloženého CD ............................................................................................ 37
1 Úvod Jako cíl této práce jsem zvolil aplikaci na mobilní platformu Android, protože v aplikacích na tuto rozšířenou platformu vidím již delší dobu potenciál. Jelikož jde o nejrozšířenější mobilní platformu, mohou být takto získané zkušenosti velikým přínosem pro můj budoucí kariérní růst. Aplikace bude později pravděpodobně umístěna na Google Play, což je portál s aplikacemi pro Android, a bude sloužit v reálném provozu. Její primární funkcí je zobrazování dat o komoditách, které jsou totožné s daty na portálu agroserver.cz. Jde o rychlý přístup k datům, kdy uživatel nemá přístup k webovému rozhraní agroserveru. Jako další primární funkčnost aplikace lze uvést E-nabídku/E-poptávku. Touto funkčností se myslí, že uživatel bude moci vytvořit nabídku nebo poptávku a stejně tak ji prohlížet a reagovat na ni. Celá aplikace bude zabalena v jednoduchém designu a jakoukoliv jinou funkčnost, jako vytvoření uživatele či změnu údajů, nebude aplikace obsahovat. Cílem je jednoduchost a přehlednost, další operace s uživatelskými účty nebo daty by uživatele zbytečně zatěžovala. Aplikaci jsem se rozhodl napsat ve vývojovém prostředí Android Studio, které je k vývoji aplikací na platformu Android primárně určeno. K této problematice se nabízely 3 možnosti způsobu řešení, ale reálné bylo zvolit metodu parsování webových stránek. Tato metoda nepočítá se změnami ve zdrojovém kódu stránky, ale je jednoduchá a bezpečná. K jejímu použití slouží Javovská knihovna Jsoup.
8
2 Android Jedná se open-source OS (operační systém), který momentálně vyvíjí korporace Google. Tento OS pracuje na více než 80% všech zařízení (2015), jako jsou chytré telefony, tablety nebo hodinky. Systém je navržen tak, aby dokázal pracovat na různých zařízeních s odlišnými parametry – nejen s rozlišením či velikostí dotykové plochy, ale i s rozdíly výkonu. V poslední době někteří výrobci mobilních zařízení modifikují tento systém dle svých vlastních požadavků. [1] Google podporuje vývojáře vytvořením SDK (Software Development Kit), což je nástroj vytvořený na implementaci nejrůznějších aplikací. Jedná se o freeware, stejně tak Android Studio, které je rovněž freeware. Celý systém je postaven na linuxovém jádru a využívá mnoha vlastností Linuxu, např. správy paměti, procesů a ovladačů.
2.1 Architektura 2.1.1 Linux Kernel Nejnižší vrstvou je samotné jádro systému. Zde je řešena správa paměti, procesů, sítí nebo ovladačů. Důvodem k použití jádra Linuxu je snadná přenositelnost, což je pro tento OS klíčové. [2]
2.1.2 Knihovny Jedná se o knihovny napsané v jazyce C/C++, jež jsou poskytnuty vývojářům pomocí Android Appliaction Framework. Za pomoci těchto knihoven můžeme pracovat s grafikou, databázemi, vektory a médii.
2.1.3 Android Runtime Vrstva, která obsahuje instanci DVM (Dalvik Virtual Machine), což je virtuální stroj, na němž běží aplikace vyvíjené pro Android. Každý zdrojový kód je zkompilován do Java byte code, až poté do Dalvik byte code. Důvodem vzniku DVM byla licenční práva JVM (Java Virtual Machine), který není volně šiřitelný, dále úspora energie a optimalizace výkonu virtuálního stroje.
9
2.1.4 Aplikační vrstva Poskytuje služby využívané v aplikacích. Jedná se o služby, které mohou zpřístupňovat data z ostatních aplikací, aplikace spuštěné na pozadí nebo třeba i hardware používaného zařízení, jako je fotoaparát, gyroskop a další. Nejzákladnější služby jsou:
View – jedná se o sadu prvků použitých na uživatelské rozhraní. Jsou to například tlačítka, seznamy, tabulky, textové pole nebo zatrhávací pole (check boxy).
Content provider – sdílení dat mezi ostatními aplikacemi
Resource manager – slouží jako přístup k lokalizačním řetězcům, grafice, jako jsou ikony a pozadí nebo soubory designu
Notification manager – umožnuje vytvářet a pracovat s notifikacemi
Activity manager – spravuje veškeré aktivity řízením jejich životního cyklu
2.1.5 Aplikace Poslední vrstvu tvoří samotné aplikace, které jsou nainstalované v mobilním zařízení. Je to například emailový klient, galerie obrázků, aplikace fotoaparát, webový prohlížet atd. [3]
Obrázek 1 - Architektura Android AUTOR NEUVEDEN. http://elinux.org [online]. [cit. 5. 5. 2016]. Dostupný na WWW: http://elinux.org/Android_Architecture
10
2.2 Verze systému Android Verzí systému Android je mnoho a každá z nich vždy nabídla několik užitečných úprav a funkčností. Celkový počet verzí přesáhl desítku (Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwich, Jelly Bean, KitKat a Lollipop, Marshmallow), a proto se dá říci, že vývojáři tohoto systému stále nabízí nové možnosti. V předposlední verzi 5.0 Lollipop je již nabízen i 64-bitový systém Android. U první verze Androidu bylo novinkou používání fotoaparátu pro pořizování videa a jeho následné prohlížení. Dnes se tato „novinka“ považuje za samozřejmost. [4]
2.3 Activity Activity je obvykle jedna obrazovka zobrazena na mobilním zařízení. Správa aktivit probíhá v Activity Manageru, kde je řešena správa paměti, spouštění a ukončení aktivity. Activity Manager pracuje se zásobníkem tak, že jednotlivé aktivity do něj ukládá a na vrcholu zásobníku je vždy zobrazovaná aktivita. Každá aktivita může nabývat stavů Active, Paused, Stopped a Destroyed: [5][6]
Active – aktivita běží, je viditelná a interaguje s uživatelem
Paused – aktivita běží, je částečně viditelná, ale čeká například na vstup
Stopped – předána do pozadí, ale stále zůstává v paměti. Je překryta jinou aktivitou.
Destroyed – úplné ukončení aktivity, uvolnění paměti
2.3.1 Service Představují pouze procesy, které běží na pozadí. Tyto komponenty nemají žádné uživatelské rozhraní. Zpravidla se jedná o dlouhotrvající procesy. [5][6]
2.3.2 Content provider Velice zjednodušeně se jedná o způsob sdílení dat mezi ostatními aplikacemi. Data se ukládají do tabulek a ostatní aplikace do této tabulky mohou za určitých pravidel přistupovat. [5][6]
11
2.3.3 Broadcast receiver Slouží k vyvolávání událostí při změnách stavů, jako odpojení od sítě nebo zhasnutí displeje. [5][6]
Obrázek 2 - životní cyklus aktivity AUTOR NEUVEDEN. http://techblogon.com [online]. [cit. 5. 5. 2016]. Dostupný na WWW: http://techblogon.com/android-activity-lifecycle-example-code-description/
12
3 Popis řešeného problému Jak jsem již zmínil v úvodu své práce, cílem je nějakým způsobem získat data z webového portálu Agroserver.cz a tato získaná data dále prezentovat ve zjednodušené a přehledné formě pro uživatele aplikace.
3.1 Webové rozhraní Agroserver.cz Funkčnost webového rozhraní se liší převážně v rozsahu funkčnosti. Tím je myšleno, že webové rozhraní nabízí rozšířené funkce, jako je změna hesla, editace uživatele či nabídky a poptávky. Těmito funkcemi by aplikace ztratila jednoduchost ovládání, ta je přitom jedním z primárních nefunkčních požadavků, a proto jej musíme respektovat. Celý design aplikace se bude převážně lišit v zobrazování dat, protože webové rozhraní nabízí poměrně veliké tabulky a vzhledem k velikosti mobilních zařízení není možné data zobrazovat stejným způsobem. Webové rozhraní také nabízí detailní popis u většiny komodit, z důvodu úspory místa a nepodstatnosti těchto údajů však budou tato data vypuštěna. Změna údajů a editace nabídek a poptávek bude možná pouze přes webové rozhraní agroserveru.
13
3.2 Aktéři V této sekci rozebereme detailněji jednotlivé aktéry, kteří budou s aplikací pracovat, stejně jako s webovým rozhraním. Popis možností jednotlivých aktéru se nikterak neliší od popisu a práv na portálu agroserveru. Jediným rozdílem jsou výše zmíněné změny ve funkčnosti celé aplikace, ale fakt, že uživatelé si nebudou moci změnit údaje, nemá vliv na práva jednotlivých rolí.
Obrázek 3 - Use case diagram
Zdroj: http://creately.com/Draw-UML-and-Class-Diagrams-Online
Z Use Case diagramu je vidět, že celý systém je velice jednoduchý. Všichni aktéři mají velice podobná práva, což vede z dědičnosti aktérů. Každý z nich má pouze několik unikátních případů užití. Každý aktér vlastní práva uživatele, ze kterého je specializován.
14
Název účastníka
Popis
Nepřihlášený uživatel
Může zobrazovat nebo vyhledávat aktuálně vypsaná data ze serveru. U E-nabídky/poptávky je přístupná pouze skupina „Nepřihlášení“. E-nabídku/poptávku nemůže vkládat.
Přihlášený uživatel
Může vykonávat všechny činnosti jako Nepřihlášený uživatel a navíc vytvořit enabídku/poptávku ve své skupině komodit. Uživatel může sledovat nabídky i poptávky pro jeho vlastní skupinu.
Platící uživatel
Může vykonávat všechny činnosti jako Přihlášený uživatel. Navíc vidí aktuální data za posledních 24 hodin. Tento uživatel je zvýhodněn zobrazením dat se zpožděním dat několik minut. Uživatel může sledovat nabídky i poptávky pro jeho vlastní skupinu.
Webové rozhraní
Poskytuje data.
Čas
Abstraktní
účastník
zodpovědný
za
aktualizace dat. Tabulka 1 – Tabulka s aktéry
15
3.2.1 Aktér: Nepřihlášený uživatel Tato osoba se dostává do kontaktu s aplikací a webovým rozhraním. Nepřihlášený uživatel bude moci pracovat s daty prostřednictvím aplikace v případě, že jeho mobilní telefon bude podporovat OS Android. Dále je potřeba datový tarif, který je zajištěn 3. stranou, nebo jiný přístup k Internetu. Jeho možnosti jsou omezené oproti uživatelům přihlášeným či platícím. Přehled jeho omezení oproti ostatním uživatelům je v tabulce uvedené výše. Může zobrazovat pouze nabídky a poptávky jemu určené, ale sám je vytvářet nemůže. Běh aplikace na tomto aktérovi není nějak závislý. Tato definice vlastností aktéra je totožná jako u webového rozhraní. [12]
3.2.2 Aktér: Přihlášený uživatel Tento aktér přebírá vlastnosti aktéra Nepřihlášený uživatel s tím rozdílem, že může vytvářet e-nabídky/poptávky. Dále má možnosti zobrazit i nabídky a poptávky, které jsou určeny jeho skupině uživatelů. Zobrazená data se nikterak neliší od zobrazených dat nepřihlášeného uživatele. Běh aplikace na tomto aktérovi není nijak závislý. Tato definice vlastností aktéra je totožná jako u webového rozhraní. [12]
3.2.3 Aktér: Platící uživatel Tento uživatel přebírá veškeré vlastnosti aktéra Přihlášený uživatel. Liší se v přístupu k aktuálním datům. Tím je myšleno, že platící uživatel oproti přihlášenému může zobrazovat data za posledních 24 hodin. Běh aplikace na tomto aktérovi není nijak závislý. Tato definice vlastností aktéra je totožná jako u webového rozhraní. [12]
3.2.4 Aktér: Webové rozhraní Poskytuje data, která jsou nedílnou součástí aplikace. Na tomto aktérovi závisí běh aplikace v plném rozsahu. [12]
3.2.5 Aktér: Čas Na tomto aktérovi bude závislá aktuálnost dat. Intervaly aktualizace dat budou definovatelné v nastavení aplikace. [12]
16
3.3 Funkce V této sekci jsou popsány základní funkce aplikace.
3.3.1 Zobrazování dat Jedná se o nejpodstatnější funkcionalitu aplikace. Tato funkce bude vyvolávaná několikrát denně. Touto funkcionalitou se myslí zobrazení cen vybrané komodity, které budou v mnohem jednodušší tabulce, než kterou můžeme vidět na webových stránkách. Také v aplikaci nebude celkový přehled všech komodit, nýbrž jen seznam komodit. Až po výběru komodity se zobrazí report o cenách. Tímto způsobem je zobrazení uděláno z jednoho prostého důvodu - omezeného prostoru pro zobrazení dat. Proto tabulka nebude obsahovat data, jako jsou například maximální či minimální hodnota. V případě zájmu o tato data bude muset uživatel navštívit web portálu agroserver.cz. Na obrázku níže jsou zobrazena všechna data.
Obrázek 4 - kompletní přehled cen jednotlivých komodit ZEJDA LUKÁŠ. http://www.agroserver.cz [online]. [cit. 5. 5. 2016]. Dostupný na WWW: http://www.agroserver.cz/cenovy-report
Tabulka v aplikaci bude tedy obsahovat pouze název komodity, aktuální cenu komodity (u platícího uživatele), cenu k předešlému dni, cenu k dnešnímu datu, změnu (pouze graficky pomocí šipek u platícího uživatele) a jednotku.
3.3.2 Vytvoření nabídky a poptávky Další základní funkcionalitou je vytvoření vlastní nabídky či poptávky. U webového portálu je rozlišení mezi nabídkou a poptávkou pouze atributem, zda se jedná o nabídku či poptávku. Já se rozhodl tento atribut vypustit a vytvořit dvě oddělené sekce. Důvodem
17
je úspora místa a dobrý zvyk takto nabídku a poptávku rozlišovat. Nabídka bude obsahovat veškeré informace jako u webové verze.
Obrázek 5 - nabídka a poptávka ZEJDA LUKÁŠ. http://www.agroserver.cz [online]. [cit. 5. 5. 2016]. Dostupný na WWW: http://www.agroserver.cz/e_nabidka_e_poptavka/11
3.3.3 Prohlížení nabídky a poptávky Je samozřejmostí, že uživatel může prohlížet nabídky či poptávky ostatních uživatelů. Nabídky jsou děleny do sekcí dle komodit, což je příhodné a tento přístup zůstane zachován. U každé sekce je skrytý atribut „Nové“, jenž se zobrazí při vytvoření nové nabídky. Tato funkcionalita bude využita u notifikace v aplikaci. Nabídka či poptávka bude obsahovat pouze informace komodita, platnost do, parita, cena a měna. Zbylé informace budou k dispozici po zobrazení detailu nabídky či poptávky. Atribut stav je nic neříkající, proto je vypuštěn. Atribut typ je po rozdělení na nabídku a poptávku taktéž zbytečný. Další atributy budou zobrazeny po tlačítka pro zobrazení detailu. Kontakt se zobrazí po stisknutí tlačítka pro kontakt, který je vždy u každého z inzerátu.
3.3.4 Upozornění na novou nabídku nebo poptávku Cílem této funkcionality je upozornit na nově vzniklé nabídky či poptávky. Oznámení bude realizováno za pomocí zprávy na liště v mobilním zařízení. Po stisku notifikace se otevře aktivita s hlavním menu.
18
4 Rešeršní řešení Specifikace mých cílů nejsou nikterak obecné, proto se rešeršní řešení tohoto konkrétního problému nenajde. Jsou spousty aplikací, které za pomocí parsovacích knihoven pracují s daty stejně jako tato aplikace, ale struktura se liší a záleží na struktuře samotného webu. U oficiálních aplikací se často používá API, což je pochopitelné, protože se aplikace snadno rozšiřuje a je responzivní vzhledem ke struktuře webu.
19
5 Analýza 5.1 Analýza požadavků 5.1.1 Primární funkční požadavky
Možnost se přihlásit do systému
Možnost zobrazovat data z agroserver.cz
Vytvořit e-nabídku ve své skupině komodit
Vytvořit e-poptávku ve své skupině komodit
Front-end bude v podobném barevném schématu, jako webová verze systému
Aplikace bude responzivní
Front-end bude dostupný v češtině
Tři uživatelské přístupy (host, přihlášený, platící)
Informovat uživatele o nově vytvořené nabídce/poptávce
Zobrazit e-nabídku ve své skupině komodit
Zobrazit e-poptávku ve své skupině komodit
5.1.2 Požadavky do budoucna Tyto požadavky byly nadefinovány, ale jsou vyjmuty z plánu implementace.
Grafické zobrazení vývoje ceny komodit
Multijazyčnost aplikace s verzí pro anglický a německý jazyk
Možnost editovat uživatele
Možnost editovat nabídky/poptávky
5.1.3 Mimofunkční požadavky
Aktualizace dat
20
6 Návrh 6.1 Možnosti řešení V této problematice se nabízely tři možnosti řešení. Důvody, proč jednotlivé metody nebyly použity, nalezneme u každého popisu metody.
6.1.1 Vytvoření API Application Programming Interface je nejideálnější z možností řešení. Je ovšem zapotřebí takové API vytvořit. Jednalo by se nejspíše o knihovnu, kde by byly nadefinovány veškeré funkce a procedury, potřebné pro komunikaci s databází. Takové API ovšem neexistuje, tudíž nebude použito k realizaci.
6.1.2 Přístup k databázi Další možností je přímý přístup k databázi, což znamená vypustit API coby prostředníka a pracovat s daty přímo ze zdroje. Tato cesta je potencionálně nebezpečná z důvodu smazání nebo změny dat. Proto byla i tato metoda zavržena.
6.1.3 Parsování webové stránky Byla tedy použita metoda parsování HTML kódu. Z hlediska bezpečnosti je nejefektivnější, protože nikterak nenaruší strukturu stránek ani databázi, poněvadž do ní nepřistupuje. Tato metoda nemá nikterak odlišná práva a možnosti než běžný přístup z jakéhokoli počítače.
6.2 Datová struktura Datová struktura se liší od datové struktury u webového rozhraní zásadním způsobem. Bylo rozhodnuto, že nabídka a poptávka bude rozlišována na úrovni objektů, takže bude vytvořena zvlášť třída Nabídka a zvlášť Poptávka. Obě tyto třídy budou dědit z třídy Inzerát.
21
Celá datová struktura je navřena tak, aby pojmula veškeré informace uvedené na webovém rozhraní, ale z důvodů jednoduchostí mnou dříve popsaných jsou data vypuštěna. Původní datovou strukturu nalezneme v příloze. Finální datová struktura projektu je strohá právě z důvodu jednoduchosti aplikace. Byla například vypuštěna třída Uživatel, se kterým se nikterak v aplikaci nepracuje.
Obrázek 6 - Class Diagram
Zdroj: http://creately.com/Draw-UML-and-Class-Diagrams-Online
Třídy Nabídka a Poptávka jsou poděděny z třídy Inzerát, jak již bylo zmíněno dříve. Jelikož se v datové struktuře nikterak neliší, tak se toto řešení nabízelo. Obě třídy mají vlastní konstruktor, ale ten pouze volá poděděný konstruktor rodiče. Navíc tu je třída Kontakt, která slouží pouze k zobrazení kontaktu na nabízejícího či poptávajícího. Třída Komodita je oddělena od předchozích, protože spolu na první pohled nikterak nesouvisí. V této třídě jsou informace o cenách jednotlivých komodit pro všechny aktéry.
22
7 Jsoup Jedná se o Java knihovnu, která pracuje s HTML. Využívá DOM, CSS a JQuery pro extrahování a manipulaci s daty. V níže uvedeném příkladu použití budeme selektovat veškeré odkazy. public static void main(String[] args) throws IOException { String urlString = "http://www.vspj.cz/"; Document doc = Jsoup.connect(urlString).get(); System.out.println(doc.title()); // VŠPJ | Úvodní stránka System.out.println(doc.text()); // kompletní obsah stránky System.out.println("============================="); Elements links = doc.select("a"); for (Element link : links) { System.out.println("Link: " + link); System.out.println("Text: " + link.text()); }
// cyklus vypíše všechny odkazy na webu
Nejprve navážeme spojení s webovou stránkou a získáme DOM, což je objektově orientovaná struktura webové stránky. K tomuto slouží funkce Jsoup.connect(url).get(), kde url je URL adresa požadované stránky. Další důležitou funkcí je doc.select(), kde jako argument vložíme řetězec s požadovaným elementem. V našem případě je to „a“ ,tedy odkaz. Funkce doc.select() parsuje veškeré odkazy a uloží je do proměnné datového typu Elements. [7]
23
7.1 DOM Document Object Model je reprezentace HTML v objektově orientované formě. V podstatě se jedná o platformě a jazykově nezávislé rozhraní, v němž můžeme přistupovat, měnit strukturu nebo obsah dokumentu. DOM je realizován formou datové struktury strom, který se zde přímo nabízí. Dokument je pak dále dělen na jednotlivé elementy, jako jsou odkazy, odstavce, tabulky a další. [8]
Obrázek 7 - Document Object Model ERIKSSON, Birger. https://commons.wikimedia.org [online]. [cit. 5. 5. 2016]. Dostupný na WWW: https://commons.wikimedia.org/wiki/File:DOM-model.svg
24
8 Popis implementace 8.1 Nástroje 8.1.1 Emulátor Jedná se virtuální zařízení sloužící v testování při implementaci aplikací na OS Android. Emulátor bývá součástí Android Studia, kde se v AVD (Android Virtual Machine) Manageru dá různě konfigurovat. Můžeme si zvolit z několika nadefinovaných zařízení od mobilních telefonů po chytré televize - nebo si nadefinovat vlastní zařízení.
Obrázek 8 - AVD - tvorba nového virtuálního zařízení
25
8.2 Neobvyklé knihovny a funkce Jakákoliv práce s parserem nebo sítí obecně vyžaduje vlastní vlákno, v němž bude parsování probíhat. V Androidu je k tomuto určena třída AnsyncTask zajišťující běh na pozadí ve vlastním vlákně. Má tři metody: onPreExecute, doInBackground a onPostExecute
onPreExecute - v této metodě nejčastěji nuluji seznamy nebo adaptéry, které chci aktualizovat. Používám je v případě, že z portálu načítám nová data a původní pouze odstraním.
doInBackground - v této metodě již pracuji s parserem, kde do seznamů ukládám potřebná data k zobrazení a další funkčnosti. Tato metoda vždy následuje po metodě onPreExecute.
onPostExecute – tato metoda je volána vždy po metodě doInBackground. Používám ji na aktualizaci adaptéru, který následně plní ListBox, z něhož uživatel vybírá například komodity, nebo je použita na informování uživatele, zda je či není přihlášen.
U následujícího výseku z kódu je znázornění, jak pracuje jedna z funkcionalit Jsoup. Je zde popis jednotlivých příkazů specifických pro parsování. [9][10]
26
8.2.1 Načtení komodit do seznamu Zde je třída implementující načtení obsahu webu a následné strukturování do proměnných. class getKomodity extends AsyncTask
{ @Override protected void onPreExecute() { super.onPreExecute(); SeznamKomoditActivity.komodityLV.clear(); } @Override protected Void doInBackground(Void... params) { try { Document document = Jsoup.connect(ConstantsURL.BURZA_MAIN).timeout(0).get(); for(Element table : document.select("table")) { Elements links = table.getElementsByTag("a"); for (Element link: links) { String url = ConstantsURL.MAIN_ADD_HREF + link.attr("href"); if(link.text().equals(">> více ...")) { continue; } URLStringList urlStringList = new URLStringList(link.text().toUpperCase().toString(),url); SeznamKomoditActivity.komodityLV.add(urlStringList); } } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { SeznamKomoditActivity.adapter1.notifyDataSetChanged(); } }
Metodou GET () jsme do proměnné document stáhli celý obsah webu, který je uspořádán do datové struktury stromu, který byl již dříve popsán jako DOM. Document document = Jsoup.connect(ConstantsURL.BURZA_MAIN).timeout(0) .get();
V cyklu pak projdu veškeré tabulky na konkrétní stránce přístupné. Metoda SELECT(„table“) totiž vrací Elements, což je seznam všech elementů s tagem table. 27
Při každém projití cyklem se do proměnné table, která je datového typu Element (tabulky, odkazy, řádky a sloupce, atd.), uloží konkrétní tabulka z webu. for(Element table : document.select("table")) {...}
Další segment kódu vybere všechny tagy a, což jsou odkazy, a v cyklu je opět všechny prochází. Elements links = table.getElementsByTag("a"); for (Element link: links) {...}
Protože v sekci výběru komodit je zapotřebí nejen název, ale i URL adresa, musíme adresu odkazu uložit do proměnné. Konstanta ConstantsURL.MAIN_ADD_HREF obsahuje řetězec „http://www.agroserver.cz“ a link.attr(„href“) vrací například tento řetězec „/kukurice/chart/39“, takže dohromady vytvoří URL adresu, která je následně poslána do aktivity s již konkrétní komoditou. String url = ConstantsURL.MAIN_ADD_HREF + link.attr("href");
Dále už je pouze ověření, zda se nejedná o duplicitní odkaz, který odkazuje na totožné místo jako název komodity. Tento odkaz se skrývá pod názvem „více“.
Když se
duplicitní odkaz objeví, je jednoduše přeskočen a cyklus pokračuje. Je-li odkaz v pořádku, do proměnné typu URLStringList se uloží již dříve zmíněná url adresa a název komodity, který vrací funkce link.text(). if(link.text().equals(">> více ...")) { continue; } URLStringList urlStringList = new URLStringList (link.text().toUpperCase().toString(),url);
Nakonec je potřeba aktualizovat adaptér, z něhož jsou poté zobrazována data uživateli. protected void onPostExecute(Void result) { SeznamKomoditActivity.adapter1.notifyDataSetChanged(); }
28
8.2.2 Předávání dat další aktivitě a spuštění aktivity V následujícím segmentu kódu je použit Intent, kterému předáme parametry, aktivita, v níž se nacházíme, spouštěná aktivita a dále data v podobě řetězce, který definuje název informace a poté samotná informace. Funkcí startActivity požadovanou aktivitu spustíme a otevřeme na popředí. Intent i = new Intent(SeznamKomoditActivity.this,DetailKomodityActivity.class); URLStringList useURL = (URLStringList)lvKomodity.getItemAtPosition(position); i.putExtra("URLkomodity", useURL.getURL()); i.putExtra("NazevKomodity", useURL.getNazev()); onPause();
V otevřené aktivitě pak extrahujeme předávaná data pomocí následujícího kódu. Bundle extras = getIntent().getExtras(); String URL = extras.getString("URLkomodity"); String nazev = extras.getString("NazevKomodity");
8.2.3 Internet Access Checker V následující ukázce je třída implementující test přístupu k síti a internetu. První metoda testuje pouze konektivitu, kdežto druhá testuje přístup na internet, konkrétně na webový portál Agroserver.cz. public class ConectionChecker { public static boolean isNetworkConnected(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo() != null; }
8.2.4 Automatické přihlašování aplikace Aplikace disponuje automatickým přihlašováním při spuštění aplikace. Přihlašovací jméno a heslo jsou uložené v interface SharedPreferences, kam se obvykle ukládají nastavení aplikace, sdílená data mezi aplikacemi nebo přihlašovací údaje. Všechna tato data jsou uložena v XML souboru.
29
V následující ukázce kódu jsou 3 metody na ukládání, čtení a mazání přihlašovacího jména. Metody jsou identické i pro heslo. static SharedPreferences getSharedPreferences(Context ctx) { return PreferenceManager.getDefaultSharedPreferences(ctx); } public static void setUserName(Context ctx, String userName) { SharedPreferences.Editor editor = getSharedPreferences(ctx).edit(); editor.putString(PREF_USER_NAME, userName); editor.commit(); } public static String getUserName(Context ctx) { return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); } public static void clearUserName(Context ctx) { SharedPreferences.Editor editor = getSharedPreferences(ctx).edit(); editor.clear(); editor.commit(); }
8.2.5 Notifikace Notifikace je obvykle spouštěna ve svém vlastním vlákně, na které nemá vliv běh aplikace, ale v tomto případě tomu je jinak. Notifikace má vlastní vlákno, protože v něm probíhá ověřování nových nabídek a poptávek a tudíž musí notifikace společně s kontrolou být v AnsyncTask vláknu, jak tomu bylo i v předchozích případech. Vlákno spouštěcí notifikaci má nastavitelné zpoždění a uživatel si může čas aktualizace nastavit.
30
9 Závěr Celý projet jsem chtěl pojmout jako reálnou zakázku pro firmu, abych vyzkoušel reálnou komunikaci se zákazníkem a s tím související tvorbu dokumentů, které k projektům obecně patří. Byla vytvořena vize projektu společně s katalogem požadavků.
9.1 Splnění cílů Zadání této práce bylo velice proměnlivé a požadavky nebyly zcela přesně definované od začátku. Jedná se software na míru, který se dynamicky rozvíjel od samého začátku. Byly navrhovány změny v zadání, které měli zásadní vliv na tento problém jako celek. V celém průběhu docházelo k menším změnám a dodefinování požadavků. Primární požadavky zůstali neměnné, jen s mírnými změnami, oproti sekundárním požadavkům, které byly zcela vypuštěny za účelem zjednodušení celé aplikace. Byla zcela vypuštěna sekce, kde uživatel mohl vytvářet nový učet nebo již vytvořený učet modifikovat. Aplikace měla původně obsahovat graf, který měl být grafickou interpretací cen komodit v historii, ale vzhledem k mým zkušenostem s touto platformou byl tento požadavek po souhlasu obou stran předělen do sekce požadavků do budoucna. Metoda parsování HTML se se od začátku jevila jako nepříliš vhodná, ale API v době zadávání a implementace neexistovalo a přímý přístup do databáze není přípustnou možností. Aplikace je nyní funkční a je v určitém rozsahu responzivní v ohledu na strukturu HTML kódu, ale jak tuto hranici překročí, nebude schopna pracovat správně, nemusí data zobrazovat správně nebo přestane fungovat úplně. Naopak se povedlo zjednodušit a zpřehlednit data i přesto, že velikost mobilních zařízení je omezena. Některá nepodstatná data byla vypuštěna nebo převedena formou zobrazení detailů na jinou aktivitu. Tento způsob prezentace dat byl rozhodně přehlednější. Zjistil jsem, že rychlost zobrazení dat velice závisí pouze na rychlosti webového rozhraní. Samotná prezentace a rozdělení do sktruktury zabírá zlomek času. Pokud se tedy DOM stáhne ihned, může aplikace bez jakékoliv prodlevy pracovat.
31
9.2 Problémy a jejich řešení Dočasná funkčnost a nedostatečná rosponzivita metodiky vede k odlišné možnosti řešení tohoto problému. V zadání znělo jasně, že bude použita metoda parsování, ale z objektivního hlediska by tato aplikace fungovala i po změnách při použití Json (JavaScript Object Notation) nebo XML (Extensible Markup Language), což by vedlo k vypuštění HTML vrstvy jako poskytovatele dat, a tudíž by aplikace nemusela reagovat na změny v HTML kódu. [11] Při vývoji na OS Android je nutné veškeré práce se sítí provádět v samostatném vlákně. Je to proto, aby pomalé připojení nezpomalovalo aplikaci nebo ji úplně nezastavilo. S tím to faktem jsem zpočátku nepočítal a poměrně dlouho jsem jej řešil. Notifikace nefunguje v případě, že je aplikace zcela vypnuta. Tento problém by se dal řešit pomocí Deamon procesů, na které nemá vliv běh aplikace, nebo upravit implementaci samotné notifikace.
9.3 Možnosti rozšíření práce Jelikož se jedná o rychlý a přehledný způsob prezentace dat, není nutné přidávat jakoukoliv funkčnost. Do budoucna by mohla aplikace zobrazovat i e-nabídky a epoptávky se zemědělskou technikou, které jsou na webu zobrazeny. Celkový design by mohl využívat více možností vývoje na OS Android. Design působí poněkud zastarale a nevyužívá například dotyk tažením, který vyvolává pocit moderní aplikace. Aplikace reaguje pouze na stisknutí tlačítek či položek v seznamu. Například by aplikace nemusela mít menu v tabulce tlačítek, ale mohla by využít Tab Activity, kde uživatel tažením přepíná mezi obrazovkami. Vytvoření uživatele a jeho případná editace se mi zdá zbytečná. Oproti editaci vlastních e-nabídek/ e-poptávek by jistě přišla vhod.
9.4 Shrnutí Vytvoření této aplikace mi přineslo zkušenosti v oboru, kterým se chci dále zabývat. Vyzkoušet si náplň práce softwarového inženýra bylo jistě přínosem. Ověřil jsem si, že komunikace se zákazníkem je klíčová k úspěšnému dokončení celého projektu.
32
Seznam použité literatury [1] KILIÁN, Karel. Google: Na světě je 1,4 miliardy aktivních zařízení s Androidem. In: Svět Androida [online]. 2015 [cit. 2016-05-03]. Dostupné z: http://www.svetandroida.cz/google-aktivni-zarizeni-201510
[2] HODLOVÁ, Lenka. Web o operačním systému Android. Web o operačním systému Android [online]. 2012 [cit. 2016-04-24]. Dostupné z: http://home.zcu.cz/~hodlova/ [3] Vývoj pro Android. In: ELITEC software [online]. [cit. 2016-05-03]. Dostupné z: http://www.elitecsoftware.cz/vyvoj-pro-android/
[4] Historie verzí Android. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2016-05-03]. Dostupné z: https://cs.wikipedia.org/wiki/Historie_verz%C3%AD_Android
[5] PETŘEK, Pavel. Vývoj pro Android II. Zdroják [online]. 2010 [cit. 2016-04-24]. Dostupné z: https://www.zdrojak.cz/clanky/vyvoj-pro-android-ii/
[6] KONEČNÝ, Matěj. Vyvíjíme pro Android: Notifikace, broadcast receivery a Internet. In: Zdroják.cz [online]. 2012 [cit. 2016-05-03]. Dostupné z: https://www.zdrojak.cz/clanky/vyvijime-pro-android-notifikace-broadcast-receivery-ainternet/
[7] Use DOM methods to navigate a document. HEDLEY, Jonathan. Jsoup [online]. 2016 [cit. 2016-05-07]. Dostupné z: https://jsoup.org/cookbook/extracting-data/domnavigation
[8] HAVEL, Jakub. DOM: objektový model dokumentu. In: Živě [online]. 2002 [cit. 201605-07]. Dostupné z: http://www.zive.cz/clanky/dom--objektovy-model-dokumentu/sc3-a-104999/default.aspx
[9] KRYPTA, Tomáš. Vývoj pro Android: vylepšujeme aktivity. In: ABC Lunuxu [online]. 2011 [cit. 2016-05-07]. Dostupné z: http://www.abclinuxu.cz/clanky/vyvoj-proandroid-vylepsujeme-aktivity Vývoj aplikací pro Android. LACKO, Ľuboslav a Martin HERODEK. Vývoj aplikací pro Android [online]. Brno: Computer Press ve společnosti s ALBATROS MEDIA a.s., 2015, s. 75-76 [cit. 2016-05-07]. ISBN 978-80-251-4347-6. Dostupné z: https://books.google.cz/books?id=JRfqCwAAQBAJ&pg
[10]
33
BÁRTA, Jaromír. Vytvoření aplikace pro platformu Android. Jihlava, 2012. Bakalářská práce. Vysoká škola polytechnická Jihlava. Vedoucí práce Ing. Jiří Mrkvička.
[11]
ZEJDA, Lukáš. Mobilní aplikace portálu agroserver.cz pro OS Android: katalog požadavků. Třebíč, 2015.
[12]
34
Seznam obrázků Obrázek 1 - Architektura Android .................................................................................. 10 Obrázek 2 - životní cyklus aktivity ................................................................................. 12 Obrázek 3 - Use case diagram ........................................................................................ 14 Obrázek 4 - kompletní přehled cen jednotlivých komodit ............................................. 17 Obrázek 5 - nabídka a poptávka ..................................................................................... 18 Obrázek 6 - Class Diagram ............................................................................................. 22 Obrázek 7 - Document Object Model ............................................................................. 24 Obrázek 8 - AVD - tvorba nového virtuálního zařízení ................................................. 25
35
Seznam použitých zkratek OS – Operating Systém – operační systém API – Application Programming Interface – rozhraní s předdefinovanými funkcemi SDK – Software Developement Kit – sada vývojových nástrojů HTML – HyperText Markup Language – značkovací jazyk na tvorbu webu DVM – Dalvik Virtual Machine – virtuální stroj, na kterém běží Android aplikace JVM – Java Virtual Machine – virtuální stroj, na kterém běží Java aplikace DOM – Document Object Model – data uspořádané do struktury stromu CSS – Cascading Style Sheets – jazyk pro popis zobrazení elementů URL – Uniform Resource Locator – řetězec, který slouží k specifikaci umístění zdrojů AVD – Android Virtual Device – virtuální zařízení sloužící k testování aplikací JSON – JavaScript Object Notation – notace k serializaci dat do obecného formátu XML - Extensible Markup Language – markovací jazyk určen k výměně dat
36
10 Obsah přiloženého CD Na přiloženém CD se v kořenovém adresáři nachází tato bakalářská práce ve formátu bakalarska_prace.pdf s jednoduchým návodem navod.txt pro obsluhu programu.
37