Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Diplomov´ a pr´ ace Pokroˇ cil´ e polymorfn´ı aplikace na platformˇ e Android
Plzeˇ n 2015
Milan Nikl
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 25. ˇcervna 2015 Milan Nikl
Abstract This thesis presents the concept of running a polymorphic application on the Android platform. The polymorphic application represents an alternative to the traditional approach of using many single purpose application on an Android device. Instead the device user can change the design of the application interface by selecting a XML pattern file appropriate to the function he wants to use. The polymorphic application also enables running simple programmes on the Android device without need to create a standalone application, which makes the development process much faster. This thesis presents two examples of such programmes - the RSS reader and contact information finder. Both of these programmes present a way of extracting data from an internet source and displaying it to the user in a human readable form meant for the mobile device.
Abstrakt Tato pr´ace pˇredstavuje koncept pouˇzit´ı polymorfn´ı aplikace na platformˇe Android. Polymorfn´ı aplikace umoˇzn ˇuje uˇzivateli vybrat a spustit takovou funkci aplikace, jakou zrovna vyˇzaduje, a k n´ı vybrat odpov´ıdaj´ıc´ı XML soubor s definic´ı uˇzivatelsk´eho rozhran´ı. Polymorfn´ı aplikace rovnˇeˇz pˇredstavuje zp˚ usob, jak pod operaˇcn´ım syst´emem Android spustit jednoduch´e programy bez nutnosti vytv´aˇren´ı samostan´e aplikace, coˇz v´ yznamnˇe urychluje proces v´ yvoje. Tato pr´ace pˇredkl´ad´a dvˇe uk´azky takov´ ych program˚ u - RSS ˇcteˇcku a vyhled´avaˇc kontaktn´ıch informac´ı. Oba programy pˇredstavuj´ı zp˚ usob, jak z´ıskat data z internetov´eho zdroje a zobrazit je v podobˇe vhodn´e jak pro uˇzivatele, tak samotn´e zaˇr´ızen´ı.
Podˇ ekov´ an´ı R´ad bych podˇekoval Ing. Ladislavu Peˇsiˇckovi za obrovskou trpˇelivost a cenn´e rady pˇri veden´ı t´eto pr´ace.
Obsah ´ 1 Uvod
1
2 Polymorfn´ı aplikace 2.1 Opr´avnˇen´ı aplikac´ı . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Pr´ace se zdroji . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Kompatibilita . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 2 3 5
3 Alternativn´ı pˇ r´ıstupy 3.1 Mobiln´ı web . . . . . . . . . . . . 3.1.1 Dostupnost pˇripojen´ı . . . 3.1.2 Responsivn´ı n´avrh . . . . 3.1.3 Interakce s uˇzivatelem . . 3.1.4 HTML5 Aplikace . . . . . 3.2 Hybridn´ı aplikace . . . . . . . . . 3.2.1 WebView aplikace . . . . . 3.2.2 V´ yvoj hybridn´ıch aplikac´ı 3.2.3 Technologick´a omezen´ı . . 3.3 Xamarin . . . . . . . . . . . . . . 3.3.1 Xamarin Forms . . . . . . 3.3.2 Technologick´e v´ yhody . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
7 7 7 9 10 11 11 12 13 14 15 15 16
4 N´ avrh polymorfn´ı aplikace 18 4.1 Princip fungov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.2 Zmˇeny v uˇzivatelsk´em rozhran´ı . . . . . . . . . . . . . . . . . 21 5 Realizace polymorfn´ı aplikace 5.1 Uˇzivatelsk´e rozhran´ı . . . . 5.1.1 Struktura prvk˚ u. . . 5.1.2 Vytv´aˇren´ı prvk˚ u . . ˇ 5.1.3 Sablony rozhran´ı . . 5.1.4 Naˇc´ıt´an´ı fragment˚ u .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
23 23 23 25 26 27
OBSAH 5.2
5.3
OBSAH Pouˇzit´ı knihoven . . . . . . . . . . 5.2.1 Dalvik executable archiv . . 5.2.2 Naˇc´ıt´an´ı archiv˚ u . . . . . . 5.2.3 Obsluha generovan´e aplikace Pr´ace s u ´loˇziˇsti . . . . . . . . . . . 5.3.1 Google Drive . . . . . . . . 5.3.2 Dropbox . . . . . . . . . . .
6 V´ yznamn´ e programov´ eˇ c´ asti 6.1 Bal´ık activity . . . . . . . . 6.1.1 MainActivity . . . . 6.1.2 ChildActivity . . . . 6.2 Bal´ık fragment . . . . . . . 6.3 Bal´ık task . . . . . . . . . . 6.3.1 IOnTaskCompleted . 6.3.2 CopyFileTask . . . . 6.3.3 DownloadFileTask . 6.3.4 DownloadImageTask 6.3.5 DriveFileTask . . . . 6.3.6 ProcessFunctionTask 6.4 Bal´ık type . . . . . . . . . . 6.5 Bal´ık util . . . . . . . . . . 6.5.1 Utilities . . . . . . . 6.5.2 XmlParser . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . .
. . . . . . .
28 29 30 32 33 34 35
. . . . . . . . . . . . . . .
36 36 36 37 39 40 40 40 41 41 42 42 42 43 43 44
7 Uk´ azkov´ e aplikace 48 7.1 Omezen´ı a poˇzadavky . . . . . . . . . . . . . . . . . . . . . . . 49 ˇ cka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 7.2 RSS Cteˇ ˇ 7.3 Kontakty ZCU . . . . . . . . . . . . . . . . . . . . . . . . . . 53 8 Testov´ an´ı aplikace 57 8.1 Pouˇzit´a zaˇr´ızen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . 57 8.2 Aplikace tˇret´ıch stran . . . . . . . . . . . . . . . . . . . . . . . 58 8.3 Publikace aplikace . . . . . . . . . . . . . . . . . . . . . . . . . 58 9 Moˇ znosti dalˇ s´ıho rozˇ s´ıˇ ren´ı 60 9.1 N´avaznost funkc´ı . . . . . . . . . . . . . . . . . . . . . . . . . 60 9.2 Zpracov´an´ı v´ıce fragment˚ u . . . . . . . . . . . . . . . . . . . . 61 10 Z´ avˇ er
62
Literatura
63 5
OBSAH
OBSAH
Seznam zkratek
67
A Opr´ avnˇ en´ı aplikace
70
B Uˇ zivatelsk´ a pˇ r´ıruˇ cka B.1 Instalace aplikace . . . . B.2 Pouˇz´ıv´an´ı aplikace . . . B.3 Vytvoˇren´ı dex archivu . B.4 Pouˇzit´ı extern´ı knihovny
. . . .
71 71 72 74 75
. . . . . . . .
77 77 78 78 79 80 81 82 82
C Prvky uˇ zivatelsk´ eho C.1 Obecn´e vlastnosti C.2 Fragment . . . . C.3 LinearLayout . . C.4 Button . . . . . . C.5 EditText . . . . . C.6 TextView . . . . C.7 CheckBox . . . . C.8 ImageView . . . .
. . . .
. . . .
rozhran´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . .
. . . . . . . .
D Soubory ˇ sablon 83 D.1 RSS ˇcteˇcka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 ˇ D.2 Kontakty ZCU . . . . . . . . . . . . . . . . . . . . . . . . . . 86 D.3 Dalˇs´ı uk´azky . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 E Dalˇ s´ı grafick´ e pˇ r´ılohy E.1 Archivy dex a jar . . . . . . . . . . . . . . . . . . . . . . . . . E.2 Polymorfn´ı aplikace . . . . . . . . . . . . . . . . . . . . . . . . ˇ cka . . . . . . . . . . . . . . . . . . . . . . . . . . . . E.3 RSS Cteˇ
6
89 89 90 94
´ Uvod
´ 1 Uvod C´ılem t´eto diplomov´e pr´ace je prozkoum´an´ı souˇcasn´ ych moˇznost´ı v´ yvoje polymorfn´ıch aplikac´ı na platformˇe Android a jejich praktick´eho pouˇzit´ı. Operaˇcn´ı syst´em Android je v souˇcasn´e dobˇe nejrozˇs´ıˇrenˇejˇs´ı mobiln´ı platformou. Z p˚ uvodn´ıho operaˇcn´ıho syst´emu urˇcen´eho pouze pro mobiln´ı telefony se v souˇcasnosti st´av´a syst´em poh´anˇej´ıc´ı rovnˇeˇz tablety, televizory, nositelnou elektroniku, ale rozˇs´ıˇruje se rovnˇeˇz do automobil˚ u a dalˇs´ıch typ˚ u zaˇr´ızen´ı. Aplikace pro tento syst´em pak bereme jako programy poskytuj´ıc´ı pˇridanou hodnotu dan´eho zaˇr´ızen´ı. Klasick´e aplikace pro OS Android jsou vˇseobecnˇe vn´ım´any jako programy slouˇz´ıc´ı k jednomu u ´ˇcelu. A at’ uˇz vykon´avaj´ı jakoukoli funkci, jedn´a se vˇetˇsinou o specializovan´ y software, kter´ y je svoj´ı funkc´ı rovnˇeˇz sv´az´an a omezen. Uˇzivatel mobiln´ıho zaˇr´ızen´ı je pak zpravidla nucen pouˇz´ıvat aˇz des´ıtky takov´ ych jedno´ uˇcelov´ ych program˚ u. Oproti tomu pˇredstavuje polymorfn´ı aplikace ˇreˇsen´ı, kter´e umoˇzn ˇuje zmˇenu funkcionality programu bez nutnosti instalace dalˇs´ıch aplikac´ı. Jedin´e, co mus´ı uˇzivatel udˇelat, je zvolit ˇsablonu, podle kter´e se dynamicky vytvoˇr´ı funkˇcn´ı program pro dan´ y u ´ˇcel. Tento postup rovnˇeˇz umoˇzn ˇuje spouˇstˇen´ı programov´eho k´odu na mobiln´ım zaˇr´ızen´ı bez nutnosti vyv´ıjet novou, samostatnou, aplikaci. Tato pr´ace si neklade za c´ıl nahradit vˇsechny existuj´ıc´ı aplikace jedn´ım univerz´aln´ım programem, ale popisuje koncept, kter´ y je moˇzn´e vyuˇz´ıt pro vytvoˇren´ı jedin´e aplikace pouˇziteln´e pro vykon´av´an´ı r˚ uzn´ ych funkc´ı.
1
Polymorfn´ı aplikace
2 Polymorfn´ı aplikace Problematikou pouˇzit´ı polymorfn´ıch aplikac´ı se v minul´ ych letech zab´ yvalo jiˇz nˇekolik studentsk´ ych prac´ı, na jejichˇz v´ ysledky tato diplomov´a pr´ace ˇca´steˇcnˇe navazuje. Zat´ımco [Hul12] popisuje moˇznost dynamicky nahr´avat a pˇr´ıpadnˇe mˇenit grafick´e rozhran´ı aplikace bez toho, aby se z´aroveˇ n mˇenila jej´ı funkce, [Sta13] se zab´ yv´a pˇredevˇs´ım moˇznost´ı dynamick´e zmˇeny funkˇcn´ıho k´odu aplikace. Vyuˇz´ıv´a k tomu jak soubory knihoven obsahuj´ıc´ıch r˚ uzn´e sady funkc´ı, ale tak´e moˇznost spuˇstˇen´ı vzd´alen´ ych procedur prostˇrednictv´ım mobiln´ı aplikace. Tato diplomov´a pr´ace pak koncept pˇredstaven´ y ve v´ yˇse uveden´ ych prac´ıch aktualizuje pomoc´ı technologi´ı pouˇz´ıvan´ ych v roce 2015. Polymorfn´ı aplikace rozˇsiˇruje zejm´ena o moˇznosti pouˇzit´ı cloudov´ ych u ´loˇziˇst’ a moˇznost pouˇzit´ı dynamiˇctˇejˇs´ıch grafick´ ych rozhran´ı, kter´a je moˇzn´e ovlivˇ novat i za bˇehu aplikace, nejen pˇri nahr´an´ı pˇr´ısluˇsn´eho pˇredpisu. Nicm´enˇe pr´ace rovnˇeˇz zachov´av´a nˇekter´e principy pˇredstaven´e m´ ymi pˇredch˚ udci. V t´eto kapitole (2) jsou pops´ana pˇredevˇs´ım podstatn´a specifika, omezen´ı a v´ yhody, kter´ ymi se polymorfn´ı aplikace odliˇsuje od bˇeˇznˇe pouˇz´ıvan´ ych program˚ u. N´asleduj´ıc´ı kapitola 3 pak nab´ız´ı srovn´an´ı s nˇekolika dalˇs´ımi souˇcasn´ ymi technologiemi, kter´e se daj´ı pouˇz´ıt k podobn´ ym u ´ˇcel˚ um jako polymorfn´ı aplikace. Kapitola 5 pak popisuje vylepˇsen´ı z hlediska funkcionality a uˇzivatelsk´eho rozhran´ı, kter´e pokroˇcil´e polymorfn´ı aplikace pˇrin´aˇs´ı. Zat´ımco kapitola 7 pˇredkl´ad´a n´avrhy moˇzn´ ych pouˇzit´ı polymorfn´ı aplikace v praxi.
2.1
Opr´ avnˇ en´ı aplikac´ı
Kaˇzd´a aplikace bˇeˇz´ıc´ı na platformˇe Android je sv´az´ana se sadou opr´avnˇen´ı, kter´a m˚ uˇze pˇri sv´e funkci vyuˇz´ıvat. Mezi opr´avnˇen´ı patˇr´ı napˇr´ıklad zjiˇst’ov´an´ı stavu pˇripojen´ı, moˇznost z´apisu do pamˇeti zaˇr´ızen´ı, pr´ace s identitou uˇzivatele a dalˇs´ı. Pr´aci s opr´avnˇen´ımi popisuje podrobnˇe [Asp15]. U klasick´e aplikace je v´ yˇcet jej´ıch jednotliv´ ych opr´avnˇen´ı obsaˇzen v tzv. Manifestu aplikace, jednotliv´a opr´avnˇen´ı a jejich pouˇzit´ı shrnuje [Amp15]. Pˇri 2
Polymorfn´ı aplikace
Pr´ace se zdroji
instalaci aplikace pak uˇzivatel mus´ı potvrdit, zda souhlas´ı s t´ım, ˇze aplikace bude vyuˇz´ıvat dan´ ych opr´avnˇen´ı pˇri sv´em bˇehu. Polymorfn´ı aplikace maj´ı nev´ yhodu v tom, ˇze jejich ˇcinnost nen´ı pˇri instalaci pˇredem zn´ama. Nen´ı tak jednoduch´e urˇcit, jak´a opr´avnˇen´ı bude aplikace potˇrebovat. Nelze automaticky povolit vˇsechna opr´avnˇen´ı, protoˇze by takov´e ploˇsn´e povolen´ı mohlo b´ yt zdrojem bezpeˇcnostn´ıch rizik. Proto je vhodn´e omezit opr´avnˇen´ı aplikace pouze na nejnutnˇejˇs´ı nutn´e funkce. Ale pak nutnˇe nar´aˇz´ıme na fakt, ˇze polymorfn´ı aplikace bude omezovat opr´avnˇen´ı v n´ı bˇeˇz´ıc´ıch aplikac´ı pˇr´ıliˇs. Seznam opr´avnˇen´ı polymorfn´ı aplikace vytvoˇren´e v r´amci t´eto diplomov´e pr´ace je uveden´ y v pˇr´ıloze A i s patˇriˇcn´ ymi vysvˇetlen´ımi, k ˇcemu je dan´a funkce nutn´a. Ve struˇcnosti uvedu jen to, ˇze veˇsker´a opr´avnˇen´ı souvisej´ıc´ı pˇr´ımo s placen´ ymi sluˇzbami (napˇr. Uskuteˇcn ˇov´an´ı hovor˚ u, odes´ıl´an´ı textov´ ych zpr´av a prov´adˇen´ı finanˇcn´ıch transakc´ı). Bezpeˇcnostn´ı riziko m˚ uˇze rovnˇeˇz pˇredstavovat i z´asah do soukrom´ı uˇzivatele zaˇr´ızen´ı. Pokud si aplikace ˇza´d´a takov´a opr´avnˇen´ı, kter´a oˇcividnˇe nesouvis´ı s jej´ı funkc´ı, je to nanejv´ yˇs podezˇrel´e. Spoleˇcnost Google1 , tv˚ urce platformy Android, si je tohoto probl´emu vˇedoma, a proto v n´asleduj´ıc´ı verzii syst´emu, v preview verzi oznaˇcen´e jako Android M, bude syst´em pr´ace s opr´avnˇen´ımi pˇrepracov´an. Uˇzivatel bude moci jednotliv´a opr´avnˇen´ı potvrdit jak pˇri instalaci aplikace, tak je pozdˇeji povolit, ˇci zak´azat dle potˇreby v nastaven´ı zaˇr´ızen´ı, jak uv´ad´ı [Gio15]. Z hlediska polymorfn´ıch aplikac´ı se jedn´a o v´ yznamnou zmˇenu, kter´a nastaven´ı opr´avnˇen´ı aplikace znaˇcnˇe zjednoduˇsuje.
2.2
Pr´ ace se zdroji
Aplikace vytvoˇren´e pro OS Android pracuj´ı s nˇekolika typy zdroj˚ u (Resources), kter´e podrobnˇeji popisuje [Art15]. Nejv´ yznamnˇejˇs´ı pouˇz´ıvan´e zdroje jsou: • Drawable - Grafick´e zdroje, napˇr. obr´azky nebo definice geometrick´ ych tvar˚ u pouˇzit´ ych v rozhran´ı aplikace; 1
V´ıce o spoleˇcnosti na: https://www.google.com/about/company/
3
Polymorfn´ı aplikace
Pr´ace se zdroji
• Layout - Rozloˇzen´ı element˚ u grafick´eho rozhran´ı, umoˇzn ˇuje staticky definovat vzhled vybran´e obrazovky v aplikaci nebo jej´ıch souˇca´st´ı; • String - Textov´e prvky slouˇz´ıc´ı jako popisky, n´avody, upozornˇen´ı atd. Pˇri v´ yvoji klasick´e aplikace pro OS Android je moˇzn´e zdroje oddˇelit od samotn´eho k´odu aplikace a n´aslednˇe pouˇz´ıt relativn´ı reference na dan´ y zdroj v projektu aplikace, jak pˇribliˇzuje [Aar15]. Kromˇe toho, ˇze slouˇz´ı zdroje k vytv´aˇren´ı kvalitnˇejˇs´ıho n´avrhu aplikace a zjednoduˇsuj´ı pr´aci program´atorovi, maj´ı vyuˇzit´ı zejm´ena pˇri pˇrizp˚ usoben´ı aplikace aktu´aln´ım potˇreb´am zaˇr´ızen´ı uˇzivatele. Textov´e zdroje (String) umoˇzn ˇuj´ı lokalizaci aplikace do r˚ uzn´ ych jazyk˚ u. V samotn´em k´odu aplikace je pouˇzita pouze jedna reference, kter´a je spoleˇcn´a libovoln´emu poˇctu jazykov´ ych mutac´ı souboru obsahuj´ıc´ımu samotn´e texty. Dle potˇreby je pak moˇzn´e mezi jazyky libovolnˇe pˇrep´ınat za chodu aplikace. Grafick´e zdroje (Drawable) pak zajiˇst’uj´ı uzp˚ usoben´ı grafick´eho vzhledu aplikace podle parametr˚ u displeje zaˇr´ızen´ı, na kter´em aplikace bˇeˇz´ı. Obdobnˇe jako u textov´ ych zdroj˚ u je pouˇzit jeden spoleˇcn´ y odkaz a pˇri naˇcten´ı dan´e obrazovky aplikace se vybere nejvhodnˇejˇs´ı varianta dle natoˇcen´ı zaˇr´ızen´ı, pomˇeru stran obrazovky atd. Pˇri vytv´aˇren´ı polymorfn´ı aplikace lze ale pracovat se zdroji pouze v r´amci samotn´e mateˇrsk´e aplikace. Jednotliv´e generovan´e aplikace totiˇz nemaj´ı pˇrehled o tom, jak´e zdroje jsou v aplikaci definov´any. A i kdyˇz by, ˇcistˇe technicky vzato, bylo moˇzn´e referencovat zdroje definovan´e v polymorfn´ı aplikaci, jednalo by se o zcela nevhodn´ y pˇr´ıstup ke tvorbˇe aplikace. Princip polymorfismu stoj´ı na faktu, ˇze jednotliv´e generovan´e aplikace maj´ı logiku omezenou pouze na jejich funkci a nemohou tedy poˇc´ıtat, nebo dokonce zach´azet, s prvky entity vyˇsˇs´ı u ´rovnˇe. Bohuˇzel nen´ı moˇzn´e soubor zdroj˚ u rozˇsiˇrovat za bˇehu aplikace, nebot’ prov´az´an´ı aplikace se zdroji prob´ıh´a pˇri kompilaci aplikace. Za bˇehu aplikace je tedy moˇzn´e vybrat nejvhodnˇejˇs´ı zdroj z pˇredem stanoven´e mnoˇziny, nicm´enˇe nelze rozsah t´eto mnoˇziny mˇenit.
4
Polymorfn´ı aplikace
2.3
Kompatibilita
Kompatibilita
Dle [Gio15] pouˇz´ıv´a platfromu Android pˇribliˇznˇe 4000 typ˚ u zaˇr´ızen´ı. Pomineme-li syst´emy typu Android TV, Android Wear, Android Auto a budeme-li br´at v potaz pouze mobiln´ı zaˇr´ızen´ı, zjist´ıme, ˇze i tak je platforma Android rozdrobena do mnoha verz´ı operaˇcn´ıho syst´emu. V tabulce 2.1 jsou vyps´any nejpouˇz´ıvanˇejˇs´ı z nich: Verze Oznaˇ cen´ı 2.2
Froyo
2.3.x
API Pod´ıl 8
0.3%
Gingerbread
10
5.6%
4.0.x
Ice Cream Sandwich
15
5.1%
4.1.x 4.2.x 4.3
Jelly Bean
16 17 18
14.7% 17.5% 5.2%
4.4
KitKat
19
39.2%
5.0 5.1
Lollipop
21 22
11.6% 0.8%
Tabulka 2.1: Verze platformy Android, zdroj: [Apf15] V tabulce 2.1 je n´azornˇe vidˇet, ˇze kaˇzd´a nov´a verze operaˇcn´ıho syst´emu Android pˇrich´az´ı s nov´ ym API2 . Dle rozsahu zmˇen v dan´em API se pak mˇen´ı odpov´ıdaj´ıc´ım zp˚ usobem i ˇc´ıslo verze syst´emu. Verze operaˇcn´ıho syst´emu Android M nebyla do tabulky zanesena, nebot’ zat´ım nen´ı k dispozici ofici´aln´ı vyd´an´ı tohoto syst´emu, ani nen´ı zn´amo jeho oznaˇcen´ı. Vˇetˇsinou nov´e API pˇrin´aˇs´ı nov´e prvky uˇzivatelsk´eho rozhran´ı, zjednoduˇsen´ y pˇr´ıstup k nˇekter´ ym funkc´ım telefonu a podobn´e funkce. Pˇri tvorbˇe aplikace pro platformu Android je tˇreba v manifestu aplikace specifikovat nejniˇzˇs´ı moˇznou verzi API, na kter´e bude moˇzn´e aplikaci provozovat. Zvolen´e verzi syst´emu pak mus´ı b´ yt podˇr´ızeny vˇsechny funkce tak, aby byla zachov´ana kompatibilita aplikace. U polymorfn´ı aplikace m´a volba dalˇs´ı logick´ y d˚ usledek - kromˇe samotn´e polymorfn´ı aplikace mus´ı b´ yt vybran´emu API podˇr´ızeny i jednotliv´e generovan´e aplikace, kter´e budou polymorfn´ı aplikaci vyuˇz´ıvat pro sv˚ uj chod. 2
Application Programming Interface - rozhran´ı pro programov´an´ı aplikac´ı
5
Polymorfn´ı aplikace
Kompatibilita
Pro platformu Android je k dispozici tzv. Support Library - knihovna, kter´a zajiˇst’uje zpˇetnou kompatibilitu aplikac´ı. V praxi je tak napˇr´ıklad umoˇznˇeno pouˇzit´ı prvk˚ u grafick´eho rozhran´ı na starˇs´ı verzi API, neˇz pro kterou byly tyto prvky vytvoˇreny. T´ım je ve v´ ysledku dosaˇzeno jednotn´eho vizu´aln´ıho stylu aplikace napˇr´ıˇc r˚ uzn´ ymi verzemi syst´emu Android. Pouˇzit´ı a obsah Support Library popisuje [Asl15]. Pˇri pouˇzit´ı Support Library se ukazuje dalˇs´ı pozitivum polymorfn´ıch aplikac´ı. U klasick´ ych aplikac´ı, kter´e vyuˇz´ıvaj´ı jak´ekoli funkce ˇci prvky z kolekce Support Library, mus´ı b´ yt tako knihovna souˇca´st´ı projektu a tedy i v´ ysledn´e aplikace, coˇz m´a n´aslednˇe vliv na v´ yslednou velikost aplikace. Pokud bychom mˇeli takov´ ych aplikac´ı v´ıce (napˇr. 10) a kaˇzd´a z nich by pouˇz´ıvala Support Library (soubor o velikosti 1,5 MB), znamenalo by to mnohem v´ıce pamˇeti zaˇr´ızen´ı zabran´e instalaˇcn´ımi soubory (10 * 1.5 MB = 15 MB m´ısta v pamˇeti). V dneˇsn´ı dobˇe se sice v´ ykonov´e parametry mobiln´ıch zaˇr´ızen´ı neust´ale zvyˇsuj´ı, nicm´enˇe velikost pamˇeti zaˇr´ızen´ı je vˇzdy o nˇeco menˇs´ı, neˇz by bylo potˇreba, at’ je jak´akoli. Polymorfn´ı aplikace, kter´a implementuje maximum knihoven pouze jednou, tak pˇrin´aˇs´ı v´ıtanou u ´sporu m´ısta v zaˇr´ızen´ı.
6
Alternativn´ı pˇr´ıstupy
3 Alternativn´ı pˇr´ıstupy V n´asleduj´ıc´ı kapitole jsou pops´ana ˇreˇsen´ı, kter´a umoˇzn ˇuj´ı oproti klasick´ ym mobiln´ım aplikac´ım snadnˇejˇs´ı zmˇenu obsahu prezentovan´eho uˇzivateli mobiln´ıho zaˇr´ızen´ı, nebo pouˇz´ıvaj´ı jin´e technologie, kter´ ymi se podobaj´ı polymorfn´ım aplikac´ım. Nˇekter´a ˇreˇsen´ı by pˇritom mohla pˇri vhodn´em pouˇzit´ı polymorfn´ı aplikaci zcela nahradit. Jednotliv´e ˇca´sti t´eto kapitoly pak popisuj´ı oblasti, ve kter´ ych dan´a ˇreˇsen´ı oproti polymorfn´ı aplikaci ztr´ac´ı, ale rovnˇeˇz i atributy, kter´ ymi polymorfn´ı aplikaci pˇredˇc´ı.
3.1
Mobiln´ı web
Pˇr´ıstup k internetu je jednou z hlavn´ıch vlastnost´ı tzv. chytr´ ych telefon˚ u. Mnoˇzstv´ı uˇzivatel˚ u, kter´e pouˇz´ıvaj´ı pro prohl´ıˇzen´ı webu1 prim´arnˇe sv´e mobiln´ı zaˇr´ızen´ı, se samozˇrejmˇe liˇs´ı dle ekonomick´ ych, technick´ ych i soci´aln´ıch faktor˚ u vybran´e zemˇe. Napˇr´ıklad [Ceb14] uv´ad´ı, ˇze zem´ı s nejvyˇsˇs´ı m´ırou pˇr´ıstupu k internetu pomoc´ı mobiln´ıch zaˇr´ızen´ı je s 99% Keˇ na, zat´ımco zem´ı s nejvˇetˇs´ım zastoupen´ım chytr´ ych telefon˚ u (oproti jin´ ym zaˇr´ızen´ım) je Nig´erie s 66%. Obecnˇe je pak moˇzn´e ˇr´ıci, ˇze pod´ıl webov´eho obsahu konzumovan´eho uˇzivateli na mobiln´ıch zaˇr´ızen´ıch oproti pouˇz´ıv´an´ı klasick´ ych osobn´ıch poˇc´ıtaˇc˚ u se kaˇzdoroˇcnˇe zvyˇsuje, a oblast mobiln´ıho webu bude i nad´ale r˚ ust na v´ yznamu. Zat´ımco ˇc´ısla z pˇredchoz´ıho odstavce pˇredstavuj´ı bezesporu zaj´ımav´e srovn´an´ı, n´asleduj´ıc´ı odstavce jsou zamˇeˇreny na nejvˇetˇs´ı specifika vyuˇz´ıt´ı mobiln´ıho webu.
3.1.1
Dostupnost pˇ ripojen´ı
Aby bylo moˇzn´e vyuˇz´ıvat pˇripojen´ı k internetu na mobiln´ım zaˇr´ızen´ı, je tˇreba pokryt´ı mobiln´ım sign´alem v dostateˇcn´e m´ıˇre a kvalitˇe. Pˇripojen´ı pomoc´ı lok´aln´ı bezdr´atov´e s´ıtˇe lze samozˇrejmˇe povaˇzovat za v´ yhodu, nicm´enˇe je to 1
zkr. z World Wide Web - angl. pro celosvˇetov´a s´ıt’
7
Alternativn´ı pˇr´ıstupy
Mobiln´ı web
pr´avˇe pˇripojen´ı k internetu kdykoli a kdekoli, co odliˇsuje mobiln´ı zaˇr´ızen´ı od osobn´ıch poˇc´ıtaˇc˚ u. V souˇcasnosti je pak synonymem pro rychl´e pˇripojen´ı tzv. standard 4G pˇredstavovan´ y technologi´ı LTE 2 . ˇ e Tabulka 3.1 pak zn´azorˇ nuje aktu´aln´ı u ´roveˇ n pokryt´ı LTE sign´alem v Cesk´ republice. Pro u ´plnost je vˇsak nutn´e zm´ınit, ˇze 4G zaˇr´ızen´ı nejsou v souˇcasn´e dobˇe zdaleka tak rozˇs´ıˇren´a, aby mohl v´ yhod LTE pˇripojen´ı vyuˇz´ıvat kaˇzd´ y. Mnohem ˇcastˇeji doch´az´ı k tomu, ˇze je uˇzivatel omezen rychlost´ı pˇripojen´ı starˇs´ı verze 3G, a v nˇekter´ ych lokalit´ach jeˇstˇe pomalejˇs´ım 2G. Moˇznost stahovat do aplikace pouze skuteˇcnˇe potˇrebn´ y obsah tak m˚ uˇze b´ yt pro mnoho uˇzivatel˚ u v´ yznamn´ ym pˇr´ınosem polymorfn´ı aplikace. Oper´ ator Pokryt´ı u ´ zem´ı Pokryt´ı obyvatel O2
82,2%
95,3%
T-Mobile
82,2%
95,2%
Vodafone
83,0%
96,4%
ˇ kombinovan´ Tabulka 3.1: Pokryt´ı CR ym sign´alem LTE (4G) a HSPA+ (3G), zdroj: [Ctu15] Zat´ımco mobiln´ı aplikace funguj´ıc´ı bez pˇripojen´ı k internetu (offline) je ve vˇetˇsinˇe pˇr´ıpad˚ u v´ yhodou, protoˇze m˚ uˇze napˇr´ıklad znamenat i vyˇsˇs´ı u ´sporu baterie mobiln´ıho zaˇr´ızen´ı, velk´a vˇetˇsina aplikac´ı pouˇz´ıv´a pˇripojen´ı k internetu pro sv˚ uj chod stejnˇe jako mobiln´ı web. Pˇripojen´ı je nutnost´ı zejm´ena v pˇr´ıpadech, kdy je nutn´e komunikovat se vzd´alenou datab´az´ı, kontrolovat a pracovat s nejaktu´alnˇejˇs´ım obsahem, ˇci prov´adˇet ovˇeˇren´ı totoˇznosti uˇzivatele. Pokud aplikace takov´e funkce vyuˇz´ıv´a, pˇribliˇzuje se webov´emu ˇreˇsen´ı, a to zejm´ena ve sv´em n´avrhu. Subjekt, kter´ y uvaˇzuje o vytvoˇren´ı aplikace pro svoji propagaci, ˇci pro vytvoˇren´ı kontaktu a zprostˇredkov´an´ı sluˇzeb uˇzivateli, zpravidla m´ıv´a pro podobn´ yu ´ˇcel vytvoˇren´e st´avaj´ıc´ı ˇreˇsen´ı na b´azi webov´ ych str´anek. Dle funkc´ı, kter´e jsou od aplikace vyˇzadov´any, je pak rozhodov´ano o jej´ım pˇr´ıpadn´em vytvoˇren´ı. Pokud nen´ı vyˇzadov´ana vysok´a m´ıra interakce s uˇzivatelem (viz ˇca´st 3.1.3) nebo speci´aln´ı funkcionalita, lze aplikaci nahradit mobiln´ım webem, jak uv´ad´ı [Sum15]. Takov´e ˇreˇsen´ı m˚ uˇze znamenat v´ yznamnou finanˇcn´ı u ´sporu zejm´ena pro mal´e subjekty. 2
3GPP Long Term Evolution - Dlouhodobˇe rozv´ıjen´ y standard skupiny 3GPP
8
Alternativn´ı pˇr´ıstupy
3.1.2
Mobiln´ı web
Responsivn´ı n´ avrh
Responzivn´ı, neboli pˇrizp˚ usobiteln´ y n´avrh webov´ ych str´anek zajiˇst’uje, ˇze se dan´a str´anka spr´avnˇe zobraz´ı na displej´ıch r˚ uzn´e velikosti. V praxi to pak znamen´a, ˇze uˇzivatel se dostane k vybran´emu obsahu bez ohledu na to, zda k prohl´ıˇzen´ı vyuˇz´ıv´a poˇc´ıtaˇc, mobiln´ı telefon ˇci televizor. N´azorn´ y pˇr´ıklad je k vidˇen´ı na obr´azku 3.1.
Obr´azek 3.1: Responsive web design, zdroj: [Srr14] Jeden z prvn´ıch n´avrh˚ u responzivn´ıho webu pˇredstavil [Mar10] a jeˇstˇe pˇred nˇekolika lety byl responsivn´ı design v´ ysadou nˇekolika vybran´ ych str´anek, dnes je povaˇzov´an za samozˇrejmost u vˇsech novˇe vytvoˇren´ ych web˚ u. Pro tvorbu responsivn´ı webov´e str´anky je moˇzn´e pouˇz´ıt v´ıce n´avrh˚ u, kter´e podrobnˇe popisuje [W3r15]. V dneˇsn´ı dobˇe je pouˇzit´ı mobiln´ıho webu usnadnˇeno i t´ım, ˇze webov´ y obsah je v´ıce standardizov´an a rozd´ıly mezi jednotliv´ ymi prohl´ıˇzeˇci na u ´rovni zobrazen´ı se do velk´e m´ıry eliminovaly. V´ yhodou pouˇzit´ı mobiln´ıho webu je i velk´a rozˇs´ıˇrenost n´astroj˚ u pro tvorbu webu. Spoleˇcnost Wordpress.com je nejvˇetˇs´ım poskytovatelem n´astroj˚ u pro spr´avu webu. Podle u ´daj˚ u [W3t15] je pr´avˇe n´astroj wordpress v 60,4% pˇr´ıpad˚ u vybran´ ym n´astrojem pro spr´avu webu. Coˇz ve v´ ysledku znamen´a, ˇze 24% vˇsech webov´ ych str´anek pouˇz´ıv´a zm´ınˇen´e ˇreˇsen´ı. Dle [Wpc15] tedy staˇc´ı pouze vybrat jednu ze ˇsablon pro n´avrh webu a vytvoˇrit cel´e ˇreˇsen´ı takzvanˇe na kl´ıˇc. Zat´ımco vytv´aˇren´ı klasick´e mobiln´ı aplikace pˇredstavuje pomˇernˇe n´aroˇcn´ y proces, vytv´aˇren´ı d´ılˇc´ıch aplikac´ı pro polymorfn´ı aplikaci tento proces ponˇekud zjednoduˇsuje. Nicm´enˇe se ani tak nem˚ uˇze vyrovnat jednoduch´emu n´avrhu webu pomoc´ı jiˇz pˇripraven´ ych ˇsablon a komponent. Nav´ıc m´a takov´ y 9
Alternativn´ı pˇr´ıstupy
Mobiln´ı web
web v´ yznamnou v´ yhodu v tom, ˇze nen´ı v´az´an na ˇza´dnou platformu a vytvoˇren´ım jednoho ˇreˇsen´ı je moˇzn´e poˇzadovan´ y obsah rozˇs´ıˇrit mezi vˇetˇs´ı z´akladnu uˇzivatel˚ u.
3.1.3
Interakce s uˇ zivatelem
Hlavn´ım d˚ uvodem pro pouˇzit´ı mobiln´ıho n´avrhu je fakt, ˇze nab´ız´ı jednotnou prezentaci obsahu uˇzivatel˚ um za pouˇzit´ı jednoduch´ ych programovac´ıch technik a komponent. Pomineme-li nutnost b´ yt neust´ale online pro zpˇr´ıstupnˇen´ı tohoto obsahu (viz ˇca´st 3.1.1), m´a webov´e ˇreˇsen´ı i jednu pomˇernˇe negativn´ı str´anku - moˇznosti a kvalita interakce s uˇzivatelem jsou u webu ponˇekud omezen´e. Mobiln´ı web ze sv´e podstaty vyuˇz´ıv´a architekturu typu Request - Response 3 . Jedn´a se tedy o komunikaci dvou zaˇr´ızen´ı, na kter´e se projevuje komunikaˇcn´ı zpoˇzdˇen´ı. Aby mohlo mobiln´ı zaˇr´ızen´ı zobrazit webov´ y obsah, mus´ı ho nejprve st´ahnout a naˇc´ıst. Rozˇs´ıˇren´ı rychl´eho mobiln´ıho pˇripojen´ı tuto nev´ yhodu do velk´e ˇca´sti odstraˇ nuje, nelze ji vˇsak eliminovat u ´plnˇe. Mobiln´ı zaˇr´ızen´ı nemaj´ı bˇeˇznˇe k dispozici n´astroj v podobˇe kurzoru, takˇze na mobiln´ıch zaˇr´ızen´ıch nelze pouˇz´ıt CSS4 selektor :hover 5 . Je proto br´at ohled na toto omezen´ı a vytvoˇrit takov´ y n´avrh str´anek, aby se v nˇem uˇzivatel dok´azal snadno zorientovat i bez pomoci polohovac´ıho zaˇr´ızen´ı. Dalˇs´ı nev´ yhodou je fakt, ˇze aplikace prohl´ıˇzeˇce, ve kter´e se obsah zobrazuje, nem˚ uˇze spolupracovat s ostatn´ımi aplikacemi ˇci funkcemi na dan´em mobiln´ım zaˇr´ızen´ı tak snadno, jako klasick´a mobiln´ı aplikace. Synchronizace s uˇzivatelsk´ ymi u ´ˇcty vybran´ ych sluˇzeb lze prov´est vˇetˇsinou i pomoc´ı prohl´ıˇzeˇce. Ale oproti spolupr´aci na u ´rovni dvou aplikac´ı jsou moˇznosti webov´eho pˇrihl´aˇsen´ı zpravidla omezenˇejˇs´ı a obvykle i m´enˇe uˇzivatelsky pˇr´ıvˇetiv´e. Zcela znemoˇznˇen´a je pak napˇr´ıklad pr´ace s fotoapar´atem zaˇr´ızen´ı, kontakty, kalend´aˇrem, nebot’ webov´a str´anka postr´ad´a potˇrebn´a opr´avnˇen´ı pro pˇr´ıstup k osobn´ım informac´ım uˇzivatele na zaˇr´ızen´ı. Problematikou uˇzivatelsk´eho pohodl´ı mobiln´ıho webu se rovnˇeˇz zab´ yv´a spoleˇcnost Google, kter´a v budouc´ı verzi operaˇcn´ıho syst´emu Android M ˇ adost - Odezva z angl. pro Z´ Cascading Style Sheets - angl. pro Kask´adov´e styly, http://www.w3.org/Style/CSS/ 5 poloˇzka nach´ azej´ıc´ı se pod kurzorem - viz http://www.w3schools.com/cssref/sel_ hover.asp 3
4
10
Alternativn´ı pˇr´ıstupy
Hybridn´ı aplikace
hodl´a pˇredstavit v´ yznamn´a vylepˇsen´ı. Z [Iwa15] vypl´ yv´a, ˇze prohl´ıˇzeˇc na platformˇe Android se bude chovat pˇri vhodn´em nastaven´ı jako mobiln´ı aplikace. Budou tedy rozˇs´ıˇreny moˇznosti interakce s dalˇs´ımi aplikacemi instalovan´ ymi na mobiln´ım zaˇr´ızen´ı a rozd´ıl mezi mobiln´ı aplikac´ı a mobiln´ım webem se opˇet o nˇeco zmenˇs´ı. Nicm´enˇe takov´e ˇreˇsen´ı je v´az´ano nejen na specifickou platformu, ale dokonce na konkr´etn´ı prohl´ıˇzeˇc a rovnˇeˇz mu bude muset b´ yt pˇrizp˚ usobena i zobrazovan´a webov´a str´anka, takˇze nelze hovoˇrit o ploˇsn´em ˇreˇsen´ı.
3.1.4
HTML5 Aplikace
Pro u ´plnost uv´ad´ım, ˇze kromˇe pojmu mobiln´ı web se lze setkat rovnˇeˇz s oznaˇcen´ım HTML5 6 aplikace. V takov´em pˇr´ıpadˇe se jedn´a o mobiln´ı webovou str´anku upravenou do takov´e podoby, ˇze je takˇrka k nerozezn´an´ı od klasick´e aplikace. Nicm´enˇe jde st´ale o k´od vykon´avan´ y v prohl´ıˇzeˇci. Takov´e oznaˇcen´ı se v nˇekter´ ych pˇr´ıpadech pouˇz´ıv´a i pro mobiln´ı web. Jist´ ym propojen´ım obou technologi´ı mohou b´ yt tzv. instalovateln´e webov´e aplikace, kter´e popisuje [Iwa15]. Propojen´ı webov´e aplikace a samotn´eho zaˇr´ızen´ı je zv´ yˇseno do takov´e m´ıry, ˇze uˇzivatel v˚ ubec nepozn´a, ˇze aplikace bˇeˇz´ı v prohl´ıˇzeˇci. Nav´ıc je moˇzn´e takov´e aplikace instalovat“ do zaˇr´ızen´ı tak, ˇze ” se v zaˇr´ızen´ı vytvoˇr´ı odkaz na danou aplikaci a rovnˇeˇz ikona pro spuˇstˇen´ı jako u klasick´ ych apikac´ı. Nicm´enˇe se v souˇcasnosti jedn´a o koncept pˇredstaven´ y v r´amci budouc´ıho v´ yvoje platformy Android. A jak´ekoli hodnocen´ı tohoto n´avrhu by prob´ıhalo zcela v rovinˇe spekulac´ı.
3.2
Hybridn´ı aplikace
Hybridn´ı aplikace pˇredstavuj´ı zejm´ena z vizu´aln´ıho hlediska mezistupeˇ n mezi klasickou aplikac´ı a mobiln´ım webem. Z hlediska n´avrhu je lze rozdˇelit do dvou skupin: 6
HyperText Markup Language - angl. pro Hypertextov´ y znaˇckovac´ı jazyk, specifikace dostupn´ a na http://www.w3.org/TR/html5/
11
Alternativn´ı pˇr´ıstupy
Hybridn´ı aplikace
1. WebView aplikace - tzn. takov´e aplikace, kter´e vyuˇz´ıvaj´ı intern´ıho prohl´ıˇzeˇce k zobrazen´ı obsahu. Takov´ ymi aplikacemi se zab´ yvaj´ı n´asleduj´ıc´ı odstavce. 2. Kompilovan´ e aplikace - aplikace, kter´e jsou vytvoˇreny v jin´em neˇz nativn´ım7 programovac´ım jazyce vybran´e platformy a jsou n´aslednˇe zkompilov´any do nativn´ıho k´odu dan´e platformy. Pˇr´ıklad takov´eho ˇreˇsen´ı je pops´an v ˇc´asti 3.3. Schematick´e porovn´an´ı nativn´ıch, hybridn´ıch a webov´ ych aplikac´ı je zn´azornˇeno na obr´azku 3.2.
Obr´azek 3.2: Nativn´ı aplikace, WebView aplikace a mobiln´ı web
3.2.1
WebView aplikace
Webview aplikace jsou postaveny na technologi´ıch HTML5 a CSS3. Takov´e aplikace obvykle pouˇz´ıvaj´ı jazyk JavaScript8 pro obsluhu ud´alost´ı a jako rozhran´ı s API platformy. WebView obsah je pak obalen pomoc´ı rozhran´ı klasick´e aplikace, takˇze z hlediska operaˇcn´ıho syst´emu se WebView aplikace nijak v´ yznamnˇe neliˇs´ı. 7
pˇrirozen´em, z lat. nativus specifikace dostupn´ a na: http://www.ecma-international.org/publications/ standards/Ecma-262.htm 8
12
Alternativn´ı pˇr´ıstupy
Hybridn´ı aplikace
Pro vyuˇzit´ı WebView aplikace existuje ˇrada d˚ uvod˚ u. Hlavn´ı z nich pˇredstavuje znovupouˇzitelnost k´odu, kter´ y m˚ uˇze b´ yt spoleˇcn´ y napˇr´ıˇc platformami. Pro kaˇzd´ y operaˇcn´ı syst´em se pˇrizp˚ usob´ı logika aplikace, nicm´enˇe vizu´aln´ı str´anka z˚ ustane zachov´ana. To umoˇzn ˇuje jednak zpˇr´ıstupnˇen´ı totoˇzn´eho obsahu a sluˇzeb vˇetˇs´ı z´akladnˇe uˇzivatel˚ u, ale tak´e urˇcitou u ´sporu pˇri vytv´aˇren´ı aplikace. Oproti mobiln´ımu webu je maximum obsahu aplikace uloˇzeno pˇr´ımo v zaˇr´ızen´ı uˇzivatele. Pˇri bˇehu aplikace pak doch´az´ı pouze k vykreslov´an´ı samotn´eho obsahu, ale eliminuje se vˇetˇsina komunikace se vzd´alen´ ym serverem ˇci datab´az´ı. Vˇetˇsina funkc´ı aplikace pˇritom vyuˇz´ıv´a v´ ypoˇcetn´ı v´ ykon samotn´eho mobiln´ıho zaˇr´ızen´ı, coˇz umoˇzn ˇuje vytv´aˇren´ı komplexnˇejˇs´ıch rozhran´ı i program˚ u. Odstranˇen´ım nadbyteˇcn´e komunikace se tak´e zrychluje odezva na akce uˇzivatele, nebot’ nen´ı nutn´e ˇcekat na odpovˇed’ serveru.
3.2.2
V´ yvoj hybridn´ıch aplikac´ı
V´ yhodou hybridn´ıch aplikac´ı b´ yv´a vyuˇzit´ı nˇekter´eho z existuj´ıc´ıch framewor9 k˚ u pro tvorbu rozhran´ı. To umoˇzn ˇuje jednak rychlejˇs´ı tvorbu aplikac´ı danou t´ım, ˇze se pracuje hlavnˇe s grafickou str´ankou vyuˇz´ıvaj´ıc´ı technologie bˇeˇzn´e pro webov´e str´anky. Oproti klasick´emu postupu pˇri vytv´aˇren´ı aplikac´ı, popsan´emu napˇr´ıklad v [Lac15]. Tento pˇr´ıstup tak´e do velk´e m´ıry sniˇzuje poˇzadavky na v´ yvoj´aˇre aplikace, co se t´ yk´a znalost´ı konkr´etn´ı platformy. Pro nˇekter´e spoleˇcnosti m˚ uˇze b´ yt rovnˇeˇz motivuj´ıc´ı pouˇzit´ı levnˇejˇs´ı pracovn´ı s´ıly. Avˇsak hlavn´ım ziskem oproti v´ yvoji nativn´ıch aplikac´ı z˚ ust´av´a ˇcasov´a u ´spora pˇri v´ yvoji, jak uv´ad´ı [Bmp13] spoleˇcnˇe s porovn´an´ım nˇekolika vybran´ ych framework˚ u. Vybran´e frameworky umoˇzn ˇuj´ı kromˇe v´ yvoje samotn´ ych WebView aplikac´ı i v´ yvoj mobiln´ıho webu, coˇz m˚ uˇze d´ale usnadnit tvorbu aplikace, nebot’ je moˇzn´e pouˇz´ıt shodn´e grafick´e prvky pro obˇe ˇreˇsen´ı. Jedn´ım z d˚ uvod˚ u pro volbu hybridn´ı aplikace m˚ uˇze b´ yt napˇr´ıklad jednotn´e vizu´aln´ı propojen´ı s webem spoleˇcnosti. Zachov´an´ı korpor´atn´ı identity v r´amci r˚ uzn´ ych platforem m˚ uˇze b´ yt pro nˇekter´e subjekty velmi podstatn´e. 9
aplikaˇcn´ı r´ amec - sada v´ yvoj´ aˇrsk´ ych n´astroj˚ u
13
Alternativn´ı pˇr´ıstupy
3.2.3
Hybridn´ı aplikace
Technologick´ a omezen´ı
Oproti klasick´e aplikaci nab´ız´ı webov´e rozhran´ı hybridn´ıch aplikac´ı pomˇernˇe odliˇsnou uˇzivatelskou zkuˇsenost, kter´a nemus´ı b´ yt nutnˇe v´ yhodou. Sice je u nich eliminov´ana odezva bˇeˇzn´a pro mobiln´ı web, nicm´enˇe ne vˇsechny grafick´e prvky se chovaj´ı shodnˇe jako odpov´ıdaj´ıc´ı prvky nativn´ı aplikace. Zejm´ena v pˇr´ıpadˇe, ˇze je webov´e rozhran´ı shodn´e napˇr´ıˇc nˇekolika platformami, pˇr´ıpadnˇe shodn´e s mobiln´ım webem, m˚ uˇze b´ yt pro uˇzivatele konkr´etn´ı platformy matouc´ı z hlediska odezvy. I proto v souˇcasnosti panuje trend pouˇz´ıvat takov´e grafick´e styly, aby aplikace co nejv´ıce pˇripom´ınala nativn´ı ˇreˇsen´ı vzhledem i odezvou, jak uv´ad´ı [Rud14]. Spokojenost uˇzivatel˚ u tak v´ıtˇez´ı nad p˚ uvodn´ı ideou sjednotit design pro vˇsechny platformy. Nev´ yhodou pro vˇetˇsinu spoleˇcnost´ı je pak nemoˇznost indexace aplikac´ı podobnˇe, jako je tomu u internetov´ ych str´anek. Obsah distribuovan´ y prostˇrednictv´ım mobiln´ı aplikace nelze zahrnout do v´ ysledk˚ u vyhled´avaˇce, ani pro nˇej pouˇz´ıt SEO10 . I v pˇr´ıpadˇe, ˇze m´a aplikace strukturu shodnou s mobiln´ım webem, tak nen´ı moˇzn´e zlepˇsit pozici tohoto obsahu v porovn´an´ı s nekvalitn´ım webem konkurence apod. Zat´ımco na jednu stranu m˚ uˇze hybridn´ı aplikace znamenat pˇr´ısun nov´ ych uˇzivatel˚ u, mus´ı vyuˇz´ıvat jin´ ych forem zviditelnˇen´ı a marketingu neˇz mobiln´ı web. Hybridn´ı aplikace vyuˇz´ıvaj´ıc´ı webov´eho rozhran´ı mohou rovnˇeˇz narazit na probl´emy pˇri publikaci na klasick´ ych distribuˇcn´ıch kan´alech, napˇr. Google 11 Play pro platformu Android. Vˇsechny aplikace jsou pˇred zveˇrejnˇen´ım v obchodu analyzov´any. A zat´ımco u klasick´ ych aplikac´ı neb´ yv´a se strukturou aplikace probl´em, u hybridn´ıch aplikac´ı nemus´ı b´ yt proces bez komplikac´ı. Z hlediska v´ ykonnosti mohou m´ıt hybridn´ı aplikace probl´em zejm´ena pˇri zobrazov´an´ı n´aroˇcn´ ych sc´en, 3D12 efekt˚ u, velmi rychl´ ych animac´ı a dalˇs´ıch pˇrechod˚ u, jak upozorˇ nuje [Rud14]. Ve vˇetˇsinˇe pˇr´ıpad˚ u jsou moˇznosti hybridn´ıch aplikac´ı omezeny moˇznostmi jazyka JavaScript, kter´ y je limitov´an v´ıce, neˇz by tomu bylo u nativn´ıho ˇreˇsen´ı. Nicm´enˇe je tˇreba m´ıt na pamˇeti, ˇze v´ ykon mobiln´ıch zaˇr´ızen´ı je oproti 10
Search Engine Optimization - angl. pro Optimalizace pro vyhled´avaˇce dostupn´e na https://play.google.com/store 12 zkr. pro trojrozmˇern´ y, trojdimenzion´aln´ı 11
14
Alternativn´ı pˇr´ıstupy
Xamarin
osobn´ım poˇc´ıtaˇc˚ um znaˇcnˇe omezen, s ˇc´ımˇz je tˇreba poˇc´ıtat jiˇz pˇri n´avrhu aplikace.
3.3
Xamarin
Spoleˇcnost Xamarin13 je spr´avcem platformy Mono14 , kter´a slouˇz´ı pro vytv´aˇren´ı multiplatformn´ıch aplikac´ı vytvoˇren´ ych v programovac´ım jazyku C# 15 . Xamarin nab´ız´ı k dispozici sadu n´astroj˚ u pro v´ yvoj nativn´ıch aplikac´ı pro vˇsechny hlavn´ı mobiln´ı platformy. V´ yvoj programu prob´ıh´a bud’ ve firemn´ım v´ yvojov´em prostˇred´ı Xamarin Studio nebo v programu Visual Studio se sadou rozˇsiˇruj´ıc´ıch doplˇ nk˚ u. Pˇri kompilaci v´ ysledn´eho programu se pak prov´ad´ı pˇrevod z k´odu napsan´eho v jazyku C# do nativn´ı formy pro danou platformu. Takov´ y pˇr´ıstup umoˇzn ˇuje zachov´an´ı maxim´aln´ıho pohodl´ı program´atora i uˇzivatele aplikace.
3.3.1
Xamarin Forms
Skuteˇcnou, a re´alnˇe vyuˇzitelnou v´ yhodu oproti v´ yvoji nativn´ıch aplikac´ı pˇredstavuje ˇreˇsen´ı zvan´e Xamarin Forms. Jedn´a se o zp˚ usob vytv´aˇren´ı formul´a16 ˇrov´ych aplikac´ı pomoc´ı jazyka XAML . V´ yhoda ˇreˇsen´ı Xamarin Forms tkv´ı v tom, ˇze vyuˇz´ıv´a n´avrhu ModelView-ViewModel, kdy grafick´e rozhran´ı vytvoˇren´e pomoc´ı XAMLu striktnˇe oddˇeluje od aplikaˇcn´ı logiky funkc´ı napsan´ ych v jazyku C#. V´ ysledn´e ˇreˇsen´ı lze pak zkompilovat pro platformy Android, iOS i Windows Phone bez nutnosti vˇetˇs´ıch z´asah˚ u do k´odu pro specifick´e platformy, jak uv´ad´ı [Xaf15]. Takov´ y pˇr´ıstup maximalizuje znovupouˇzitelnost k´odu a v´ yznamnˇe zkracuje dobu potˇrebnou na v´ yvoj multiplatformn´ı aplikace. Jednotn´ y v´ yvoj´aˇrsk´ y n´astroj pak v´ yznamnˇe sniˇzuje poˇzadavky na znalosti program´atora, co se t´ yk´a specifick´ ych ˇreˇsen´ı pro jednotliv´e platformy. Jazyk XAML je pouˇz´ıv´an 13
viz http://xamarin.com/ viz http://www.mono-project.com/ 15 specifikace dostupn´ a na: http://www.ecma-international.org/publications/ standards/Ecma-334.htm 16 eXtensible Application Markup Language - znaˇckovac´ı jazyk pro tvorbu grafick´ ych rozhran´ı aplikac´ı 14
15
Alternativn´ı pˇr´ıstupy
Xamarin
napˇr´ıklad i pˇri v´ yvoji mobiln´ıch aplikac´ı pro platformu Windows Phone, pro programy postaven´e na Windows Presentation Foundation a dalˇs´ı ˇreˇsen´ı. Oddˇelen´ım v´ ykonn´eho k´odu aplikace od pˇredpisu pro rozhran´ı aplikace ve formˇe XML17 souboru pak tento pˇr´ıstup velmi pˇripom´ın´a polymorfn´ı aplikace. Nicm´enˇe se liˇs´ı v tom, ˇze u platformy Xamarin jsou obˇe ˇca´sti propojeny pˇri kompilaci. Nen´ı tedy moˇzn´e mˇenit chov´an´ı ˇci vzhled aplikace za jej´ıho bˇehu. Nicm´enˇe pouˇzit´ı jazyka XAML by mohlo moˇznosti polymorfn´ıch aplikac´ı v´ yznamnˇe rozˇs´ıˇrit.
3.3.2
Technologick´ e v´ yhody
C´ılem t´eto ˇc´asti pr´ace nen´ı porovn´an´ı programovac´ıch jazyk˚ u C# (pouˇz´ıv´an platformou Xamarin) a Java (nativn´ı ˇreˇsen´ı pro platformu Android). N´asleduj´ıc´ı odstavce popisuj´ı nˇekolik z´asadn´ıch vylepˇsen´ı, kter´a pˇri tvorbˇe aplikac´ı platforma Xamarin nab´ız´ı. Jednou z technologick´ ych v´ yhod, kter´e pˇrin´aˇs´ı v´ yvoj pomoc´ı jazyka C#, je pouˇzit´ı knihoven a doplˇ nk˚ u vytvoˇren´ ych pˇr´ımo pro tento jazyk. I kdyˇz se pouˇzit´a platforma Mono zcela neshoduje s platformou .NET pouˇz´ıvanou pro v´ yvoj aplikac´ı pro osobn´ı poˇc´ıtaˇce, maj´ı obˇe platformy mnoho spoleˇcn´ ych prvk˚ u. Pˇri programov´an´ı aplikace v prostˇred´ı Xamarin je tedy moˇzn´e vyuˇz´ıt napˇr´ıklad Entity Framework 18 , n´astoj LINQ 19 ˇci dalˇs´ı knihovny a bal´ıˇcky funkc´ı. Ned´ılnou souˇca´st´ı jazyka C# jsou pak tzv. lambda funkce a pouˇzit´ı deleg´at˚ u. Jedn´a se o prostˇredky, kter´e mohou mnohdy v´est k program´atorsky ˇcist´emu a z´aroveˇ n efektivn´ımu ˇreˇsen´ı a platforma Xamarin jejich pouˇzit´ı umoˇzn ˇuje. Oproti tomu platforma Android postaven´a na jazyku Java pouˇzit´ı takov´ ych n´astroj˚ u neumoˇzn ˇuje. Aˇc byly lambda funkce do jazyka Java zavedeny ve verzi 8, platforma Android podporuje pouze jazyk Java verze 7 (vybran´e funkce uˇz v API 19, ofici´alnˇe od API 21), a to jeˇstˇe ne kompletnˇe. I kdyˇz ˇreˇsen´ı pro pouˇzit´ı lambda funkc´ı pod verz´ı Java 5 a novˇejˇs´ı existuje, jak uv´ad´ı 17
eXtensible Markup Language - znaˇckovac´ı jazyk Objektovˇe-relaˇcn´ı rozhran´ı, v´ıce viz https://msdn.microsoft.com/en-us/data/ef. aspx 19 Language-Integrated Query - Sada dotazovac´ıch funkc´ı, v´ıce viz https://msdn. microsoft.com/cs-cz/library/bb397926.aspx 18
16
Alternativn´ı pˇr´ıstupy
Xamarin
[Luo15]. Rovnˇeˇz je moˇzn´e podporu lambda funkc´ı zprovoznit na platformˇe Android, ˇc´ımˇz se zab´ yv´a [Tat15]. Nicm´enˇe se v obou pˇr´ıpadech jedn´a o neofici´aln´ı ˇreˇsen´ı, kter´e nahrazuje inkriminovan´e u ´seky k´odu pˇri kompilaci. Ale i toto ˇreˇsen´ı m´a mnoho nedostatk˚ u a sami autoˇri ho dle [Zai14] oznaˇcuj´ı jako Hack, nebot’ obch´az´ı ofici´aln´ı kompil´ator jazyka Java. Hlavn´ı v´ yhodou pouˇzit´ı lambda funkc´ı je moˇznost nahradit syst´emov´a rozhran´ı obsahuj´ıc´ı pouze jednu metodu. Pˇresnˇe takov´ y pˇr´ıpad je uk´az´an na n´asleduj´ıc´ım u ´seku k´odu, kter´ y pˇredstavuje obsluhu stisknut´ı tlaˇc´ıtka v uˇzivatelsk´em rozhran´ı. Uk´azka byla pˇrevzata z [Zai14]. // Rozhran ´ ı definovan ´ e Android SDK interface OnClickListener { public void onClick ( View v ) ; } // implementace proveden a ´ program ´ a torem mButton . setOnClickListener ( new View . OnClickListener () { @Override public void onClick ( View v ) { // proveden ´ ı akce } }) ;
Uk´azka k´odu 3.1: Obsluha tlaˇc´ıtka - klasicky Pˇri pouˇzit´ı lambda funkc´ı m˚ uˇze b´ yt k´od zjednuduˇsen na n´asleduj´ıc´ı v´ yraz: mButton . setOnClickListener (( View v ) -> { // proveden ´ ı akce }) ;
Uk´azka k´odu 3.2: Obsluha tlaˇc´ıtka - lambda v´ yraz V budoucnu m˚ uˇze b´ yt jedn´ım z d˚ uvod˚ u pro volbu jazyka C# i fakt, ˇze z´akladn´ı souˇc´asti platformy .NET jsou od roku 2014 uvolnˇeny jako opensource 20 (viz [Lan14]), coˇz m˚ uˇze tomuto ˇreˇsen´ı nahr´avat, nebot’ v´ yvoj´aˇri tak nebudou omezeni pouze na jazyk Java.
20
angl. pro Otevˇren´ y software
17
N´avrh polymorfn´ı aplikace
4 N´avrh polymorfn´ı aplikace Jak bylo uvedeno jiˇz v kapitole 2, navazuje tato diplomov´a pr´ace na projekt pˇredstaven´ y Ing. Milanem Staffou v pr´aci [Sta13]. V t´eto kapitole jsou pops´any jak ˇca´sti n´avrhu, kter´e z˚ ustaly zachov´any, tak ˇca´sti polymorfn´ı aplikace, kter´e byly pozmˇenˇeny nebo pˇrid´any oproti p˚ uvodn´ımu ˇreˇsen´ı. Z hlediska funkcionality cel´e aplikace z˚ ustal zachov´an n´avrh rozdˇelen´ı aplikace na dvˇe kl´ıˇcov´e ˇca´sti, kdy jedna m´a za u ´kol v´ ybˇer samotn´ ych vizu´aln´ıch a funkˇcn´ıch podklad˚ u, kter´e se pouˇzij´ı pro vytvoˇren´ı dceˇrinn´e aplikace, druh´a ˇc´ast pak slouˇz´ı k obsluze samotn´e generovan´e aplikace. Zat´ımco p˚ uvodn´ı verze prov´ad´ı naˇcten´ı programov´eho k´odu aˇz pˇri bˇehu generovan´e aplikace, nov´ y n´avrh ˇreˇsen´ı c´ıl´ı na to, aby vˇsechny d˚ uleˇzit´e ˇc´asti generovan´e aplikace byly pˇripraveny jiˇz pˇred spuˇstˇen´ım generovan´e aplikace. Jak je toho doc´ıleno, popisuje ˇca´st 4.1. M. Staffa se ve sv´e pr´aci zamˇeˇril z velk´e ˇc´asti na komunikaci aplikace se vzd´alen´ ym serverem, vykon´av´an´ı vzd´alen´ ych procedur a zabezpeˇcen´ı komunikace. Aplikace popsan´a v t´eto pr´aci c´ıl´ı pˇredevˇs´ım na vykon´av´an´ı k´odu v samotn´em zaˇr´ızen´ı. Tato zmˇena byla umoˇznˇena hlavnˇe faktem, ˇze v posledn´ıch nˇekolika letech zaznamenala mobiln´ı zaˇr´ızen´ı znateln´ y n´ar˚ ust z hlediska v´ ypoˇcetn´ı s´ıly a nˇekter´a zaˇr´ızen´ı sv´ ym v´ ykonem leckdy i pˇredˇc´ı starˇs´ı osobn´ı poˇc´ıtaˇce. Smysl jednoduch´ ych generovan´ ych aplikac´ı formul´aˇrov´eho typu vˇsak z˚ ustal zachov´an a vykon´avan´e d´ılˇc´ı aplikace se st´ale skl´adaj´ı pˇredevˇs´ım z k´odu s jednoduchou funkcionalitou. Ve sv´e pokroˇcilejˇs´ı verzi vˇsak polymorfn´ı aplikace nab´ız´ı rozmanitˇejˇs´ı uˇzivatelsk´e rozhran´ı, kter´e je moˇzn´e vytv´aˇret jak pro samotnou generovanou aplikaci, tak jako v´ ysledek jej´ı ˇcinnosti. Rozˇs´ıˇren´ı palety grafick´ ych prvk˚ u pro tvorbu generovan´ ych aplikac´ı umoˇzn ˇuje tvorbu rozmanitˇejˇs´ıch rozhran´ı. Proveden´e zmˇeny jsou pops´any v ˇca´sti 4.2 a samotnou realizaci grafick´eho n´avrhu popisuje ˇc´ast 5.1. Rozˇs´ıˇren´ı p˚ uvodn´ı pr´ace rovnˇeˇz pˇredstavuje nov´e typy aplikac´ı, kter´e lze vyuˇz´ıvat. Stejnˇe jako v p˚ uvodn´ım n´avrhu c´ıl´ı uk´azkov´e aplikace na spuˇstˇen´ı jednoduch´e funkce z pˇripojen´e knihovny, nicm´enˇe programy popsan´e v kapitole 7 slouˇz´ı pro vyhled´an´ı obsahu, kter´ y by jinak byl pro uˇzivatele h˚ uˇre dostupn´ y ˇci zobraziteln´ y.
18
N´avrh polymorfn´ı aplikace
Princip fungov´an´ı
Ze zdroje zpr´av ˇci vybran´eho webu z´ısk´avaj´ı uk´azkov´e aplikace data, kter´a pak uˇzivateli zobrazuj´ı ve formˇe vhodnˇejˇs´ı pro mobiln´ı zaˇr´ızen´ı. Samotn´e naˇc´ıt´an´ı tˇechto d´ılˇc´ıch program˚ u do polymorfn´ı aplikace prob´ıh´a stejn´ ym zp˚ usobem jako v pr´aci [Sta13], zejm´ena vˇsak proto, ˇze platforma Android st´ale nenab´ız´ı efektivnˇejˇs´ı dynamick´e naˇc´ıt´an´ı spustiteln´eho k´odu za bˇehu aplikace. N´asleduj´ıc´ı tabulka 4.1 pˇrehledn´ ym zp˚ usobem ukazuje nejv´ yznamnˇejˇs´ı zmˇeny pokroˇcil´eho n´avrhu polymorfn´ıch aplikac´ı pˇredstaven´eho v t´eto pr´aci. P˚ uvodn´ı verze
Aktu´ aln´ı verze
• XML ˇsablona + knihovna dex
• XML ˇsablona + knihovna dex
• Aktivita pro naˇcten´ı + aktivita • Aktivita pro naˇcten´ı + aktivita pro generovanou aplikaci pro generovanou aplikaci • Soubory pouze z URL1
• Stahov´an´ı z URL, Google Drive, Dropbox, lok´aln´ı u ´loˇziˇstˇe, historie vybran´ ych zdroj˚ u
• Jedna obrazovka
• Dynamick´a pr´ace s fragmenty
• Nemˇenn´e rozhran´ı
• Zmˇena vzhledu za bˇehu aplikace
• Vykon´av´an´ı vzd´alen´eho k´odu
• Vykon´av´an´ı lok´aln´ıho k´odu
• Vol´an´ı jednoduch´ ych funkc´ı
• Samostatnˇe pouˇziteln´e moduly
• C´ılem spuˇstˇen´ı funkce
• C´ılem prezentace dat
• Z´akladn´ı podoba prvk˚ u ˇ adn´ • Z´ y pˇresah aplikace
• Pˇrizp˚ usoben´ı v´ yznamu a obsahu • Spolupr´ace s telefonem, prohl´ıˇzeˇcem, e-mailov´ ym klientem
Tabulka 4.1: Porovn´an´ı p˚ uvodn´ıho a souˇcasn´eho ˇreˇsen´ı
4.1
Princip fungov´ an´ı
Aby mohla polymorfn´ı aplikace spr´avnˇe zobrazit a vykon´avat generovanou aplikaci, potˇrebuje dva z´akladn´ı prvky: 1. Pˇredpis definuj´ıc´ı zobrazen´ı prvk˚ u, jejich vlastnosti a t´ım p´adem i zp˚ uˇ sob, jak´ ym budou vykresleny na displeji zaˇr´ızen´ı - tj. urˇcitou Sablonu. 19
N´avrh polymorfn´ı aplikace
Princip fungov´an´ı
2. Programov´ y k´od v pˇreloˇzen´e a spustiteln´e podobˇe, kter´ y bude moci za bˇehu aplikace naˇc´ıst a vykonat - tedy spustitelnou Knihovnu. Celou polymorfn´ı aplikaci lze tedy z logick´eho hlediska rozdˇelit na dvˇe ˇc´asti. Prvn´ı ˇc´ast bude opatˇrovat potˇrebn´e soubory a zajist´ı jejich pˇresun do zaˇr´ızen´ı. Druh´a ˇca´st pak na z´akladˇe poskytnut´ ych soubor˚ u vygeneruje uˇzivatelsk´e rozhran´ı a spust´ı programov´ y k´od, kter´ y m´a k dispozici. Vytv´aˇren´ı uˇzivatelsk´eho rozhran´ı dle ˇsablon popisuje ˇca´st 5.1.3. Pr´ace s programov´ ym k´odem je rozebr´ana v ˇca´sti 5.2.2. Zm´ınˇen´e dvˇe ˇca´sti aplikace jsou pˇredstavov´any dvˇema samostatn´ ymi programov´ ymi prvky typu Activity (t´eˇz aktivita). N´asleduj´ıc´ı obr´azek 4.1 zn´azorˇ nuje rozsah ˇcinnost´ı tˇechto aktivit a jednotliv´e kroky nutn´e pro u ´spˇeˇsn´ y bˇeh polymorfn´ı aplikace, v obr´azku oznaˇcen´e jako akce A1 - A7. Pro jasnˇejˇs´ı odliˇsen´ı jsou zelenou barvou zv´ yraznˇeny aktivity vykon´avan´e polymorfn´ı aplikac´ı, oranˇzov´a barva znaˇc´ı ˇsablonu grafick´eho rozhran´ı dceˇrinn´e aplikace, modr´a barva pˇredstavuje programovou ˇc´ast, kter´a se vykon´av´a v generovan´e aplikaci.
Obr´azek 4.1: Bˇeh aplikace
20
N´avrh polymorfn´ı aplikace
Zmˇeny v uˇzivatelsk´em rozhran´ı
• A 1 - Uˇzivatel pomoc´ı prvn´ı aktivity vybere soubor ˇsablony z libovoln´eho zdroje. Je moˇzn´e naˇc´ıst soubor z pamˇeti zaˇr´ızen´ı, zadan´eho URL, zu ´loˇziˇst’ Dropbox ˇci Google Drive (pr´aci s u ´loˇziˇsti popisuje ˇca´st 5.3). • A 2 - Soubor ˇsablony se mus´ı z vybran´eho um´ıstˇen´ı pˇresunout do pamˇeti zaˇr´ızen´ı, aby s n´ım bylo moˇzn´e pracovat. • A 3 - Analogicky prob´ıh´a v´ ybˇer souboru spustiteln´e knihovny. • A 4 - Stejnˇe tak i jej´ı staˇzen´ı do zaˇr´ızen´ı pro budouc´ı pouˇzit´ı. • A 5 - Na z´akladˇe staˇzen´e ˇsablony se vytvoˇr´ı uˇzivatelsk´e rozhran´ı jedn´e ˇci v´ıce obrazovek generovan´e aplikace. • A 6 - Z generovan´e aplikace je moˇzn´e spustit pˇripraven´ y programov´ y k´od. • A 7 - V´ ysledkem bˇehu programov´eho k´odu je dalˇs´ı ˇsablona pro vzhled generovan´e aplikace, kterou se nahrad´ı ˇci rozˇs´ıˇr´ı p˚ uvodn´ı vzhled.
4.2
Zmˇ eny v uˇ zivatelsk´ em rozhran´ı
P˚ uvodn´ı n´avrhy polymorfn´ı aplikace pˇredstaven´e v prac´ıch [Hul12] a [Sta13] pracuj´ı pouze se z´akladn´ımi grafick´ ymi prvky typu Button (tlaˇc´ıtko), TextView (zobrazen´ı popisku ˇci textu) a EditText (kolonka pro zad´an´ı textu). Aby vˇsak bylo moˇzn´e programy generovan´e v polymorfn´ı aplikaci efektivˇe pouˇz´ıvat, bylo nutn´e nab´ıdku tˇechto prvk˚ u rozˇs´ıˇrit. Nejedn´a se o rozˇs´ıˇren´ı, co se do poˇctu pouˇzit´ ych objekt˚ u t´ yˇce, ale sp´ıˇse o vyuˇzit´ı povahy jednotliv´ ych prvk˚ u, jejich rozliˇsen´ı z hlediska d˚ uleˇzitosti a funkce. Souˇcasn´a verze polymorfn´ı aplikace vyuˇz´ıv´a n´asleduj´ıc´ı prvky uˇzivatelsk´eho rozhran´ı: • Tlaˇ c´ıtko - oproti p˚ uvodn´ımu n´avrhu nezmˇenˇeno, slouˇz´ı ke spuˇstˇen´ı pˇriˇrazen´e funkce. • Text - novˇe umoˇzn ˇuje rozliˇsit d˚ uleˇzitost informace pomoc´ı zv´ yraznˇen´ı typu kurz´ıva a/nebo tuˇcn´e p´ısmo. T´ım je umoˇznˇeno jasn´e strukturov´an´ı obsahu na displeji zaˇr´ızen´ı. D´ale je zd˚ uraznˇena v´ yznamov´a str´anka obsahu - v pˇr´ıpadˇe, ˇze je v textu uvedeno telefonn´ı ˇc´ıslo, je moˇzn´e kliknut´ım toto ˇc´ıslo vytoˇcit. Kliknut´ı na odkaz zase slouˇz´ı pro pˇrechod 21
N´avrh polymorfn´ı aplikace
Zmˇeny v uˇzivatelsk´em rozhran´ı
do internetov´eho prohl´ıˇzeˇce. Tyto u ´pravy v´ yraznˇe zlepˇsuj´ı uˇzivatelskou zkuˇsenost s pouˇz´ıv´an´ım generovan´e aplikace. • Kolonky - je moˇzn´e dle poˇzadovan´eho obsahu pˇrizp˚ usobit rozloˇzen´ı kl´avesnice zaˇr´ızen´ı pro nˇekolik vybran´ ych typ˚ u (datum, text, telefonn´ı ˇc´ıslo, atd.). • CheckBox - prvek slouˇz´ıc´ı pro zapnut´ı ˇci vypnut´ı pˇriˇrazen´e volby. D´ale rozˇsiˇruje moˇznosti volan´e funkce. • Obr´ azky - mnohdy zprostˇredkuj´ı potˇrebnou informaci efektivnˇeji neˇz slovn´ı popis, mohou rovnˇeˇz slouˇzit pro doplnˇen´ı textu o dalˇs´ı rozmˇer informace. Povaha polymorfn´ı aplikace omezuje moˇznosti a typ pouˇzit´ ych prvk˚ u oproti klasick´ ym aplikac´ım. Hlavn´ımi poˇzadavky na rozhran´ı generovan´e aplikace jsou pˇrehlednost, jednoduchost, ale rovnˇeˇz schopnost vygenerovat rozhran´ı pro pˇredem nezn´am´e rozloˇzen´ı a poˇcet prvk˚ u. Vzhledem k tomu, ˇze jak´ ykoli dynamick´ y prvek rozhran´ı (napˇr. Slider ˇci Picker ) je z podstaty sv´az´an s urˇcitou promˇennou obsahuj´ıc´ı jeho hodnotu a obsluˇznou funkc´ı, kter´a obsluhuje manipulaci s takov´ ym prvkem, nen´ı moˇzno tyto prvky jednoduch´ ym zp˚ usobem vytvoˇrit dynamicky. Efektivn´ı pr´ace s takov´ ymi aktivn´ımi prvky vyˇzaduje pˇredchoz´ı znalost rozloˇzen´ı uˇzivatelsk´eho rozhran´ı, proto byly z polymorfn´ı aplikace vynech´any. Podrobn´ y popis vˇsech komponent pouˇziteln´ ych v rozhran´ı polymorfn´ı aplikace je uveden v pˇr´ıloze C.
22
Realizace polymorfn´ı aplikace
5 Realizace polymorfn´ı aplikace Zat´ımco pˇredchoz´ı kapitola 4 se zab´ yvala pˇredevˇs´ım strukturou polymorfn´ı aplikace v porovn´an´ı s ˇreˇsen´ımi zn´am´ ymi z pˇredchoz´ıch let, c´ılem t´eto kapitoly je popsat samotn´ y princip, na kter´em polymorfn´ı aplikace re´alnˇe bˇeˇz´ı. Nezab´ yv´a se sice dopodrobna vˇsemi pouˇzit´ ymi tˇr´ıdami, metodami a dalˇs´ımi komponentami programu, nicm´enˇe by po jej´ım pˇreˇcten´ı mˇel b´ yt jasn´ y zp˚ usob jej´ıho fungov´an´ı.
5.1
Uˇ zivatelsk´ e rozhran´ı
Jak bylo jiˇz uvedeno v ˇc´asti 4.1, je z´akladn´ım stavebn´ım prvkem klasick´e aplikace na platformˇe Android objekt typu aktivita - programov´a ˇca´st obsluhuj´ıc´ı ud´alosti, vykon´avaj´ıc´ı k´od hlavn´ıho vl´akna programu, tzv. UI Thread1 . U jednoduch´ ych aplikac´ı je kaˇzd´e aktivitˇe pˇriˇrazen soubor typu Layout, kter´ y pevnˇe definuje rozloˇzen´ı prvk˚ u rozhran´ı dan´e aktivity a pˇriˇrazuje jim funkce, kter´e maj´ı vykonat. Aktivita spoleˇcnˇe s layoutem pak tvoˇr´ı z pohledu uˇzivatele jednu obrazovku aplikace. Aby bylo moˇzn´e vyuˇz´ıvat r˚ uzn´a rozloˇzen´ı prvk˚ u a jednoduˇse mezi nimi pˇrep´ınat, lze pouˇz´ıt prvky typu Fragment. Fragment pˇredstavuje ˇc´ast aktivity, kterou lze dynamicky vytv´aˇret ˇci ukonˇcovat, ˇc´ımˇz je moˇzn´e doc´ılit jednoduˇsˇs´ı navigace v obsahu, ˇci vytvoˇrit v´ıcepanelov´e rozloˇzen´ı obrazovky (p˚ uvodn´ı u ´ˇcel fragment˚ u). Ve vˇetˇsinˇe pˇr´ıpad˚ u maj´ı fragmenty, podobnˇe jako aktivity pˇriˇrazen´ y pˇredem vytvoˇren´ y soubor layoutu. Narozd´ıl od aktivit, se ale jedn´a pˇredevˇs´ım o prvky uˇzivatelsk´eho rozhran´ı a samotn´ y k´od aplikace je st´ale obsluhov´an nadˇrazenou aktivitou fragment˚ u. Toto sch´ema zn´azorˇ nuje obr´azek 5.1.
5.1.1
Struktura prvk˚ u
Platforma Android vyuˇz´ıv´a v uˇzivatelsk´ ych rozhran´ıch objekty typu View. Jedn´ım z podtyp˚ u tohoto objektu je ViewGroup, kter´ y m˚ uˇze obsahovat dalˇs´ı 1
User Interface Thread - angl. pro Vl´akno uˇzivatelsk´eho rozhran´ı
23
Realizace polymorfn´ı aplikace
Uˇzivatelsk´e rozhran´ı
Obr´azek 5.1: Struktura aplikace prvky typu View ˇci ViewGroup. Kombinac´ı tˇechto prvk˚ u doch´az´ı k vytvoˇren´ı stromov´e struktury rozhran´ı, kter´a je zn´azornˇena na obr´azku 5.2.
Obr´azek 5.2: Struktura prvk˚ u View, zdroj: [Aui15] Soubor layoutu typicky definuje rozloˇzen´ı uˇzivatelsk´eho rozhran´ı pomoc´ı jednoho nebo v´ıce prvk˚ u typu ViewGroup, kter´ y obsahuje dalˇs´ı specializovan´e prvky typu View. Nejpouˇz´ıvanˇejˇs´ımi prvky typu ViewGroup jsou: • LinearLayout - seznam prvk˚ u, kde kaˇzd´e View pˇredstavuje jeden ˇra´dek (resp. sloupec, dle orientace). • RelativeLayout - rozloˇzen´ı, kter´e umoˇzn ˇuje definovat vzd´alenosti a um´ıstˇen´ı prvku dle jeho sousedn´ıch prvk˚ u. 24
Realizace polymorfn´ı aplikace
Uˇzivatelsk´e rozhran´ı
• ScrollView - rozloˇzen´ı, kter´e pˇrizp˚ usob´ı obsah velikosti displeje tak, aby bylo moˇzn´e zobrazit i prvky, kter´e by se jinak vykreslily mimo obrazovku.
5.1.2
Vytv´ aˇ ren´ı prvk˚ u
V klasick´e aplikaci jsou vˇsechny d˚ uleˇzit´e prvky View definov´any v pˇr´ısluˇsn´em souboru layout, nicm´enˇe je moˇzn´e dle potˇreby vytv´aˇret prvky i dynamicky (za bˇehu aplikace, po vykreslen´ı dan´eho fragmentu ˇci aktivity). Klasick´ y pˇr´ıstup, ale i dynamick´e vytv´aˇren´ı programov´ ych souˇc´ast´ı aplikace platformy Android se detailnˇeji zmiˇ nuje napˇr´ıklad [Gra13]. Moˇznost vytv´aˇret prvky uˇzivatelsk´eho rozhran´ı programovˇe je z´akladem tvorby grafick´eho rozhran´ı polymorfn´ı aplikace. Ta nam´ısto klasick´ ych soubor˚ u typu layout pouˇz´ıv´a podobn´e definice v podobˇe XML soubor˚ u, kter´e se pouˇzij´ı pˇri naˇcten´ı dan´eho fragmentu (viz. n´asleduj´ıc´ı ˇc´ast 5.1.3. V klasick´e aplikaci je moˇzn´e vˇsem pˇredem zn´am´ ym prvk˚ um typu View pˇriˇradit unik´atn´ı identifik´ator v r´amci aplikace, kter´ y slouˇz´ı k vyhled´av´an´ı dan´eho prvku a zmˇenˇe jeho parametr˚ u. U polymorfn´ı aplikace vˇsak nen´ı moˇzn´e pˇredem definovat jedineˇcn´e identifik´atory tak, aby bylo moˇzn´e zaruˇcit, ˇze se v r´amci aplikace nebude vyskytovat prvek se stejn´ ym ID2 . V aplikaci jsou identifik´atory reprezentov´any jako unik´atn´ı zdroje typu integer3 , ale program´ator s nimi zach´az´ı pomoc´ı jejich slovn´ıho n´azvu, aniˇz by znal samotnou hodnotu identifik´atoru vygenerovanou aplikac´ı. Nemoˇznost pouˇz´ıvat jednoduˇse identifik´atory prvk˚ u do velk´e m´ıry znemoˇzn ˇuje u ´pravy rozhran´ı na u ´rovni konkr´etn´ıch prvk˚ u za bˇehu polymorfn´ı aplikace. Nicm´enˇe je st´ale moˇzn´e pro prvek vybran´ y jin´ ym zp˚ usobem (proch´azen´ı seznamu, prvek jako p˚ uvodce ud´alosti) mˇenit jeho parametry ˇci obsah. Pokud se jedn´a o prvek typu ViewGroup, lze rovnˇeˇz mˇenit jeho potomky. Pro zjednoduˇsen´ı a moˇznost jednoznaˇcn´eho pozicov´an´ı prvk˚ u byla mnoˇzina pouˇzit´ ych prvk˚ u omezena na nˇekolik z´akladn´ıch typ˚ u: LinearLayout, TextView, EditText, Button, ImageView a CheckBox. I tento pomˇernˇe limitovan´ y poˇcet prvk˚ u nicm´enˇe umoˇzn ˇuje tvorbu rela2 3
zkratka pro identifik´ ator cel´e ˇc´ıslo des´ıtkov´e soustavy
25
Realizace polymorfn´ı aplikace
Uˇzivatelsk´e rozhran´ı
tivnˇe rozmanit´ ych uˇzivatelsk´ ych rozhran´ı pˇri zachov´an´ı pˇrehlednosti ˇsablon. Jednotliv´e prvky a atributy, kter´e jim lze pˇriˇradit, jsou pops´any v pˇr´ıloze C.
5.1.3
ˇ Sablony rozhran´ı
ˇ Sablony rozhran´ı pˇredstavuj´ı alternativu k soubor˚ um typu layout. Jedn´a se vˇzdy o validn´ı XML, bud’ v podobˇe souboru, nebo jako ˇretˇezec (String), kter´ y je v´ ysledkem funkce bˇeˇz´ıc´ı v programu. Jak ukazuje obr´azek 5.3, pouˇz´ıv´a kaˇzd´ y fragment generovan´e aplikace klasick´ y soubor layout. Nicm´enˇe tento soubor definuje pouze obaluj´ıc´ı scrollView pro dalˇs´ı obsah. Jedn´a se tedy o definici, jak vykreslit fragment bez ohledu na jeho obsah. Jednotliv´e prvky View ve fragmentu jsou nav´ıc obaleny pomoc´ı LinearLayout, kter´ y zajiˇst’uje rozm´ıstˇen´ı prvk˚ u na jednotliv´e ˇr´adky rozhran´ı v poˇrad´ı, ve kter´em jsou do nˇej vloˇzeny. Prvky generovan´e dynamicky pˇri vytvoˇren´ı fragmentu jsou v obr´azku 5.3 zv´ yraznˇeny ˇzlutou barvou.
Obr´azek 5.3: Naˇc´ıt´an´ı obsahu Fragmentu Kaˇzd´a ˇsablona vyuˇz´ıv´a toho, ˇze vˇsechny prvky typu View jsou v aplikaci reprezentov´any pomoc´ı stromu, jak zn´azorˇ nuje obr´azek 5.2. Proto jsou i v ˇsablon´ach definov´any odpov´ıdaj´ıc´ım zp˚ usobem jako strom element˚ u.
26
Realizace polymorfn´ı aplikace
Uˇzivatelsk´e rozhran´ı
ˇ Sablony jsou zpracov´av´any pomoc´ı DOM4 parseru, jehoˇz definici popisuje [Dom04]. Kaˇzd´a ˇsablona m˚ uˇze obsahovat definici v´ıce prvk˚ u typu fragment (pouˇzito zejm´ena u soubor˚ u), u prov´adˇen´ı k´odu z naˇcten´ ych knihoven se vˇsak pouˇz´ıv´a jedna ˇsablona pro jeden fragment, jak podrobnˇeji popisuje 5.2. Pˇr´ıklady pouˇzit´ ych ˇsablon je moˇzn´e naj´ıt v pˇr´ıloze D.
5.1.4
Naˇ c´ıt´ an´ı fragment˚ u
Pro generovanou aplikaci je vytvoˇrena jedin´a aktivita, v r´amci kter´e se generuj´ı potˇrebn´e fragmenty dle pouˇzit´e ˇsablony. Tato aktivita pouˇz´ıv´a objektu SectionsPagerAdapter, kter´ y umoˇzn ˇuje dynamick´e vytv´aˇren´ı fragment˚ u pˇri 5 v´ ybˇeru jedn´e ze z´aloˇzek v navigaˇcn´ım prvku ToolBar . Protoˇze poˇcet vygenerovan´ ych panel˚ u nen´ı pˇredem zn´am, jsou vytv´aˇreny vˇzdy dle aktu´aln´ı potˇreby, coˇz zajiˇst’uje tˇr´ıda FragmentStatePagerAdapter, od kter´e SectionsPagerAdapter dˇed´ı. Mezi panely lze rovnˇeˇz pˇrech´azet pomoc´ı posouv´an´ı aktu´aln´ıho fragmentu do stran (tzv. Swipe Views). Obsah jednotliv´ ych fragment˚ u je uloˇzen v seznamu v aktivitˇe zastˇreˇsuj´ıc´ı pr´aci s nimi. Pˇri pokusu o pˇr´ıstup do jin´eho neˇz aktu´aln´ıho fragmentu se vybere View na odpov´ıdaj´ıc´ı pozici seznamu a je pˇred´an nov´e instanci fragmentu ke zobrazen´ı. T´ım, ˇze jsou vˇsechny prvky View v seznamu vytvoˇreny pˇredem, doch´az´ı k rychl´emu naˇcten´ı obsahu fragmentu, aniˇz by bylo tˇreba samotn´ y obsah vytv´aˇret vˇzdy znovu. Po odchodu z aktu´aln´ıho fragmentu doch´az´ı k zruˇsen´ı jeho instance, ale obsah ve formˇe View je st´ale dostupn´ y pro opˇetovn´e vyuˇzit´ı. V r´amci aktivity je moˇzn´e rovnˇeˇz aktu´aln´ı fragment uzavˇr´ıt, nen´ı-li tento fragment jedin´ ym vygenerovan´ ym. Fragmenty, kter´e byly naˇcteny ze souborov´e ˇsablony, lze rovnˇeˇz libovolnˇe duplikovat. C´ılem t´eto akce je vytvoˇrit nov´ y fragment, kter´ y umoˇzn ˇuje vykon´av´an´ı k´odu, kter´ y mu byl pˇriˇrazen v definici v p˚ uvodn´ı ˇsablonˇe. Fragmenty, kter´e jsou produktem vykonan´eho k´odu, duplikovat nelze. Nam´ısto takov´eho fragmentu se vytvoˇr´ı kopie p˚ uvodn´ıho fragmentu v takov´e podobˇe, v jak´e byl pˇred vykon´an´ım pˇriˇrazen´e funkce (resp. v jak´e byl naˇcten ze souboru ˇsablony). Kombinac´ı zav´ır´an´ı a duplikace fragment˚ u je 4 5
Document Object Model - angl. pro Objektov´ y model dokumentu N´ astrojov´ y nebo t´eˇz navigaˇcn´ı panel
27
Realizace polymorfn´ı aplikace
Pouˇzit´ı knihoven
mimo jin´e umoˇznˇeno zavˇren´ı nepotˇrebn´ ych fragment˚ u v´ ysledku a opˇetovn´e spuˇstˇen´ı funkce. Pokud fragment obsahuje objekty ImageView, kter´e maj´ı pˇriˇrazenu adresu (URL) zdroje obr´azku, probˇehne po prvn´ım zobrazen´ı dan´eho fragmentu naˇcten´ı tˇechto obr´azk˚ u. Pro kaˇzd´ y prvek ImageView se vytvoˇr´ı objekt typu bitmap, kter´ y pˇredstavuje samotnou obrazovou informaci, a je do ImageView pˇriˇrazen. Soubory obr´azk˚ u se vytv´aˇrej´ı v cache6 zaˇr´ızen´ı, takˇze mohou b´ yt odstranˇeny dle potˇreb syst´emu, nebo pˇri spuˇstˇen´ı ˇcistic´ıho programu.
5.2
Pouˇ zit´ı knihoven
Programy vytvoˇren´e v jazyku Java pro osobn´ı poˇc´ıtaˇce vznikaj´ı kompilac´ı zdrojov´ ych k´od˚ u (soubory .java) do bytecode - strojovˇe ˇciteln´eho k´odu (soubory .class). Soubory bytecode lze d´ale jeˇstˇe komprimovat zabalen´ım do archivu (soubory .jar) spolu s dalˇs´ımi souˇca´stmi programu a n´aslednˇe je k´od vykon´av´an pomoc´ı JVM7 . Oproti tomu zaˇr´ızen´ı bˇeˇz´ıc´ı na platformˇe Android 4.4 a starˇs´ı pouˇz´ıvaj´ı vlastn´ı virtu´aln´ı stroj DVM8 , kter´ y funguje na principu architektury registr˚ u, na rozd´ıl od JVM, kter´ y pouˇz´ıv´a z´asobn´ıkovou architekturu. Prostˇred´ı Dalvik9 vyuˇz´ıv´a just-in-time (JIT) kompilaci, pˇri kter´e je spuˇstˇen´ y program kompilov´an pˇr´ımo v dobˇe prov´adˇen´ı. Od verze Android 5.0 je Dalvik nahrazen prostˇred´ım ART10 , kter´e k´od programu kompiluje pˇredem, pˇri jeho instalaci, pomoc´ı ahead-of-time (AOT) kompil´atoru. Stejnˇe tak kompiluje programov´e ˇc´asti syst´emu pˇri startu zaˇr´ızen´ı. Pˇredem kompilovan´ y k´od by mˇel pˇrin´est zrychlen´ı bˇehu aplikac´ı a ve v´ ysledku vyˇsˇs´ı v´ ykon zaˇr´ızen´ı. Prostˇred´ı ART je kompatibiln´ı s aplikacemi vytvoˇren´ ymi pro Dalvik, porovn´an´ı obou uveden´ ych syst´em˚ u popisuje [Asa15]. 6
V tomto kontextu doˇcasn´ a pamˇet’ Java Virtual Machine - angl. pro Virtu´aln´ı stroj Javy 8 Dalvik Virtual Machine - angl. pro Virtu´aln´ı stroj Dalviku 9 v´ıce informac´ı na http://www.dalvikurbyggd.is/EN/About-Dalvik/ 10 Android Runtime - angl. pro aplikaˇcn´ı (bˇehov´e) prostˇred´ı 7
28
Realizace polymorfn´ı aplikace
5.2.1
Pouˇzit´ı knihoven
Dalvik executable archiv
D˚ usledkem pouˇzit´ı odliˇsn´ ych virtu´aln´ıch stroj˚ u na mobiln´ıch zaˇr´ızen´ıch je nutnost dodateˇcn´e kompilace k´odu aplikace pro mobiln´ı prostˇred´ı. Mobiln´ı aplikace pouˇz´ıvaj´ı nam´ısto klasick´ ych jar archiv˚ u tzv. dex, neboli Dalvik Executable, soubory popsan´e v [Asd15]. Rozd´ıl mezi obsahem jar a dex archivu je uk´az´an v pˇr´ıloze na obr´azku E.1. Z hlediska bezpeˇcnosti m˚ uˇze b´ yt d˚ uleˇzit´ y i fakt, ˇze oproti jar archivu se ned´a obsah dex archivu prohl´ednout bez pomoci specializovan´ ych dekompilaˇcn´ıch n´astroj˚ u. N´asleduj´ıc´ı obr´azek 5.4 ilustruje proces kompilace dex soubor˚ u do podoby spustiteln´e na platformˇe Android.
Obr´azek 5.4: Kompilace dex soubor˚ u Pˇri vytv´aˇren´ı aplikace pro platformu Android doch´az´ı k dodateˇcn´e kompilaci automaticky. V´ ysledn´ y soubor apk se sest´av´a z manifestu aplikace, zdroj˚ u aplikace, dodateˇcn´ ych knihoven a souboru classes.dex, kter´ y obsahuje vˇsechny pˇrekompilovan´e zdrojov´e k´ody potˇrebn´e k bˇehu aplikace. Samostatnˇe stoj´ıc´ı archivy dex je ale tˇreba vytvoˇrit manu´aln´ı kompilac´ı jar archivu pomoc´ı n´astroje dx, kter´ y je z´akladn´ı souˇca´st´ı n´astroj˚ u Adroid 11 SDK . N´astroj dx um´ı do v´ ysledn´eho archivu zabalit soubory tˇr´ıd, kter´e jsou mu d´any k dispozici, nicm´enˇe probl´em nast´av´a u knihoven tˇret´ıch stran, kdy nen´ı moˇzn´e manu´alnˇe ovlivnit obsah v´ ysledn´eho archivu. M˚ uˇze tak doj´ıt k tomu, ˇze z p˚ uvodn´ı knihovny budou vynech´any napˇr´ıklad soubory typu .property, se kter´ ymi prostˇred´ı Dalvik standarnˇe nepracuje, coˇz zapˇr´ıˇcin´ı nefunkˇcnost aplikace. Knihovny tˇret´ıch stran je tak tˇreba pˇridat pˇr´ımo do projektu polymorfn´ı aplikace, kter´ y je pˇribal´ı do v´ ysledn´eho souboru 11
Software Development Kit - angl. pro Sada v´ yvojov´ ych n´astroj˚ u
29
Realizace polymorfn´ı aplikace
Pouˇzit´ı knihoven
apk. T´ım je bohuˇzel vylouˇcena u ´pln´a nez´avislost generovan´ ych aplikac´ı na jejich mateˇrsk´e aplikaci. Na druhou stranu je moˇzn´e tut´eˇz knihovnu pouˇz´ıt ve v´ıce d´ılˇc´ıch aplikac´ıch. Pˇr´ıkaz pro kompilov´an´ı archiv˚ u pomoc´ı n´astroje dx vypad´a n´asledovnˇe: dx -- dex -- keep - classes -- output ="./ vysledek . dex " "./ puvodni . jar "
Uk´azka k´odu 5.1: Kompilace dex archivu
5.2.2
Naˇ c´ıt´ an´ı archiv˚ u
Standardnˇe jsou pˇri bˇehu aplikace naˇc´ıt´any pouze soubory obsaˇzen´e v jej´ım vlastn´ım archivu classes.dex, kter´ y je souˇca´st´ı instalaˇcn´ıho bal´ıku aplikace apk. K naˇc´ıt´an´ı kompilovan´eho k´odu aplikace slouˇz´ı tˇr´ıda DexClassLoader, kter´a zpˇr´ıstupˇ nuje tˇr´ıdy obsaˇzen´e v archivech jar a apk. Tuto tˇr´ıdu lze vyuˇz´ıt rovnˇeˇz k manu´aln´ımu naˇcten´ı dex soubor˚ u z pamˇeti zaˇr´ızen´ı. N´asleduj´ıc´ı uk´azka k´odu pˇredstavuje vytvoˇren´ı instance tˇr´ıdy DexClassLoader, kter´a jako parametry bere: • Vstupn´ı soubor dex; • Adres´aˇr v cache aplikace, do kter´eho se rozbal´ı potˇrebn´e soubory; • Pˇr´ıpadn´ y soubor nativn´ıch knihoven; • ClassLoader pouˇz´ıvan´ y obaluj´ıc´ı Aktivitou. File dexFile = Utilities . g e t F i l e I n W o r k i n g D i r e c t o r y ( context , dexFilename ) ; File dexOutput = context . getDir ( " outdex " , Context . MODE_PRIVATE ) ; DexClassLoader dcl = new DexClassLoader ( dexFile . getAbsolutePath () , dexOutput . getAbsolutePath () , null , context . getClassLoader () ) ; Class libProviderClass = null ; libProviderClass = dcl . loadClass ( targetClass ) ;
Uk´azka k´odu 5.2: Pouˇz´ıt´ı DexClassLoaderu 30
Realizace polymorfn´ı aplikace
Pouˇzit´ı knihoven
Po naˇcten´ı potˇrebn´e tˇr´ıdy je moˇzn´e vytvoˇrit jej´ı instanci a spustit nˇekterou z jej´ıch metod. V realizovan´e aplikaci je konzistence naˇc´ıt´an´ı zajiˇstˇena t´ım, ˇze vˇsechny pouˇzit´e podprogramy mus´ı implementovat spoleˇcn´e rozhran´ı ILibraryFunction, kter´e obsahuje metodu doLibraryFunction. Zm´ınˇen´a metoda je pak definov´ana v jednotliv´ ych knihovn´ach, takˇze ji lze vˇzdy pouˇz´ıt. Jako vstupn´ı parametr bere seznam ˇretˇezc˚ u a v´ ystupem je rovnˇeˇz seznam ˇretˇezc˚ u. T´ım je dosaˇzeno velk´eho zobecnˇen´ı pˇri vol´an´ı metody bez pˇredchoz´ı znalosti jej´ıho obsahu ˇci funkce. interface ILibraryFunction { public ArrayList < String > doLibraryFunction ( ArrayList < String > parameters ) ; }
Uk´azka k´odu 5.3: Rozhran´ı dex archivu Samotn´eho vol´an´ı metody je dosaˇzeno pomoc´ı reflexe. Pˇri instancov´an´ı metody je podstatn´a pouze samotn´a metoda doLibraryFunction, kter´a je vol´ana. Dalˇs´ı metody a jin´ y obsah tˇr´ıdy jsou ignorov´any. Z´ısk´an´ı v´ ysledk˚ u volan´e metody vypad´a n´asledovnˇe: final Object myInstance = libProviderClass . newInstance () ; final Method doSomething = libProviderClass . getMethod ( " doLibraryFunction " , ArrayList . class ) ; Object output = doSomething . invoke ( myInstance , input ) ;
Uk´azka k´odu 5.4: Vol´an´ı knihovn´ı funkce Obecnˇe je moˇzn´e volat libovolnou metodu vybran´e tˇr´ıdy, pro jej´ı pouˇzit´ı staˇc´ı pouze zadat jm´eno metody a typ jej´ıch vstupn´ıch parametr˚ u. Pouˇzit´ım co nejobecnˇejˇs´ıho n´avrhu vˇsak m´ame zajiˇstˇeno, ˇze pr´avˇe metoda doLibraryFunction bude v c´ılen´e tˇr´ıdˇe implementov´ana, coˇz je podstatn´e zejm´ena z hlediska jednoduch´eho n´avrhu polymorfn´ı aplikace. V pˇr´ıpadˇe potˇreby by bylo moˇzn´e n´avrh rozˇs´ıˇrit o vol´an´ı libovoln´e funkce, u kter´e by bylo pomoc´ı reflexe nutn´e zjistit poˇcet a typy vˇsech jej´ıch parametr˚ u, napˇr´ıklad zp˚ usobem popsan´ ym v [Omt15].
31
Realizace polymorfn´ı aplikace
5.2.3
Pouˇzit´ı knihoven
Obsluha generovan´ e aplikace
Jak popisuje pˇredchoz´ı ˇca´st 5.2.2, je komunikace mezi generovanou aplikac´ı a jej´ım programov´ ym k´odem realizov´ana jednotnˇe pomoc´ı rozhran´ı ILibraryFunction a jeho metody doLibraryFunction. P˚ uvodcem vol´an´ı extern´ı metody je tlaˇc´ıtko, kter´e m´a pˇriˇrazen objekt typu Function. Tento objekt se vytvoˇr´ı na z´akladˇe ˇsablony, ze kter´e bylo uˇzivatelsk´e rozhran´ı vytvoˇreno. Z´apis v souboru ˇsablony m˚ uˇze vypadat napˇr´ıklad takto: < Button text = " Naj ´ ıt"> < function type = " replace " target = " com . example . control . ContactFinder " / >
Uk´azka k´odu 5.5: Pˇriˇrazen´ı funkce tlaˇc´ıtku Po stisku tlaˇc´ıtka dojde v obaluj´ıc´ı aktivitˇe k obsluze ud´alosti, dle typu funkce se provede patˇriˇcn´a akce. Pokud m´a dan´e tlaˇc´ıtko typ funkce replace, znamen´a to, ˇze se obsah aktu´aln´ıho fragmentu bude nahrazovat obsahem vygenerovan´ ym specifikovanou tˇr´ıdou odpov´ıdaj´ıc´ı parametru target. Tato vybran´a tˇr´ıda bude instancov´ana pomoc´ı n´astroje DexClassLoader a bude v n´ı spuˇstˇena metoda doLibraryFunction. Parametrem t´eto metody je seznam prvk˚ u typu String, kter´ y je generov´an ze vˇsech editovateln´ ych prvk˚ u typu View obsaˇzen´ ych v aktu´aln´ım fragmentu. Mezi editovateln´e prvky patˇr´ı prvky typu EditText a CheckBox. Pro kaˇzd´ y uveden´ y typ se vygeneruje jeden spoleˇcn´ y ˇretˇezec s obsahem prvk˚ u pomoc´ı metody itemsContentToString obaluj´ıc´ı aktivity ChildActivity. z prvk˚ u typu EditText je extrahov´an jejich textov´ y obsah, prvky CheckBox generuj´ı ˇretˇezec true ˇci false dle aktu´aln´ı hodnoty. Ve v´ ysledku m˚ uˇze vypadat vstup volan´e metody n´asledovnˇe: " class android . widget . EditText =[ text1 ; text2 ;...] " , " class android . widget . CheckBox =[ true ; false ;...] "
Uk´azka k´odu 5.6: Struktura vstupn´ıch parametr˚ u funkce N´aslednˇe se vytvoˇr´ı instance tˇr´ıdy ProcessFunctionTask, kter´a na pozad´ı provede naˇcten´ı pˇriˇrazen´eho dex archivu, instancuje specifikovanou tˇr´ıdu a zavol´a jej´ı metodu doLibraryFunction s pˇredan´ ymi parametry. Volan´a tˇr´ıda mus´ı sama zn´at poˇcet a typ parametr˚ u, kter´e potˇrebuje k vykon´an´ı metody. 32
Realizace polymorfn´ı aplikace
Pr´ace s u ´loˇziˇsti
Tyto parametry vybere ze vstupu, provede sv˚ uj k´od a n´aslednˇe vrac´ı obsah, kter´ y se m´a zobrazit ve Fragmentu, z nˇehoˇz byla metoda zavol´ana. V´ ystupn´ım objektem volan´e metody je opˇet seznam typu ArrayList objekt˚ u typu String. Prvn´ım prvkem seznamu je vˇzdy n´avratov´ y k´od metody. V pˇr´ıpadˇe u ´spˇeˇsn´eho vykon´av´an´ı je dan´ ym k´odem OK, v pˇr´ıpadˇe ne´ uspˇechu je to ˇretˇezec ER. Jednoduch´ ym porovn´an´ım pak volaj´ıc´ı aktivita zjist´ı, zda m´a doj´ıt k pˇrekreslen´ı obsahu (a v takov´em pˇr´ıpadˇe zpracuje dalˇs´ı prvky seznamu), ˇci nikoli. Vˇsechny dalˇs´ı prvky v´ ystupn´ıho seznamu jsou tvoˇreny ˇsablonami urˇcen´ ymi pro pˇrekreslen´ı jednotliv´ ych fragment˚ u volaj´ıc´ı aktivity. Po dobˇehnut´ı u ´lohy na pozad´ı je v´ ysledek pˇred´an pr´avˇe volaj´ıc´ı aktivitˇe a zpracov´an´ı v´ ysledku prob´ıh´a jiˇz v r´amci hlavn´ıho UI vl´akna. V pˇr´ıpadˇe, ˇze dobˇehla volan´a metoda bez chyby, vyhodnocuje se nejprve poˇcet navr´acen´ ych ˇsablon. V pˇr´ıpadˇe, ˇze je navr´acena pouze jedna ˇsablona, je pˇrekreslen obsah aktua´ln´ıho fragmentu. V pˇr´ıpadˇe, ˇze je ˇsablon v´ıce, je pro kaˇzdou vytvoˇren nov´ y fragment, kter´emu je n´aslednˇe pˇriˇrazen obsah vznikl´ y naˇcten´ım odpov´ıdaj´ıc´ı ˇsablony. Naˇc´ıt´an´ı obsahu pˇritom prob´ıh´a stejnˇe tak, jak je pops´ano v ˇca´sti 5.1.3.
5.3
Pr´ ace s u ´ loˇ ziˇ sti
Jak bylo uvedeno v ˇca´sti 4.1, umoˇzn ˇuje z´akladn´ı aktivita polymorfn´ı aplikace staˇzen´ı ˇsablon a dex archiv˚ u z nˇekolika zdroj˚ u. Kromˇe samotn´eho zaˇr´ızen´ı a s´ıt’ov´eho URL jsou takov´ ym zdrojem i tzv. cloudov´a u ´loˇziˇstˇe. Cloud v tomto pˇr´ıpadˇe znamen´a veˇrejnˇe dostupnou sluˇzbu pro ukl´ad´an´ı dat na internetov´e servery, pˇriˇcemˇz koncov´ y uˇzivatel je oddˇelen od samotn´e technologick´e implementace a k u ´loˇziˇsti pˇristupuje pomoc´ı specializovan´e aplikace ˇci internetov´eho prohl´ıˇzeˇce. C´ılem tˇechto sluˇzeb je z´aloha dat, sd´ılen´ı dat mezi uˇzivateli a umoˇznˇen´ı dostupnosti dat uˇzivatele z nˇekolika r˚ uzn´ ych zaˇr´ızen´ı. V posledn´ıch letech se z cloudov´ ych u ´loˇziˇst’ rovnˇeˇz st´avaj´ı n´astroje pro spr´avu dokument˚ u. Mezi nejpouˇz´ıvanˇejˇs´ı sluˇzby tohoto typu patˇr´ı: • Dropbox - odhadovan´ y poˇcet uˇzivatel˚ u pˇrevyˇsuj´ıc´ı 300 milion˚ u, dostupn´e na https://www.dropbox.com/. 33
Realizace polymorfn´ı aplikace
Pr´ace s u ´loˇziˇsti
• Google Drive - odhadovan´ y poˇcet uˇzivatel˚ u 240 milion˚ u, dostupn´e na https://www.google.com/intl/cs/drive/. • OneDrive - u ´loˇziˇstˇe spoleˇcnosti Microsoft s v´ıce neˇz 250 miliony uˇzivateli, dostupn´e na https://onedrive.live.com/about/cs-cz/. • ownDrive - u ´loˇziˇstˇe sdruˇzen´ı CESNET pro akademickou sf´eru, dostupn´e na https://du.cesnet.cz/cs/navody/owncloud/start. Zdroj dat: [For14]. Vybran´a u ´loˇziˇstˇe jsou mnohdy pˇr´ımo sv´az´ana s uˇzivatelsk´ ym u ´ˇctem mobiln´ıho zaˇr´ızen´ı ˇci operaˇcn´ıho syst´emu, proto nelze povaˇzovat ˇc´ıseln´e u ´daje za re´aln´e poˇcty aktivn´ıch uˇzivatel˚ u. Vyuˇzit´ım cloudov´ ych u ´loˇziˇst’ a stahov´an´ı souboru pˇr´ımo z internetu odpad´a nutnost nahr´avat soubory do zaˇr´ızen´ı fyzick´ ym pˇripojen´ım k poˇc´ıtaˇci. Soubory je moˇzn´e nahr´avat takˇrka kdekoli. A rovnˇeˇz je moˇzn´e pouˇz´ıt u ´loˇziˇstˇe ke spr´avˇe a verzov´an´ı soubor˚ u d´ılˇc´ı aplikace. Celkovˇe se tak zlepˇsuje pohodl´ı uˇzivatele a pˇr´ıstupnost aplikace jako celku.
5.3.1
Google Drive
Platforma Android je jakoˇzto produkt spoleˇcnosti Google pˇr´ımo sv´az´ana s uˇzivatelsk´ ym u ´ˇctem zm´ınˇen´e firmy. Google Drive je tak pˇrirozenˇe podporov´an Androidov´ ymi zaˇr´ızen´ımi, nebot’ ta ke sv´e funkci vyˇzaduj´ı pˇrihl´aˇsen´ı pr´avˇe k onomu uˇzivatelsk´emu u ´ˇctu spoleˇcn´emu pro vˇsechny sluˇzby spoleˇcnosti, tedy i Google Drive. Podm´ınkou pro vyuˇz´ıv´an´ı sluˇzby je pr´avˇe u ´spˇeˇsn´e sp´arov´an´ı s u ´ˇctem sluˇzeb Google Play, kter´e jsou nativn´ı souˇca´st´ı operaˇcn´ıho syst´emu Android. Tohoto faktu bylo vyuˇzito i pˇri realizaci polymorfn´ı aplikace. Ta pˇri prvn´ım spuˇstˇen´ı uˇzivatele poˇza´d´a o pˇr´ıstup k uˇzivatelsk´emu u ´ˇctu a n´aslednˇe umoˇzn´ı stahov´an´ı soubor˚ u z cloudov´eho u ´loˇziˇstˇe. I kdyˇz je sluˇzba Google Drive automaticky synchronizov´ana na pozad´ı a umoˇzn ˇuje pˇr´ım´ y pˇr´ıstup k soubor˚ um pˇr´ımo ze s´ıtˇe ˇci z lok´aln´ı cache zaˇr´ızen´ı, je u vˇsech vybran´ ych soubor˚ u uloˇzena kopie souboru pˇr´ımo do domovsk´e sloˇzky aplikace. To umoˇzn ˇuje jednotn´e zach´azen´ı se soubory, kter´e jsou nez´avisle na zdroji ukl´ad´any do spoleˇcn´e sloˇzky pomoc´ı asynchronn´ı u ´lohy. T´ım je zajiˇstˇeno, ˇze se ve sloˇzce nach´az´ı vˇzdy nejaktu´alnˇejˇs´ı verze souboru, kterou lze pozdˇeji vyuˇz´ıt pˇri v´ ybˇeru poloˇzky z historie. Nav´ıc nem˚ uˇze doj´ıt k probl´em˚ um zp˚ usoben´ ym 34
Realizace polymorfn´ı aplikace
Pr´ace s u ´loˇziˇsti
napˇr´ıklad v´ ypadkem pˇripojen´ı pˇri naˇc´ıt´an´ı dex archivu pˇr´ımo ze s´ıt’ov´eho proudu dat.
5.3.2
Dropbox
Aˇc nen´ı sluˇzba Dropbox pˇr´ımo sv´az´ana s uˇzivatelsk´ ym u ´ˇctem zaˇr´ızen´ı tak, jako Google Drive, b´ yv´a ˇcasto souˇc´ast´ı zaˇr´ızen´ı vybran´ ych v´ yrobc˚ u hardware. Mimo to se jedn´a o cloudov´e u ´loˇziˇstˇe s nejvyˇsˇs´ım poˇctem uˇzivatel˚ u, a tak bylo logicky dalˇs´ım c´ılem podpory v polymorfn´ı aplikaci. Sluˇzba Dropbox vyuˇz´ıv´a odliˇsn´ y syst´em pˇrihl´aˇsen´ı uˇzivatele, kdy je do aplikace zaˇclenˇen plug-in12 dropboxChooser, kter´ y vyuˇz´ıv´a aplikace jiˇz pˇr´ıtomn´e v zaˇr´ızen´ı k pˇrihl´aˇsen´ı a pˇrenosu dat. Aplikace spoleˇcnosti Dropbox se tak st´av´a podm´ınkou pro vyuˇz´ıv´an´ı t´eto sluˇzby, ale na druhou stranu ˇreˇs´ı technickou str´anku spojen´ı s u ´loˇziˇstˇem, aniˇz by bylo nutn´e programovat jak´ekoli rozs´ahlejˇs´ı rozhran´ı v polymorfn´ı aplikaci. Pˇri stahov´an´ı soubor˚ uzu ´loˇziˇstˇe Dropbox je v polymorfn´ı aplikaci vyuˇzito toho, ˇze sluˇzba Dropbox poskytuje pro vybran´ y soubor URL odkaz platn´ y nˇekolik hodin. Samotn´e staˇzen´ı souboru pak prob´ıh´a zcela stejnˇe jako stahov´an´ı z jak´ehokoli URL, ale odpadaj´ı probl´emy se zad´av´an´ım zdrojov´e adresy souboru.
12
angl. pro z´ asuvn´ y modul
35
V´yznamn´e programov´e ˇc´asti
6 V´yznamn´e programov´e ˇc´asti Tato kapitola si klade za c´ıl pˇredstavit ned˚ uleˇzitˇejˇs´ı ˇc´asti polymorfn´ı aplikace a jejich funkci. Pro bliˇzˇs´ı sezn´amen´ı s k´odem aplikace vˇsak doporuˇcuji pˇr´ımo prohl´ıdku zdrojov´ ych k´od˚ u, kter´e jsou souˇca´st´ı CD pˇriloˇzen´eho k t´eto pr´aci. N´asleduj´ıc´ı odstavce maj´ı slouˇzit sp´ıˇse pro lepˇs´ı pˇrehled ve funkci aplikace, nikoli nahrazovat programovou dokumentaci, i kdyˇz obsahuj´ı nˇekolik uk´azek k´odu pˇrevzat´eho pˇr´ımo z polymorfn´ı aplikace.
6.1
Bal´ık activity
V tomto bal´ıˇcku se nach´azej´ı z´akladn´ı stavebn´ı prvky aplikace - dvˇe aktivity, kter´e zajiˇst’uj´ı jej´ı chod, spr´avnou reakci prvk˚ u uˇzivatelsk´eho rozhran´ı a pr´aci s d´ılˇc´ımi komponentami aplikace.
6.1.1
MainActivity
Jedn´a se o hlavn´ı spouˇstˇec´ı tˇr´ıdu aplikace, jej´ımˇz hlavn´ım u ´ˇcelem je opatˇren´ı soubor˚ u potˇrebn´ ych pro spuˇstˇen´ı generovan´e aplikace. Tato aktivita ˇreˇs´ı pˇrihl´aˇsen´ı uˇzivatele a napojen´ı na u ´ˇcet Google Play. A z t´eto tˇr´ıdy jsou spouˇstˇeny asynchronn´ı u ´lohy pro staˇzen´ı soubor˚ u. Aktivita jako takov´a se star´a o zpracov´an´ı ud´alost´ı vznikl´ ych pouˇzit´ım jednotliv´ ych prvk˚ u uˇzivatelsk´eho rozhran´ı. S kaˇzd´ ym zdrojem soubor˚ u je asociov´ano tlaˇc´ıtko uˇzivatelsk´eho rozhran´ı, kter´e obsluhuje danou volbu. Pˇr´ıkladem je v´ ybˇer souboru z Google drive na uk´azce 6.1. Po z´ısk´an´ı potˇrebn´ ych soubor˚ u je moˇzn´e spustit aktivitu ChildActivity. /* * * Otev ˇ r e nab ´ ı dku Google Drive . * @param v tla ˇ c´ ı tko Google Drive */ public void driveButtonAction ( View v ) { IntentSender intentSender = Drive . DriveApi . n e w O p e n F i l e A c t i v i t y B u i l d e r () . build ( mGoogleApiClient ) ; try {
36
V´yznamn´e programov´e ˇc´asti
Bal´ık activity
startIntentSenderForResult ( intentSender , REQUEST_CODE_OPENER , null , 0 , 0 , 0) ; } catch ( IntentSender . S endInte ntExcept ion e ) { Log . w ( " Google API " , " Unable to send intent " , e ) ; } }
Uk´azka k´odu 6.1: V´ ybˇer souboru z Google Drive
6.1.2
ChildActivity
Tato aktivita obaluje samotnou generovanou aplikaci. D˚ uleˇzit´ ym atributem t´eto aktivity je ArrayList
content - seznam s obsahy jednotliv´ ych fragment˚ u. Po spuˇstˇen´ı t´eto aktivity se vytvoˇr´ı instance tˇr´ıdy XmlParser parser, kter´a prov´ad´ı pˇreveden´ı prvk˚ u z textov´e podoby na objekty uˇzivatelsk´eho rozhran´ı. N´azvy soubor˚ u vybran´ ych uˇzivatelem v prvn´ı aktivitˇe jsou pˇred´any pomoc´ı sd´ılen´ ych preferenc´ı programu, odkud jsou po vytvoˇren´ı aktivity naˇcteny. Tato aktivita se rovnˇeˇz star´a o obsluhu ud´alost´ı generovan´ ych aktivn´ımi prvky uˇzivatelsk´eho rozhran´ı. Po stisku tlaˇc´ıtka doch´az´ı k obslouˇzen´ı jeho pˇridruˇzen´e funkce metodou processFunction a pˇr´ıpadnˇe k vytvoˇren´ı asynchronn´ı u ´lohy ProcessFunctionTask pro obsluhu t´eto funkce, pokud je typ funkce replace. U takov´ ych funkc´ı se provedou n´asleduj´ıc´ı kroky: 1. Vybr´an´ı vˇsech objekt˚ u View v aktu´aln´ım fragmentu prohled´an´ım odpov´ıdaj´ıc´ı poloˇzky seznamu content metodou getAllChildrenBFS. 2. Zpracov´an´ı obsahu vˇsech poloˇzek typu EditText a CheckBox a vytvoˇren´ı seznamu parametr˚ u pro volanou funkci. 3. Vytvoˇren´ı a spuˇstˇen´ı asynchronn´ı u ´lohy pro obsluhu dan´e funkce s odpov´ıdaj´ıc´ımi parametry. U prvk˚ u typu TextView s aktivn´ım obsahem (url, e-mailov´a adresa, telefonn´ı ˇc´ıslo) pak zajiˇst’uje spuˇstˇen´ı spr´avn´eho Intent s odpov´ıdaj´ıc´ım parametrem. Napˇr´ıklad pˇred´a jako parametr telefonn´ı ˇc´ıslo a vytvoˇr´ı metodou startDialerIntent odpov´ıdaj´ıc´ı Intent.ACTION DIAL. Pro ostatn´ı typy obsahu funguje spouˇstˇen´ı odpov´ıdaj´ıc´ıch aplikac´ı analogicky. Uk´azka 6.2 pˇredstavuje vyvol´an´ı e-mailov´eho klienta. 37
V´yznamn´e programov´e ˇc´asti
Bal´ık activity
/* * * Spust ´ ı intent a otev ˇ r e aplikaci asociovanou s elektronickou po ˇ s tou . * @param address e - mailov ´ a adresa z TextView . */ private void startMailIntent ( String address ) { String [] adresses = new String []{ address }; Intent intent = new Intent ( Intent . ACTION_SENDTO ) ; // omezuje v ´ ybˇ e r na e - mail intent . setData ( Uri . parse ( " mailto : " ) ) ; intent . putExtra ( Intent . EXTRA_EMAIL , adresses ) ; if ( intent . resolveActivity ( getPackageManager () ) != null ) { startActivity ( intent ) ; } }
Uk´azka k´odu 6.2: Intent mailov´e aplikace Aktivita rovnˇeˇz umoˇzn ˇuje dynamickou pr´aci s fragmenty pomoc´ı metod duplicateFragment a removeFragment dostupn´ ymi pomoc´ı tlaˇc´ıtek v n´astrojov´e liˇstˇe. Po dokonˇcen´ı asynchronn´ı u ´lohy vyhodnocuje navr´acen´e v´ ysledky a na z´akladˇe jejich poˇctu bud’ nahrad´ı obsah aktu´aln´ıho fragmentu metodou updateFragment (viz uk´azka 6.3), nebo vytvoˇr´ı a pˇrid´a nov´e fragmenty pomoc´ı metody addFragment. /* * * Pou ˇ z ije p ˇ r edan ´ e View jako obsah aktu ´ a ln ´ ı ho fragmentu . * @param fragmentContent budouc ´ ı obsah fragmentu */ private void updateFragment ( View fragmentContent ) { if ( fragmentContent == null ) { return ; } // aktu ´ a ln ´ ı polo ˇ z ka int currentIndex = mViewPager . getCurrentItem () ; View v = content . get ( currentIndex ) ; String title = fragmentContent . getTag ( R . id . title_key ) . toString () ; // asociace s p ˚ u vodn ´ ı s ˇ ablonou fragmentContent . setTag ( R . id . resource_key , v . getTag ( R . id . resource_key ) ) ; // aktualizace z ´ a lo ˇ z ek
38
V´yznamn´e programov´e ˇc´asti
Bal´ık fragment
ActionBar actionBar = ge tSupport ActionB ar () ; actionBar . getTabAt ( currentIndex ) . setText ( title ) ; // aktualizace obsahu content . set ( currentIndex , fragmentContent ) ; updateImages () ; m Se ct i on s Pa ge r Ad ap t er . not if yDa ta Set Ch ang ed () ; }
Uk´azka k´odu 6.3: Nahrazen´ı obsahu fragmentu Pˇri prvn´ım naˇcten´ı fragmentu, kter´ y obsahuje obr´azky typu ImageView s pˇriˇrazen´ ym URL, spouˇst´ı tato aktivita asynchronn´ı u ´lohu DownloadImageTask, kter´a provede jejich staˇzen´ı a pˇriˇrazen´ı do odpov´ıdaj´ıc´ıch prvk˚ u.
6.2
Bal´ık fragment
Tento bal´ık obsahuje dvˇe tˇr´ıdy zajiˇst’uj´ıc´ı spr´avnou pr´aci s fragmenty. Jedn´a se o tˇr´ıdu PlaceholderFragment, kter´a pˇredstavuje samotn´ y fragment, a tˇr´ıdu SectionsPagerAdapter, kter´a se star´a o spr´avn´e vytv´aˇren´ı z´aloˇzek v n´astrojov´em panelu pomoc´ı metody z uk´azky 6.4. /* * * Na ˇ c te spr ´ a vn ´ y titulek pro fragment . * @param position pozice fragmentu . * @return TITULEK */ @Override public CharSequence getPageTitle ( int position ) { Locale l = Locale . getDefault () ; String title = " " ; View v = ChildActivity . content . get ( position ) ; title = v . getTag ( R . id . title_key ) . toString () ; if ( title . isEmpty () ) { title = " Fragment " + position ; } return title . toUpperCase ( l ) ; }
Uk´azka k´odu 6.4: Naˇcten´ı titulku fragmentu 39
V´yznamn´e programov´e ˇc´asti
Bal´ık task
Vytvoˇren´ı nov´eho fragmentu prob´ıh´a tak, ˇze si novˇe vytvoˇren´a instance vybere ze seznamu prvk˚ u content tˇr´ıdy ChildActivity poloˇzku na odpov´ıdaj´ıc´ım indexu a pˇrevezme jej´ı obsah. Pˇri naˇcten´ı tohoto fragmentu dojde k vloˇzen´ı obsahu do layoutu fragmentu. Pˇri pˇrechodu na jin´ y fragment dojde k odstranˇen´ı tohoto obsahu. T´ım je zajiˇstˇeno, ˇze se v pamˇeti neuchov´av´a zbyteˇcnˇe mnoho naˇcten´ ych fragment˚ u, kter´e nejsou potˇreba. Veˇsker´a pr´ace s fragmenty je pˇritom obsluhov´ana pomoc´ı instance tˇr´ıdy SectionsPagerAdapter v aktivitˇe ChildActivity.
6.3
Bal´ık task
Bal´ık task obsahuje definice vˇsech asynchronn´ıch u ´loh pouˇz´ıvan´ ych pˇri bˇehu aplikace. Vˇsechny obsaˇzen´e tˇr´ıdy dˇed´ı od tˇr´ıdy AsyncTask a liˇs´ı se pouze funkc´ı, kterou vykon´avaj´ı, a parametry, kter´e pouˇz´ıvaj´ı.
6.3.1
IOnTaskCompleted
Jedn´a se o rozhran´ı, kter´e mus´ı implementovat aktivity, aby bylo moˇzn´e spustit zpracov´an´ı v´ ysledku okamˇzitˇe po dobˇehnut´ı asynchronn´ı u ´lohy. Doba vykon´av´an´ı u ´lohy nikdy nen´ı pˇredem zn´ama. Pouˇzit´ım tohoto rozhran´ı lze ale vˇzdy spolehlivˇe vyvolat obsluˇznou ud´alost aktivity, jakmile je u ´loha dokonˇcena.
6.3.2
CopyFileTask
Asynchronn´ı u ´loha pro kop´ırov´an´ı souboru v r´amci pamˇeti zaˇr´ızen´ı. Vˇsechny soubory pouˇz´ıvan´e aplikac´ı jsou uchov´av´any ve spoleˇcn´e domovsk´e sloˇzce v intern´ı pamˇeti zaˇr´ızen´ı, nebot’ naˇc´ıt´an´ı archiv˚ u dex z extern´ı pamˇeti nen´ı moˇzn´e. Proto je nutn´e soubory z pamˇet’ov´e karty pˇresunout pr´avˇe do t´eto domovsk´e sloˇzky. Kop´ırovan´ y soubor je pomoc´ı tˇr´ıd FileInputStream a FileOutputStream rozdˇelen na bloky o velikosti 1024 byte a pˇresunut do odpov´ıdaj´ıc´ıho um´ıstˇen´ı. Po pˇreˇcten´ı kaˇzd´eho bloku je aktualizov´an ProgressDialog bˇeˇz´ıc´ı na UI vl´aknu, zat´ımco kop´ırov´an´ı souboru je vykon´av´ano na pozad´ı.
40
V´yznamn´e programov´e ˇc´asti
6.3.3
Bal´ık task
DownloadFileTask
Analogicky funguje asynchronn´ı u ´loha pro staˇzen´ı souboru ze zadan´eho URL. Rozd´ıln´a je v tom, ˇze nejprve mus´ı vytvoˇrit spojen´ı se vzd´alen´ ym um´ıstˇen´ım pomoc´ı HttpURLConnection. V pˇr´ıpadˇe u ´spˇeˇsn´eho pˇripojen´ı je moˇzn´e otevˇr´ıt proud pro ˇcten´ı souboru metodou url.openStream() a postupovat stejnˇe jako pˇri kop´ırov´an´ı lok´aln´ıho souboru.
6.3.4
DownloadImageTask
´ Uloha stahuj´ıc´ı obr´azky pro vybran´e prvky ImageView funguje obdobnˇe jako u ´loha pro staˇzen´ı jak´ehokoli jin´eho souboru. Jedin´ y rozd´ıl spoˇc´ıv´a v tom, ˇze naˇcten´ı souboru je zde ponech´ano pˇr´ımo na syst´emu, kter´ y poˇzadovan´ y objekt typu Bitmap vytv´aˇr´ı pomoc´ı metody BitmapFactory.decodeStream. V tomto pˇr´ıpadˇe nen´ı moˇzn´e urˇcit aktu´aln´ı f´azi dokonˇcen´ı pˇri pˇrenosu souboru, takˇze jsou moˇznosti zobrazen´eho dialogu omezen´e. V uk´azce 6.5 je uvedena ˇc´ast tˇela metody doInBackground, kter´a definuje vˇsechny asynchronn´ı u ´lohy. // p ˇ r evod adresy na URL url = new URL ( urlString ) ; // vytvo ˇ r en ´ ı spojen ´ ı connection = ( HttpURLConnection ) url . openConnection () ; connection . connect () ; // o ˇ c ek ´ av´ a me HTTP 200 OK , v opa ˇ cn´ em pˇ r´ ı pad ˇ e by mohlo doj ´ ıt // ke sta ˇ z en ´ ı chybov ´ e zpr ´ a vy m ´ ı sto souboru if ( connection . getResponseCode () != HttpURLConnection . HTTP_OK ) { errorString = " Server returned HTTP " + connection . getResponseCode () + " " + connection . getResponseMessage () ; return null ; } // vytvo ˇ r en ´ ı bitmapy InputStream is = connection . getInputStream () ; bm = BitmapFactory . decodeStream ( is ) ;
Uk´azka k´odu 6.5: Staˇzen´ı obr´azku z URL
41
V´yznamn´e programov´e ˇc´asti
Bal´ık type
Objekt Bitmap je uloˇzen v cache zaˇr´ızen´ı jako doˇcasn´ y soubor. Protoˇze nen´ı moˇzn´e z vl´akna bˇeˇz´ıc´ıho na pozad´ı upravovat prvky uˇzivatelsk´eho rozhran´ı vytvoˇren´e UI vl´aknem, je z´ıskan´a instance objektu Bitmap pˇred´ana ke zpracov´an´ı aktivitˇe ChildActivity, kter´a se star´a o spr´avn´e pˇriˇrazen´ı do prvku ImageView.
6.3.5
DriveFileTask
Tato u ´loha m´a za u ´kol opatˇrit lok´aln´ı kopii souboru um´ıstˇen´eho v u ´loˇziˇsti Google Drive. Z dialogu sluˇzby Google Drive je v´ ybˇerem souboru z´ısk´ano jeho DriveId. Podle tohoto u ´daje je moˇzn´e vytvoˇrit instanci objektu DriveFile a pomoc´ı nˇekolika metod sluˇzeb Google Drive z´ıskat i jeho z´akladn´ı metadata - n´azev a velikost. Pokud je spojen´ı se sluˇzbou Google Drive u ´spˇeˇsnˇe otevˇren´e, lze vytvoˇrit instanci objektu DriveContents, ze kter´e je d´ale moˇzn´e z´ıskat proudov´ y vstup a zkop´ırovat soubor jako pˇri norm´aln´ım stahov´an´ı.
6.3.6
ProcessFunctionTask
ProcessFunctionTask je u ´loha slouˇz´ıc´ı ke spuˇstˇen´ı funkce z archivu typu dex. Pomoc´ı n´astroje DexClassLoader je moˇzn´e z´ıskat instanci c´ılov´e tˇr´ıdy z pˇripraven´eho archivu. N´aslednˇe je pomoc´ı reflexe zavol´ana metoda doLibraryFunction instance t´eto tˇr´ıdy. Tento postup je pops´an jiˇz v kapitole 5.2.2. Nev´ yhodou takov´eho vol´an´ı metody je fakt, ˇze nen´ı moˇzn´e urˇcit, kolik zb´ yv´a ˇcasu k dokonˇcen´ı metody. Podle v´ ykonu zaˇr´ızen´ı a rychlosti pˇripojen´ı k internetu se tak m˚ uˇze doba potˇrebn´a k proveden´ı operace velmi liˇsit.
6.4
Bal´ık type
Obsahem tohoto bal´ıku je tˇr´ıda Function, kter´a slouˇz´ı pouze jako objekt pro uloˇzen´ı informac´ı o funkci, kter´a m´a b´ yt vol´ana po stisknut´ı tlaˇc´ıtka, kter´emu je pˇriˇrazena. Oddˇelen´ı funkce jako samostatn´eho objektu umoˇzn ˇuje pouˇzit´ı vyˇsˇs´ı m´ıry abstrakce a jednoduˇsˇs´ı pˇred´av´an´ı parametr˚ u v pr˚ ubˇehu zpracov´an´ı funkce. Dalˇs´ım prvkem bal´ıku je rozhran´ı ILibraryFunction, kter´e sice nen´ı v po42
V´yznamn´e programov´e ˇc´asti
Bal´ık util
lymorfn´ı aplikaci pˇr´ımo vyuˇz´ıv´ano, jeho implementace je vˇsak vyˇzadov´ana u d´ılˇc´ıch funkc´ı generovan´e aplikace, aby bylo moˇzn´e je spouˇstˇet jednotn´ ym pˇr´ıstupem popsan´ ym v ˇc´asti 5.2.2.
6.5
Bal´ık util
Souˇca´st´ı tohoto bal´ıˇcku jsou tˇr´ıdy, kter´e pˇr´ımo nezasahuj´ı do chodu aplikace, nicm´enˇe poskytuj´ı n´astroje a metody nutnˇe potˇrebn´e pro jej´ı spr´avnou funkci.
6.5.1
Utilities
Tato tˇr´ıda se star´a zejm´ena o pr´aci se soubory na u ´rovni kontroly jejich existence, vytv´aˇren´ı potˇrebn´ ych adres´aˇr˚ u a jejich pˇr´ıpadn´e odstranˇen´ı. Dalˇs´ı d˚ uleˇzitou funkc´ı tˇr´ıdy Utilities je pr´ace se shared preferences, kter´e pˇredstavuj´ı zp˚ usob, jak ukl´adat data aplikace pro pozdˇejˇs´ı pouˇzit´ı - napˇr´ıklad historii naˇcten´ ych soubor˚ u a dalˇs´ı u ´daje. Uk´azka k´odu 6.6 pˇredstavuje metodu, kter´a prov´ad´ı uloˇzen´ı jedn´e hodnoty do seznamu ˇretˇezc˚ u v shared preferences. /* * * Pˇ r id ´ a uvedenou hodnotu do odpov ´ ı daj ´ ıc´ ı ho seznamu v shared Preferences . * @param context Kontext volaj ´ ıc´ ı aplikace * @param key Kl ´ ıˇ c pro v y ´bˇ e r seznamu * @param value Hodnota pro p ˇ r id ´ an´ ı */ public static void writeToSet ( Context context , String key , String value ) { Set < String > values = new HashSet < String >() ; Set < String > data = getPreferences ( context ) . getStringSet ( key , values ) ; values . addAll ( data ) ; values . add ( value ) ; getEditor ( context ) . putStringSet ( key , values ) . commit () ; }
Uk´azka k´odu 6.6: Z´apis do shared preferences Pouˇzit´ım t´eto tˇr´ıdy je zajiˇstˇeno, ˇze ani jedna aktivita nemus´ı zn´at pˇresn´e um´ıstˇen´ı domovsk´e sloˇzky v souborov´em syst´emu zaˇr´ızen´ı, aby mohla pra43
V´yznamn´e programov´e ˇc´asti
Bal´ık util
covat se soubory. V´ yznamnou metodou je pak napˇr´ıklad metoda getPath, kter´a pˇrev´ad´ı obecn´ y identifik´ator um´ıstˇen´ı souboru na zaˇr´ızen´ı Android na skuteˇcnou cestu k tomuto souboru. V t´eto tˇr´ıdˇe je rovnˇeˇz um´ıstˇena metoda pro zjiˇstˇen´ı aktu´aln´ıho stavu pˇripojen´ı k s´ıti isOnline uveden´a na uk´azce 6.7. /* * * Zjist ´ ı , zda je za ˇ r´ ı zen ´ ı pˇ r ipojeno k s ´ ı ti . * @param context Kontext volaj ´ ıc´ ı aktivity . * @return true pro aktivn ´ ı pˇ r ipojen ´ ı , jinak false */ private boolean isOnline ( Context context ) { try { Conn ectivity Manager cm = ( Connec tivityM anager ) context . getSystemService ( Context . C ON NEC TI VIT Y_S ER VIC E ) ; return cm . g etA ct ive Ne two rk Inf o () . i s C o n n e c t e d O r C o n n e c t i n g () ; } catch ( Exception e ) { return false ; } }
Uk´azka k´odu 6.7: Ovˇeˇren´ı pˇripojen´ı k s´ıti
6.5.2
XmlParser
XmlParser je tˇr´ıda kl´ıˇcov´a pro zpracov´an´ı vˇsech XML ˇsablon a jejich pˇreveden´ı na prvky grafick´eho rozhran´ı. Samotn´e prvky je nutn´e vytv´aˇret v UI vl´aknˇe, kter´e je posl´eze ovl´ad´a. Proto jsou tvoˇreny v r´amci kontextu Child Activity, kter´a parser instancuje. Pr˚ ubˇeh vytv´aˇren´ı grafick´eho rozhran´ı generovan´e aplikace je pops´an jiˇz v ˇc´asti 5.1. Z hlediska tˇr´ıdy XmlParser se skl´ad´a z n´asleduj´ıc´ıch krok˚ u: 1. Parsov´an´ı vstupn´ıho souboru ˇci stringov´eho vstupu pomoc´ı instance tˇr´ıdy DocumentBuilder. 2. Rozdˇelen´ı na jednotliv´e fragmenty, pokud je jich obsaˇzeno v´ıce. 44
V´yznamn´e programov´e ˇc´asti
Bal´ık util
3. Vytvoˇren´ı obaluj´ıc´ıho LinearLayout, do kter´eho se vˇsechny dalˇs´ı prvky vybran´eho fragmentu pˇridaj´ı, metodou parseFragmentContent. 4. Proch´azen´ı struktury prvk˚ u do hloubky pomoc´ı rekurzivn´ı metody parseNode. 5. Pˇreveden´ı vybran´eho elementu ˇsablony na odpov´ıdaj´ıc´ı prvek uˇzivatelsk´eho rozhran´ı a pˇriˇrazen´ı vˇsech atribut˚ u. N´asleduj´ıc´ı uk´azka 6.8 pˇredstavuje metodu pro pˇreveden´ı jednoho uzlu ˇsablony na prvek uˇzivatelsk´eho rozhran´ı (viz bod 4 v pˇredch´azej´ıc´ım seznamu). /* * * Pˇ r evede vybran ´ y uzel ˇ s ablony na prvek rozhran ´ ı. * @param node prvek ˇ s ablony * @return prvek u ˇ z ivatelsk ´ e ho rozhran ´ ı */ private View parseNode ( Node node ) { View v = null ; Element ele = ( Element ) node ; String nodename = ele . getTagName () ; switch ( nodename ) { case ( " linearlayout " ) : v = parseLinearLayout ( ele ) ; break ; case ( " button " ) : v = parseButton ( ele ) ; break ; case ( " textview " ) : v = parseTextView ( ele ) ; break ; case ( " edittext " ) : v = parseEditText ( ele ) ; break ; case ( " checkbox " ) : v = parseCheckBox ( ele ) ; break ; case ( " imageview " ) : v = parseImageView ( ele ) ; break ; default : v = parseTextView ( ele ) ; }
45
V´yznamn´e programov´e ˇc´asti
Bal´ık util
String weightValue = ele . getAttribute ( " weight " ) ; LinearLayout . LayoutParams defaultLP = new LinearLayout . LayoutParams ( LinearLayout . LayoutParams . MATCH_PARENT , LinearLayout . LayoutParams . MATCH_PARENT , parseWeight ( weightValue ) ) ; v . setLayoutParams ( defaultLP ) ; return v ; }
Uk´azka k´odu 6.8: Parsov´an´ı uzl˚ u ˇsablony Posledn´ı uk´azka t´eto kapitoly 6.9 pˇredstavuje vytvoˇren´ı prvku uˇzivatelsk´eho rozhran´ı z elementu ˇsablony. Jedn´a se o metodu volanou z k´odu v uk´azce 6.8. Vytv´aˇren´ı ostatn´ıch prvk˚ u uˇzivatelsk´eho rozhran´ı prob´ıh´a analogicky, liˇs´ı se jen pouˇzit´e atributy element˚ u, kter´e popisuje pˇr´ıloha C. /* * * Vytvo ˇ r´ ı z elementu ˇ s ablony prvek u ˇ z ivatelsk ´ e ho rozhran ´ ı EditText * @param e vybran ´ y element ˇ s ablony * @return Vytvo ˇ r en ´ a instance objektu EditText */ private EditText parseEditText ( Element e ) { EditText et = new EditText ( appContext ) ; et . setTextSize ( TypedValue . COMPLEX_UNIT_PX , appContext . getResources () . getDimension ( R . dimen . a b c _ t e x t _ s i z e _ m e d i u m _ m a t e r i a l ) ) ; et . setHint ( e . getAttribute ( " hint " ) . trim () ) ; et . setTag ( e . getAttribute ( " tag " ) ) ; String inputTypeValue = e . getAttribute ( " type " ) ; switch ( inputTypeValue ) { case ( " datetime " ) : et . setInputType ( InputType . T YPE_CLA SS_DATE TIME ) ; break ; case ( " number " ) : et . setInputType ( InputType . TYPE_CLASS_NUMBER ) ; break ; case ( " phone " ) : et . setInputType ( InputType . TYPE_CLASS_PHONE ) ; break ; case ( " multiline " ) :
46
V´yznamn´e programov´e ˇc´asti
Bal´ık util
et . setSingleLine ( false ) ; et . s e t H o r i z o n t a l S c r o l l B a r E n a b l e d ( false ) ; break ; case ( " text " ) : default : et . setInputType ( InputType . TYPE_CLASS_TEXT ) ; } return et ; }
Uk´azka k´odu 6.9: Vytvoˇren´ı prvku EditText Pˇri naˇc´ıt´an´ı ˇsablony ze souboru se kaˇzd´ y naˇcten´ y fragment ukl´ad´a do struktury Map<String, ArrayList > fragmentSources, ve kter´e je asociov´an sv´ ym titulkem. V pˇr´ıpadˇe, ˇze je tˇreba duplikovat vybran´ y fragment uˇzivatelsk´eho rozhran´ı, dojde k v´ ybˇeru pˇredpˇripraven´eho obsahu pˇr´ımo z t´eto zdrojov´e mapy. Toto ˇreˇsen´ı je zvoleno z d˚ uvodu, ˇze samotn´e prvky uˇzivatelsk´eho rozhran´ı nejde jednoduˇse duplikovat, pokud jsou jiˇz vytvoˇreny v kontextu aktivity ChildActivity. Naˇcten´ım prvk˚ u z mapy tak lze efektivnˇe a rychle prov´est duplikaci fragmentu se zcela nov´ ymi prvky, coˇz je d˚ uleˇzit´e hlavnˇe pro fragmenty, u kter´ ych jiˇz byl p˚ uvodn´ı obsah nahrazen v´ ystupem z volan´e funkce generovan´e aplikace.
47
Uk´azkov´e aplikace
7 Uk´azkov´e aplikace Funkcionalitu polymorfn´ı aplikace je moˇzn´e nejl´epe prezentovat na sadˇe generovan´ ych aplikac´ı, kter´e pod polymorfn´ı aplikac´ı bˇeˇz´ı. Jedn´a se o aplikace, kter´e byly vytvoˇreny nez´avisle, jako samostatn´e projekty v jazyce Java, ve v´ yvojov´em prostˇred´ı Eclipse1 . Aplikace byly z´amˇernˇe vytvoˇreny oddˇelenˇe od mateˇrsk´e aplikace, bez pouˇzit´ı jak´ ychkoli funkc´ı ˇci prvk˚ u platformy Android, aby bylo uk´az´ano, ˇze se jedn´a o samostatnˇe bˇeˇz´ıc´ı ˇreˇsen´ı, kter´e lze do polymorfn´ı aplikace jednoduˇse integrovat. Vzhledem ke zp˚ usobu, kter´ ym aplikace vznikly, je lze spustit pouˇz´ıt dvˇema zp˚ usoby zn´azornˇen´ ymi na obr´azku 7.1.
Obr´azek 7.1: Spuˇstˇen´ı uk´azkov´ ych aplikac´ı
1. Jako standardn´ı desktopov´e aplikace s rozhran´ım v´ yvojov´eho prostˇred´ı, pˇr´ıpadnˇe konzolov´ ym rozhran´ım. Aplikace v takov´em pˇr´ıpadˇe naˇc´ıt´a jen nezbytnˇe nutn´e parametry a v´ ystupem je form´atovan´ y text do konzolov´eho rozhran´ı. 2. Jako j´adro generovan´e mobiln´ı aplikace, kter´e je spuˇstˇeno z uˇzivatelsk´eho rozhran´ı odpov´ıdaj´ıc´ı ˇsablony. Program se provede v r´amci asynchronn´ı u ´lohy polymorfn´ı aplikace, vstupem je seznam text˚ u editovateln´ ych prvk˚ u rozhran´ı a seznam hodnot nastaven´ ych pomoc´ı CheckBox˚ u v rozhran´ı. V´ ystupem je pak jedna nebo v´ıce ˇsablon vygenerovan´ ych z nalezen´ ych v´ ysledk˚ u. 1
Pouˇzit´ a verze: Eclipse Standard, Kepler Service Release 1, Build id: 20130919-0819
48
Uk´azkov´e aplikace
7.1
Omezen´ı a poˇzadavky
Omezen´ı a poˇ zadavky
Pokud nem´a uˇzivatel k dispozici jiˇz hotov´ y dex archiv s v´ ykonn´ ym k´odem aplikace, je tˇreba pˇred pouˇzit´ım aplikace v mobiln´ım zaˇr´ızen´ı aplikaci nejprve pˇrekompilovat do poˇzadovan´eho form´atu. D˚ uvody pro tento krok popisuje kapitola 5.2. Pˇresn´ y postup pak popisuje pˇr´ıloha B.3. Kv˚ uli omezen´ım dan´ ym kompilac´ı k´odu do dex archivu nen´ı moˇzn´e pouˇz´ıvat v r´amci d´ılˇc´ı aplikace knihovny tˇret´ıch stran. Respektive nen´ı moˇzn´e zaruˇcit, ˇze ve v´ ysledn´em dex archivu budou obsaˇzeny veˇsker´e komponenty nutn´e pro spr´avn´ y chod programu. V pˇr´ıpadˇe, ˇze d´ılˇc´ı aplikace knihovnu tˇret´ıch stran vyuˇz´ıv´a, je lepˇs´ı pˇriloˇzit soubor knihovny do projektu polymorfn´ı aplikace dle n´avodu v pˇr´ıloze B.4, a to i v pˇr´ıpadˇe, ˇze samotn´a polymorfn´ı aplikace ˇza´dnou funkci dan´e knihovny nevyuˇz´ıv´a. Uveden´e aplikace pracuj´ı na b´azi hled´an´ı odpov´ıdaj´ıc´ıch informac´ı na internetu, takˇze je pro jejich bˇeh vyˇzadov´ano aktivn´ı pˇripojen´ı k s´ıti v mobiln´ı i desktopov´e podobˇe. Je rovnˇeˇz tˇreba db´at na to, aby vytvoˇren´a aplikace nepˇrekraˇcovala syst´emov´a povolen´ı polymorfn´ı aplikace popsan´a v pˇr´ıloze A.
7.2
ˇ cka RSS Cteˇ
RSS2 je podskupinou jazyka XML. P˚ uvodnˇe bylo vytvoˇreno jako form´at pro v´ ymˇenu informac´ı mezi poˇc´ıtaˇcov´ ymi servery, ale v souˇcasn´e dobˇe je vˇseobecnˇe vyuˇz´ıv´ano jako kan´al pro zas´ıl´an´ı novinek - zpr´av, zveˇrejnˇen´ ych ˇcl´ank˚ u atd. Z´akladem ˇcten´ı RSS zpr´av je pˇripojen´ı se k vybran´emu kan´alu, identifikovan´emu odpov´ıdaj´ıc´ım URL. V r´amci tohoto kan´alu (channel ) jsou pak postupnˇe zveˇrejˇ nov´any jednotliv´e pˇr´ıspˇevky (item). V uk´azkov´e aplikaci byla pouˇzita specifikace RSS 2.0.1 popsan´a v [Rss09] jako nejuniverz´alnˇejˇs´ı struktura zdroje zpr´av, i kdyˇz v souˇcasnosti nab´ yvaj´ı na v´ yznamu novˇejˇs´ı ˇreˇsen´ı, ˇ sen´ı RSS 2 je vˇsak nejrozˇs´ıˇrenˇejˇs´ı napˇr´ıklad Atom definovan´ y v [Not05]. Reˇ zejm´ena z historick´ ych d˚ uvod˚ u. C´ılem aplikace je pak zpˇr´ıstupnˇen´ı novinek z vybran´ ych kan´al˚ u ve formˇe ˇciteln´e na displeji mobiln´ıho zaˇr´ızen´ı. Uˇzivatel zad´av´a do aplikace pouze dva 2
Really Simple Syndication - angl. pro Velmi jednoduch´a syndikace obsahu
49
ˇ cka RSS Cteˇ
Uk´azkov´e aplikace
u ´daje - adresu zdroje a poˇcet pˇr´ıspˇevk˚ u, kter´e se maj´ı naˇc´ıst. D´ale je moˇzn´e specifikovat, zda se m´a pro naˇcten´e pˇr´ıspˇevky stahovat i obrazov´ y materi´al ´ z pˇr´ılohy pˇr´ıspˇevku. Uvodn´ı obrazovku generovan´e aplikace pˇredstavuje obr´azek 7.2.
´ Obr´azek 7.2: Uvodn´ ı obrazovka RSS ˇcteˇcky Na obr´azku 7.2 je tak´e patrn´e, ˇze u poloˇzek typu EditText lze vybrat jeden z typ˚ u vstupu, kter´emu se pak pˇrizp˚ usob´ı rozloˇzen´ı kl´avesnice na zaˇr´ızen´ı. V´ıce o definici prvk˚ u uˇzivatelsk´eho rozhran´ı se lze doˇc´ıst v pˇr´ıloze C. Po naˇcten´ı vybran´eho zdroje probˇehne jeho parsov´an´ı pomoc´ı DOM parseru. P˚ uvodnˇe byl pouˇzit StAX3 parser inspirovan´ y ˇreˇsen´ım uveden´ ym ve [Vog13]. Bohuˇzel zde doch´az´ı k tomu probl´emu, ˇze tˇr´ıdy bal´ıku javax.xml stream.events nejsou implementov´any v z´akladn´ıch prostˇredc´ıch platformy 3
Streaming API for XML - angl. pro Rozhran´ı pro ˇcten´ı XML proud˚ u.
50
ˇ cka RSS Cteˇ
Uk´azkov´e aplikace
Android, aˇc se jedn´a o zcela bˇeˇznˇe pouˇz´ıvan´ y prostˇredek standardn´ı verze jazyka Java. Nam´ısto integrace potˇrebn´ ych knihoven do polymorfn´ı aplikace tak bylo zvoleno n´ahradn´ı ˇreˇsen´ı a parser RSS zdroje byl kompletnˇe pˇredˇel´an. Pro u ´plnost ale uv´ad´ım, ˇze platforma Android nemus´ı podporovat ani nˇekter´e funkce jazyka Java verze 7, pokud jsou ve tˇr´ıd´ach naˇc´ıtan´ ych pomoc´ı DexClassLoaderu. A je tak lepˇs´ı se nov´ ym prvk˚ um jazyka Java radˇeji vyhnout, napˇr´ıklad pˇr´ıkaz switch s parametrem typu String nemus´ı b´ yt vˇzdy bezpeˇcn´ y, aˇckoli ho vyuˇz´ıv´a samotn´a polymorfn´ı aplikace. @Override public String toString () { return " Feed [ copyright = " + copyright + " , description = " + description + " , language = " + language + " , link = " + link + " , pubDate = " + pubDate + " , title = " + title + " , lastBuildDate = " + lastBuildDate + " ] " ; }
Uk´azka k´odu 7.1: Atributy objektu Feed Po zpracov´an´ı zdrojov´eho souboru parserem prob´ıh´a pˇreveden´ı na odpov´ıdaj´ıc´ı objekty - Feed a FeedMessage. Jednotliv´e atributy objekt˚ u jsou ukl´ad´any v podobˇe ˇretˇezce a jsou pojmenov´any stejn´ ymi n´azvy jako v definici RSS zdroj˚ u. Proto nam´ısto v´ yˇctu uv´ad´ım pouze metody v´ ypisu objekt˚ u na konzoli, kter´e jsou dostateˇcnˇe n´azorn´e. @Override public String toString () { return " FeedMessage [ title = " + title + " , description = " + description + " , link = " + link + " , author = " + author + " , guid = " + guid + " , pubDate = " + pubDate + " , enclosureType = " + enclosureType + " , enclosureURL = " + enclosureURL + " ] " ; }
Uk´azka k´odu 7.2: Atributy objektu FeedMessage Jednotliv´e poloˇzky FeedMessage mohou ve zdrojov´em souboru obsahovat prvek enclosure, kter´ y znaˇc´ı pˇr´ıtomnost pˇridan´eho obsahu ve formˇe souboru.
51
ˇ cka RSS Cteˇ
Uk´azkov´e aplikace
Napˇr´ıklad: < enclosure url = " http: // www . scripting . com / mp3s /\\ weatherReportSuite . mp3 " length = " 12216320 " type = " audio / mpeg " />
Uk´azka k´odu 7.3: Enclosure - zvukov´ y soubor Pokud uˇzivatel vybere moˇznost stahov´an´ı obr´azk˚ u v RSS zpr´av´ach a pokud zpr´ava obsahuje pˇr´ılohu typu image, uloˇz´ı se zdrojov´e URL obr´azku do objektu FeedMessage. Jelikoˇz ale modul aplikace neˇreˇs´ı pr´aci se souborov´ ym syst´emem, nen´ı moˇzn´e obr´azek rovnou uloˇzit. Nahr´av´an´ı obr´azk˚ u prob´ıh´a aˇz pˇri prvn´ım zobrazen´ı dan´eho prvku v c´ılov´em fragmentu aplikace. Aby bylo moˇzn´e staˇzen´ı prov´est, je tˇreba pˇredat aplikaci URL v bezpeˇcn´e podobˇe, kter´a nenaruˇs´ı strukturu v´ ysledn´e XML ˇsablony. K pˇreveden´ı obvykle slouˇz´ı vybran´a metoda bal´ıku java.net, nicm´enˇe ta byla nahrazena vlastn´ım ˇreˇsen´ım, aby bylo moˇzn´e se vyhnout jak´ekoli z´avislosti na extern´ıch knihovn´ach. /* * Pˇ r evede URI na bezpe ˇ cn´ y ˇ r et ˇ e zec * @param s p ˚ u vodn ´ ı ˇ r et ˇ e zec * @return p ˇ r eveden ´ y ˇ r et ˇ e zec */ private String encodeURIcomponent ( String s ) { StringBuilder o = new StringBuilder () ; for ( char ch : s . toCharArray () ) { if ( isUnsafe ( ch ) ) { o . append ( ’ \% ’ ) ; o . append ( toHex ( ch / 16) ) ; o . append ( toHex ( ch \% 16) ) ; } else o . append ( ch ) ; } return o . toString () ; } /* * * Vrac ´ ı hexa decim ´ a ln ´ ı hodnotu znaku . * @param ch znak k p ˇ r eveden ´ ı * @return hexadecim ´ a ln ´ ı hodnota */ private char toHex ( int ch ) { return ( char ) ( ch < 10 ? ’ 0 ’ + ch : ’ A ’ + ch - 10) ; } /* *
52
ˇ Kontakty ZCU
Uk´azkov´e aplikace
* Kontroluje bezpe ˇ c nost znak ˚ u * @param ch zkouman ´ y znak * @return true pro speci ´ a ln ´ ı znaky , false pro ostatn ´ ı */ private boolean isUnsafe ( char ch ) { if ( ch > 128 || ch < 0) return true ; return " % $ &+ ,/:;=? @ < ># ’ ‘ \"\\ " . indexOf ( ch ) >= 0; }
Uk´azka k´odu 7.4: Pˇreveden´ı URL na bezpeˇcn´ y ˇretˇezec Stejn´ y postup je pouˇzit pro samotn´ y odkaz na plnou verzi zpr´avy, kter´ y se t´eˇz vkl´ad´a do v´ ysledn´e ˇsablony. Pomoc´ı pouˇzit´ı r˚ uzn´ ych typ˚ u textu pro jednotliv´e prvky TextView je dosaˇzeno toho, ˇze po kliknut´ı na uveden´ y odkaz bude otevˇren dan´ y ˇcl´anek pˇr´ımo v prohl´ıˇzeˇci zaˇr´ızen´ı. Pokud se tedy uˇzivatel aplikace chce dozvˇedˇet v´ıce informac´ı ˇci zobrazit obsah, kter´ y byl v r´amci aplikace vynech´an (videa, zvukov´e soubory, HTML elementy v popisu zpr´avy). ˇ cka je pak ˇsablona se zadan´ V´ ysledkem ˇcinnosti d´ılˇc´ı aplikace RSS Cteˇ ym poˇctem prvk˚ u, kde je kaˇzd´ y prvek zobrazen ve form´atu: obr´azek, nadpis, datum publikov´an´ı, popis zpr´avy, zv´yraznˇen´y odkaz na cel´y text. Sn´ımky v´ ysledk˚ u ˇcteˇcky pˇr´ımo ze zaˇr´ızen´ı jsou pˇriloˇzen´e v pˇr´ıloze E.3.
7.3
ˇ Kontakty ZCU
Dalˇs´ı uk´azkov´a aplikace slouˇz´ı k rychl´emu nalezen´ı kontaktn´ıch informac´ı o pracovn´ıc´ıch Z´apadoˇcesk´e univerzity v Plzni. Vyuˇz´ıv´a k tomu infromac´ı z´ıskan´ ych z profil˚ u zamˇestnanc˚ u na str´ank´ach http://www.zcu.cz/media/ about/people/, kter´e uprav´ı do podoby vhodn´e pro mobiln´ı zaˇr´ızen´ı. Jednotliv´e informace jsou z´ısk´av´any pˇr´ımo z webov´ ych str´anek pomoc´ı 4 n´astroje jsoup . Ten umoˇzn ˇuje v´ ybˇer element˚ u jazyka HTML pomoc´ı jejich unik´atn´ıch CSS selektor˚ u. V pˇr´ıpadˇe jednotn´e struktury vizitek“ jednotli” v´ ych zamˇestnanc˚ u je tedy moˇzn´e vytvoˇrit parser na m´ıru vˇsem str´ank´am ˇ obsahuj´ıc´ım informace o zamˇestnanc´ıch ZCU. Jelikoˇz se jedn´a o knihovnu tˇret´ıch stran pouˇz´ıvanou v d´ılˇc´ı aplikaci, bylo 4
v´ıce informac´ı na http://jsoup.org/
53
ˇ Kontakty ZCU
Uk´azkov´e aplikace
nutn´e ji zav´est pˇr´ımo do mateˇrsk´e aplikace jako knihovnu, protoˇze nebylo moˇzn´e ji pˇridat do archivu pomoc´ı n´astroje dx. Po pˇrid´an´ı t´eto knihovny je vˇsak aplikace pˇripravena na parsov´an´ı jak´ekoli webov´e str´anky, staˇc´ı pouze pˇrizp˚ usobit pravidla parseru dan´e str´ance. Vyhled´av´an´ı kontakt˚ u prob´ıh´a dle zadan´eho jm´ena a pˇr´ıjmen´ı hledan´e osoby. Ani jeden z parametr˚ u nen´ı povinn´ y, nicm´enˇe nepˇresn´ y dotaz povede v absolutn´ı vˇetˇsinˇe pˇr´ıpad˚ u k nepˇresn´ ym v´ ysledk˚ um. Nedoporuˇcuje se tedy zad´av´an´ı pˇr´ıliˇs obecn´ ych dotaz˚ u typu: nebo <” ”, Nov´ak>. Uk´azka vstupu aplikace je na obr´azku 7.3. Prvky typu CheckBox nejsou v t´eto aplikaci pouˇzity, a proto je m˚ uˇze v´ ykonn´ y modul ignorovat.
´ ˇ Obr´azek 7.3: Uvodn´ ı obrazovka aplikace Kontakty ZCU Po zpracov´an´ı vstupn´ıch u ´daj˚ u program pˇristoup´ı pomoc´ı knihovny jsoup na z´akladn´ı str´anku http://www.zcu.cz/media/about/people/, odkud vyˇ extrahuje vˇsechny odkazy na jednotliv´e str´anky pracovn´ık˚ u ZCU. Z tˇechto 54
ˇ Kontakty ZCU
Uk´azkov´e aplikace
odkaz˚ u vybere takov´e str´anky, u kter´ ych se shoduje pˇr´ıjmen´ı osoby se zadan´ ym u ´dajem, a d´ale je vyfiltruje podle zadan´eho jm´ena. Dalˇs´ım krokem je postupn´ y pˇr´ıstup na vˇsechny odpov´ıdaj´ıc´ı str´anky zamˇestnanc˚ u, ze kter´ ych jsou z´ısk´any potˇrebn´e u ´daje. Ty se pouˇzij´ı pro vytvoˇ cky ˇren´ı instance objektu Person, kter´a m´a stejnˇe jako v u aplikace RSS Cteˇ vˇsechny atributy typu String, a tak bude pops´ana pouze pomoc´ı metody toString v uk´azce 7.5. @Override public String toString () { StringBuilder builder = new StringBuilder () ; builder . append ( " Jm ´ e no : " + name + " \ n " ) ; builder . append ( " Telefon : " + phone + " \ n " ) ; builder . append ( " Mail : " + mail + " \ n " ) ; builder . append ( " M ´ ı stnost : " + room + " \ n " ) ; builder . append ( " Pracovi ˇ stˇ e : " + department + " \ n " ) ; builder . append ( " Fotka : " + photo + " \ n " ) ; return builder . toString () ; }
Uk´azka k´odu 7.5: Atributy objektu Person Pro kaˇzdou instanci objektu Person je n´aslednˇe vytvoˇrena vlastn´ı ˇsablona pro polymorfn´ı aplikaci. Aby nedoˇslo k zahlcen´ı polymorfn´ı aplikace novˇe vytvoˇren´ ymi fragmenty, je poˇcet vr´acen´ ych v´ ysledk˚ u omezen na pˇet. I tak je kladen d˚ uraz na pˇresnost dotazu zadan´eho uˇzivatelem. Struktura ˇsablon pro vstup i v´ ystup aplikace je pops´ana v pˇr´ıloze D.2. Na obr´azku 7.4 je sn´ımek obrazovky v´ ystupu aplikace pro jeden nalezen´ y v´ ysledek. Zat´ımco u ´daje o pracovn´ım zaˇrazen´ı zamˇestnance a jeho pracoviˇsti slouˇz´ı jen pro ˇcten´ı, u ´daje s telefonn´ım ˇc´ıslem a e-mailovou adresou jsou interaktivn´ı. Po kliknut´ı na telefonn´ı ˇc´ıslo dojde k otevˇren´ı aplikace mobiln´ıho zaˇr´ızen´ı urˇcen´e pro hovory - tzv. dialer u5 . N´asledn´a akce je pak uˇz jen na uˇzivateli. Je moˇzn´e dan´e ˇc´ıslo vytoˇcit, uloˇzit do kontakt˚ u atd. T´ım, ˇze aplikace neprov´ad´ı pˇr´ımo vol´an´ı na dan´e ˇc´ıslo, je zajiˇstˇena tak´e vˇetˇs´ı bezpeˇcnost, nebot’ je zaruˇceno, ˇze hovor m˚ uˇze uskuteˇcnit pouze uˇzivatel s´am, nikoli aplikace bez jeho vˇedom´ı. I proto nen´ı potˇreba povolen´ı pro uskuteˇcn ˇov´an´ı hovor˚ u, viz. pˇr´ıloha A. 5
angl. pro vyt´ aˇcen´ı
55
ˇ Kontakty ZCU
Uk´azkov´e aplikace
ˇ Obr´azek 7.4: Vizitka zamˇestnance ZCU Po kliknut´ı na e-mailovou adresu zamˇestnance dojde analogicky k otevˇren´ı nov´e zpr´avy ve v´ ychoz´ı aplikaci pro vyˇrizov´an´ı elektronick´e poˇsty. Pˇredmˇet a text zpr´avy je opˇet ponech´an pouze na uˇzivateli, stejnˇe jako jej´ı fin´aln´ı (ne)odesl´an´ı.
56
Testov´an´ı aplikace
8 Testov´an´ı aplikace Aplikace byla vyv´ıjena v prostˇred´ı Android Studio a testov´ana na zaˇr´ızen´ı Samsung Galaxy S4 mini na verzi syst´emu 4.4.2 (API 19), kter´e je ve vlastnictv´ı autora. C´ılovou skupinou pouˇzit´ ych zaˇr´ızen´ı byly mobiln´ı telefony, takˇze rozloˇzen´ı obrazovky na tabletech ˇci jin´ ych zaˇr´ızen´ıch nemus´ı odpov´ıdat sn´ımk˚ um obrazovky uveden´ ym v t´eto pr´aci a v pˇr´ıloze E. Obecnˇe by mˇelo b´ yt moˇzn´e aplikaci provozovat na vˇsech zaˇr´ızen´ıch s verz´ı syst´emu 4.0.3 (API 15) a novˇejˇs´ı, coˇz znamen´a funkcinalitu na 89% zaˇr´ızen´ı na trhu, jak uv´ad´ı [Apf15]. Aplikace byla kompilov´ana c´ılov´ ym API 22, tedy nejaktu´alnˇejˇs´ım v dobˇe v´ yvoje.
8.1
Pouˇ zit´ a zaˇ r´ızen´ı
Protoˇze jsou nˇekter´e funkce aplikace, zejm´ena pr´ace s uˇzivatelsk´ ymi u ´ˇcty a spolupr´ace s aplikacemi tˇret´ıch stran, v r´amci emul´atoru Android nedostupn´e, bylo moˇzn´e v r´amci emul´atoru otestovat pouze z´akladn´ı funkce aplikace. Na verz´ıch emul´atoru se syst´emem verze 4.0.3. (API 15) a 5.1.1 (API 22) byla aplikace nainstalov´ana i spuˇstˇena u ´spˇeˇsnˇe. Pro praktick´e testy uk´azkov´ ych aplikac´ı byla pouˇzita n´asleduj´ıc´ı zaˇr´ızen´ı1 : • Samsung Galaxy Fame, verze syst´emu 4.1.2 (API 16), u ´hlopˇr´ıˇcka displeje 3,5”, rozliˇsen´ı 320 ∗ 480 bod˚ u; • Samsung Galaxy S3 mini, verze syst´emu 4.2.2 (API 17), u ´hlopˇr´ıˇcka displeje 4,0”, rozliˇsen´ı 480 ∗ 800 bod˚ u; • Samsung Galaxy S4 mini, verze syst´emu 4.4.2 (API 19), u ´hlopˇr´ıˇcka displeje 4,3”, rozliˇsen´ı 480 ∗ 960 bod˚ u; • Samsung GalaxyTab 4, verze syst´emu 4.4.2 (API 19), u ´hlopˇr´ıˇcka displeje 10,1”, rozliˇsen´ı 1280 ∗ 800 bod˚ u. Na vˇsech uveden´ ych zaˇr´ızen´ıch probˇehla u ´spˇeˇsnˇe instalace aplikace, spuˇstˇen´ı aplikace, proveden´ı uk´azkov´ ych aplikac´ı a odinstalace aplikace. Bohuˇzel 1
V´ yvoj aplikace nebyl sponzorov´an ˇci jinak podporov´an spoleˇcnost´ı Samsung.
57
Testov´an´ı aplikace
Aplikace tˇret´ıch stran
nebylo moˇzn´e do odevzd´an´ı t´eto pr´ace u ´spˇeˇsnˇe ovˇeˇrit plnou funkcionalitu na zaˇr´ızen´ı s verz´ı syst´emu Andoid 5.0 (API 21) ˇci Android 5.1 (API 22).
8.2
Aplikace tˇ ret´ıch stran
Aby bylo moˇzn´e pouˇz´ıvat nˇekter´e funkce pro v´ ybˇer soubor˚ u generovan´ ych aplikac´ı, jsou nutn´e n´asleduj´ıc´ı pˇredpoklady: • Pˇ ripojen´ı k internetu - pro stahov´an´ı soubor˚ u a u ´spˇeˇsn´ y provoz uk´azkov´ ych aplikac´ı. Testov´an´ı probˇehlo jak na Wi-fi pˇripojen´ı, tak na mobiln´ım internetu 4G u ´spˇeˇsnˇe. Pˇri pouˇzit´ı mobiln´ıho 3G pˇripojen´ı byla citeln´ ym nedostatkem rychlost pˇripojen´ı, pˇresto probˇehlo testov´an´ı u ´spˇeˇsnˇe. • Sp´ arov´ an´ı s u ´ˇ ctem Google - bez pouˇzit´ı u ´ˇctu nejde vyuˇz´ıvat sluˇzeb Google Drive. Testov´an´ı probˇehlo u ´spˇeˇsnˇe na tˇrech r˚ uzn´ ych uˇzivatelsk´ ych u ´ˇctech. • Aplikace Dropbox - klientsk´a aplikace sluˇzby Dropbox obsluhuje v´ ybˇer soubor˚ u z tohoto u ´loˇziˇstˇe. Testov´an´ı probˇehlo u ´spˇeˇsnˇe na dvou r˚ uzn´ ych uˇzivatelsk´ ych u ´ˇctech. V pˇr´ıpadˇe, ˇze nen´ı aplikace nainstalov´ana, je uˇzivatel vyzv´an k jej´ı instalaci, kter´a je dobrovoln´a, avˇsak podmiˇ nuj´ıc´ı pro pouˇzit´ı sluˇzeb Dropbox. • Spr´ avce soubor˚ u - aplikace nutn´a pro v´ ybˇer soubor˚ u z lok´aln´ı pamˇeti zaˇr´ızen´ı. Testov´an´ı probˇehlo u ´spˇeˇsnˇe s aplikacemi ES File Explorer, Total Commander a Spr´avce soubor˚ u spoleˇcnosti Cheetah Mobile. V pˇr´ıpadˇe, ˇze nen´ı nainstalov´ana ˇz´adn´a aplikace pro pr´aci se soubory, m˚ uˇze nab´ıdka pro v´ ybˇer lok´alnˇe uloˇzen´eho souboru obsahovat i sluˇzby Drop box, Google Drive (Disk) ˇci jin´e aplikace. Obecnˇe by mˇelo b´ yt moˇzn´e pouˇz´ıt libovolnou aplikaci pro spr´avu soubor˚ u syst´emu Android.
8.3
Publikace aplikace
V dobˇe vyd´an´ı t´eto pr´ace nen´ı aplikace veˇrejnˇe dostupn´a na ofici´aln´ım obchodu https://play.google.com/store ˇci jin´ ych aplikaˇcn´ıch kan´alech. Je-
58
Testov´an´ı aplikace
Publikace aplikace
din´ y zp˚ usob, jak aplikaci nainstalovat, je pouˇzit´ı souboru z CD pˇriloˇzen´eho k t´eto pr´aci. Jak instalaci prov´est, popisuje pˇr´ıloha B.1. Aplikace je pˇriloˇzena v debug verzi, nebot’ n´astroje Google Developers Console neumoˇzn ˇuj´ı souˇcasn´e vyuˇz´ıv´an´ı sluˇzeb Google Drive v´ıce verzemi t´eˇze aplikace. Po vyd´an´ı release verze aplikace by bylo nutn´e zmˇenit ovˇeˇrovac´ı SHA12 k´od aplikace, coˇz by znemoˇznilo vyuˇzit´ı uˇzivatelsk´eho u ´ˇctu v´ yvojovou verz´ı aplikace. Obdobnˇe sluˇzba Dropbox je omezena poˇctem 100 uˇzivatel˚ u, kteˇr´ı se smˇej´ı pomoc´ı aplikace pˇripojit. Po pˇrekroˇcen´ı tohoto poˇctu je nutn´e zmˇenit typ spolupr´ace se sluˇzbou Dropbox na produkˇcn´ı typ. Pˇred publikov´an´ım aplikace by bylo nutn´e prov´est rozs´ahl´e testov´an´ı a dalˇs´ı kroky potˇrebn´e pro uveˇrejnˇen´ı aplikace. Tak´e by bylo tˇreba vz´ıt v potaz samotnou funkcionalitu aplikace, kter´a zjednoduˇsenˇe umoˇzn ˇuje spouˇstˇen´ı libovoln´eho k´odu na zaˇr´ızen´ı platformy Android. V pˇr´ıpadˇe uveˇrejnˇen´ı by bylo nutn´e napˇr´ıklad vytvoˇrit pr´avnˇe platn´e zˇreknut´ı se zodpovˇednosti za akce uˇzivatele, kter´ y si napˇr´ıklad m˚ uˇze pomoc´ı generovan´e aplikace odstranit ze zaˇr´ızen´ı d˚ uleˇzit´e soubory. A obecnˇe by mohla nejasn´a funkcionalita aplikace b´ yt probl´emem pˇri schvalovac´ım procesu v r´amci obchodu Google Play.
2
druh 160 bitov´eho k´ odov´ an´ı
59
Moˇznosti dalˇs´ıho rozˇs´ıˇren´ı
9 Moˇznosti dalˇs´ıho rozˇs´ıˇren´ı Na budouc´ı rozˇs´ıˇren´ı polymorfn´ı aplikace lze nahl´ıˇzet z nˇekolika u ´hl˚ u pohledu: pˇrid´an´ı nov´ ych grafick´ ych prvk˚ u, rozˇs´ıˇren´ı funkcionality st´avaj´ıc´ıch prvk˚ u, zaˇclenˇen´ı nov´ ych typ˚ u funkc´ı, pˇrid´an´ı moˇznost´ı nov´ ych vstup˚ u a v´ ystup˚ u generovan´e aplikace atp. Z hlediska praktick´e pouˇzitelnosti bych ale r´ad rozebral dva typy zmˇen, kter´e by mohly v´ yznamnˇe vylepˇsit pouˇz´ıv´an´ı polymorfn´ı aplikace. N´asleduj´ıc´ı moˇznosti zdokonalen´ı polymorfn´ı aplikace vych´azej´ı mimo jin´eho i z nerealizovan´ ych projekt˚ u generovan´ ych aplikac´ı, kter´e nebylo moˇzn´e vytvoˇrit z ˇcasov´ ych d˚ uvod˚ u ˇci pˇr´ıliˇsn´e odliˇsnosti n´avrhu od aktu´aln´ıho ˇreˇsen´ı, pˇr´ıpadnˇe projekt˚ u, kter´e byly zavrˇzeny jiˇz ve st´adiu n´avrhu.
9.1
N´ avaznost funkc´ı
Nav´az´an´ım v´ ystupu jedn´e funkce generovan´e aplikace na vstup n´asleduj´ıc´ı funkce by bylo moˇzn´e dos´ahnout komplexn´ıho ˇreˇsen´ı pro vybran´e specializovan´e u ´lohy jako dotazn´ıky, kv´ızy ˇci jednoduch´e logick´e hry, u kter´e by se v kaˇzd´e n´asleduj´ıc´ı u ´rovni pˇrizp˚ usobila obt´ıˇznost probl´emu uˇzivateli podle toho, jak rychle a u ´spˇeˇsnˇe vyˇreˇsil pˇredchoz´ı probl´em. V souˇcasn´e podobˇe umoˇzn ˇuje aplikace pouze dva typy akc´ı: 1. Zad´an´ı parametr˚ u a zavol´an´ı pˇriˇrazen´e funkce. 2. Zobrazen´ı z´ıskan´ ych v´ ysledk˚ u. Pro komplexn´ı funkci generovan´e aplikace by se vˇsak dal vytvoˇrit takov´ y n´avrh, kde je v´ yˇse uveden´ y proces pouze jedn´ım z nˇekolika krok˚ u pˇri pouˇz´ıv´an´ı aplikace. Generovan´a aplikace by jako v´ ysledek vracela rozhran´ı obsahuj´ıc´ı odliˇsn´a data a volaj´ıc´ı rozd´ıln´e funkce, napˇr´ıklad na z´akladˇe voleb uˇzivatele v pˇredchoz´ım zobrazen´ı. Takovou aplikaci by bylo moˇzn´e vyuˇz´ıt napˇr´ıklad jako formu dotazn´ıku. Uˇzivateli by se na z´akladˇe jeho odpovˇed´ı zobrazovaly dalˇs´ı dotazy a po kr´atk´e s´erii ot´azek by dospˇel k z´avˇereˇcn´emu vyhodnocen´ı. Pˇr´ıpadnˇe by takov´ y proces mohl v´est k personalizaci jin´e, rozs´ahlejˇs´ı aplikace, jej´ıˇz souˇca´st´ı by byla polymorfn´ı aplikace. 60
Moˇznosti dalˇs´ıho rozˇs´ıˇren´ı
9.2
Zpracov´an´ı v´ıce fragment˚ u
Zpracov´ an´ı v´ıce fragment˚ u
Aktu´aln´ı ˇreˇsen´ı polymorfn´ı aplikace pouˇz´ıv´a jako vstupn´ı parametry funkce pouze data z jednoho, aktu´alnˇe vybran´eho fragmentu. Kombinace dat z nˇekolika otevˇren´ ych fragment˚ u by umoˇznila pouˇzit´ı komplexnˇejˇs´ıch funkc´ı pro agregaci dat. Vyuˇzit´ı takov´e aplikace by mohlo b´ yt velmi r˚ uznorod´e. Jedn´ım z pˇr´ıklad˚ u by mohlo b´ yt zasl´an´ı hromadn´eho e-mailu vˇsem kontakt˚ um pr´avˇe otevˇren´ ym v z´aloˇzk´ach jakoˇzto rozˇs´ıˇren´ı souˇcasn´e uk´azkov´e aplikace popsan´e v ˇca´sti 7.3. Jedn´ım z nerealizovan´ ych projekt˚ u byla i jednoduch´a aplikace pro vytv´aˇren´ı n´akupn´ıho seznamu. Aplikace mˇela naˇc´ıtat seznam surovin potˇrebn´ ych pro uvaˇren´ı pokrmu dle vybran´eho receptu na nˇekter´em z nˇekolika web˚ u. V pˇr´ıpadˇe jednoho vybran´eho receptu by doˇslo pomoc´ı knihovny jsoup k extrakci releventn´ıch dat ve formˇe seznamu potˇrebn´eho mnoˇzstv´ı vˇsech surovin nutn´ ych pro pˇr´ıpravu dan´eho j´ıdla. V pˇr´ıpadˇe v´ıce vybran´ ych recept˚ u by doˇslo ke kombinaci jednotliv´ ych recept˚ u za u ´ˇcelem vytvoˇren´ı jednoho n´akupn´ıho seznamu. V ide´aln´ım pˇr´ıpadˇe by pak bylo moˇzn´e takov´ y seznam exportovat jako pozn´amku extern´ı aplikace. Obdobn´ ym zp˚ usobem by bylo moˇzn´e kombinovat napˇr´ıklad rozvrhy nˇekolika ˇz´ak˚ u za u ´ˇcelem nalezen´ı pr˚ uniku voln´ ych ˇcas˚ u, ˇci k slouˇcen´ı jin´eho typu dat. Samozˇrejmˇe by se daly uveden´e postupy pouˇz´ıt k vytvoˇren´ı mnohem sofistikovanˇejˇs´ıch aplikac´ı bez nutnosti vytv´aˇret samostatnˇe bˇeˇz´ıc´ı jedno´ uˇcelovou aplikaci.
61
Z´avˇer
10 Z´avˇer ´ Ukolem t´eto pr´ace bylo porovnat moˇznosti tvorby polymorfn´ıch aplikac´ı pro platformu Android. V r´amci tohoto porovn´an´ı pˇredstavila pr´ace nejvˇetˇs´ı v´ yhody a slabiny webov´ ych a multiplatformn´ıch ˇreˇsen´ı v porovn´an´ı s polymorfn´ı aplikac´ı vyvinutou v´ yhradnˇe pro operaˇcn´ı syst´em Android. Tato pr´ace rozˇsiˇruje jiˇz zn´am´ y koncept polymorfn´ı aplikace pouˇz´ıvaj´ıc´ı soubory XML pro definici uˇzivatelsk´ ych rozhran´ı o nov´e prvky, kter´e umoˇzn ˇuj´ı zd˚ uraznit v´ yznam a obsah zobrazovan´ ych informac´ı. D´ale pˇrin´aˇs´ı moˇznost dynamick´eho vytv´aˇren´ı fragment˚ u v r´amci generovan´e aplikace, jejich duplikaci, pˇrid´av´an´ı nebo nahrazen´ı p˚ uvodn´ıho obsahu novˇe z´ıskanou informac´ı. Pˇresto je hlavn´ım c´ılem aplikace vytvoˇren´e v t´eto pr´aci nab´ıdnout jednoduch´ y n´astroj jak pro uˇzivatele mobiln´ıho zaˇr´ızen´ı, tak pro v´ yvoj´aˇre mobiln´ıch aplikac´ı. Jedn´ım z u ´ˇcel˚ u polymorfn´ı aplikace je i snadn´e pˇreveden´ı klasick´eho programu jazyka Java do mobiln´ı podoby. Tento postup je rovnˇeˇz v pr´aci pops´an. Polymorfn´ı aplikace umoˇzn ˇuje v´ ybˇer soubor˚ u pro definici uˇzivatelsk´eho rozhran´ı a knihoven s v´ ykonn´ ym k´odem programu generovan´e aplikace z nˇekolika r˚ uzn´ ych zdroj˚ u - z pamˇeti zaˇr´ızen´ı, webov´eho URL, ale i z cloudov´ ych u ´loˇziˇst’ Dropbox a Google Drive. Uˇzivatel tak m´a moˇznost v´ ybˇeru zdroje dle aktu´aln´ı potˇreby a rovnˇeˇz je tak usnadnˇen pˇrenos potˇrebn´ ych soubor˚ u do zaˇr´ızen´ı, jejich spravov´an´ı a z´alohov´an´ı a v neposledn´ı ˇradˇe i sd´ılen´ı. Uveden´e cloudov´e sluˇzby mohou v budoucnu slouˇzit i jako jeden z distribuˇcn´ıch kan´al˚ u pro d´ılˇc´ı programy spouˇstˇen´e v polymorfn´ı aplikaci. Moˇznosti vytvoˇren´eho ˇreˇsen´ı jsou prezentov´any na dvou uk´azkov´ ych aplikac´ıch - ˇcteˇcce RSS a vyhled´avaˇci kontaktn´ıch informac´ı pracovn´ık˚ u Z´apadoˇcesk´e univerzity v Plzni. Tyto aplikace maj´ı za c´ıl jednak pˇredv´est zp˚ usob pr´ace s polymorfn´ı aplikac´ı, a pak maj´ı slouˇzit jako vzor pro program´atory, kteˇr´ı by se rozhodli koncept polymorfn´ı aplikace vyuˇz´ıt ve sv´ ych projektech nebo jej d´ale rozv´ıjet.
62
LITERATURA
LITERATURA
Literatura [Aar15] Android Developers. App Resources [online]. 2015, [cit. 2015-0601]. Dostupn´e z: http://developer.android.com/guide/topics/ resources/index.html [Amp15] Android Developers. Manifest.permission [online]. 2015, [cit. 201505-29]. Dostupn´e z: http://developer.android.com/reference/ android/Manifest.permission.html [Apf15] Android Developers. Platform Versions [online]. Akt. 2015-06-01, [cit. 2015-06-01]. Dostupn´e z: https://developer.android.com/ about/dashboards/index.html [Art15] Android Developers. Resource Types [online]. 2015, [cit. 2015-0601]. Dostupn´e z: http://developer.android.com/guide/topics/ resources/available-resources.html [Asa15] Android Source. ART and Dalvik [online]. 2015, [cit. 2015-0618]. Dostupn´e z: https://source.android.com/devices/tech/ dalvik/index.html [Asd15] Android Source. Dalvik Executable format [online]. 2015, [cit. 201506-18]. Dostupn´e z: https://source.android.com/devices/tech/ dalvik/ [Asl15] Android Developers. Support Library [online]. Akt. 2015-05, ver. 22.2.0, [cit. 2015-06-01]. Dostupn´e z: http://developer.android. com/tools/support-library/index.html [Asp15] Android Developers. System Permissions [online]. 2015, [cit. 2015-05-29]. Dostupn´e z: http://developer.android.com/guide/ topics/security/permissions.html
63
LITERATURA
LITERATURA
[Aui15] Android Developers. UI Overview [online]. 2015, [cit. 2015-06-18]. Dostupn´e z: https://developer.android.com/guide/topics/ui/ overview.html [Bmp13] Mob Partner. Top 5 HTML5 Frameworks’ for Mobile Web Apps [online]. Pub. 2013-06-24, [cit. 2015-06-01]. Dostupn´e z: http://blog.mobpartner.com/2013/06/24/top5-html5frameworks-web-apps/ [Ceb14] GNEST, Anja. Mobile Trends 2014 [online]. Pub. 2014-02-21, [cit. 2015-05-28]. Dostupn´e z: http://blog.cebit.de/2014/02/21/ infographic-mobile-trends-2014/ ˇ y telekomunikaˇcn´ı u [Ctu15] Cesk´ ´ˇrad. Veˇrejn´e ˇsirokop´asmov´e mobiln´ı s´ıtˇe [online]. Akt. 2015-05-19, [cit. 2015-05-28]. Dostupn´e z: http://lte. ctu.cz/pokryti/ [Dom04] W3C. Document Object Model (DOM) Level 3 Core Specification [online]. Pub. 2004-04-07, ver. 1.0, [cit. 2015-06-18]. Dostupn´e z: http://www.w3.org/TR/2004/REC-DOM-Level-3-Core20040407/ [For14] GRIFFITH, Erin pro Fortune.com Who’s winning the consumer cloud storage wars? [online]. Pub. 2014-11-06, [cit. 2015-06-18]. Dostupn´e z: http://fortune.com/2014/11/06/dropbox-googledrive-microsoft-onedrive/ [Gio15] Google Developers. Google I/O Keynote [video]. Pub. 2015-05-28, [cit. 2015-05-28]. Dostupn´e z: https://www.youtube.com/watch?v= 7V-fIGMDsmE [Gra13] GRANT, Allan. Android 4 : pr˚ uvodce programov´an´ım mobiln´ıch aplikac´ı, 1. vyd. Brno: Computer Press, 2013. 656s. ISBN 978-80251-3782-6 [Hul12] HULA, Josef. Dynamick´a tvorba aplikac´ı v syst´emu Android [on´ ˇ ´ line]. 2012, [cit. 2015-05-28]. Bakal´aˇrsk´a pr´ace. ZAPADO CESK A UNIVERZITA V PLZNI, Fakulta aplikovan´ ych vˇed. Vedouc´ı pr´ace Ladislav Peˇsiˇcka. Dostupn´e z: http://theses.cz/id/vf9jn8/. [Iwa15] Google Developers. Installable Web Apps [video]. 2015, [cit. 2015-05-28]. Dostupn´e z: https://www.youtube.com/watch?v= N1Bdu7ukN40
64
LITERATURA
LITERATURA
[Lac15] LACKO, L’uboslav. V´yvoj aplikac´ı pro Android, 1. vyd. Brno: Computer Press, 2015. 472s. ISBN 978-80-251-4347-6 [Lan14] LANDWERTH, Immo. .NET Core is Open Source [online]. Pub. 2014-11-12, [cit. 2015-06-01]. Dostupn´e z: http://blogs.msdn.com/ b/dotnet/archive/2014/11/12/net-core-is-open-source.aspx [Luo15] LUONTOLA, Esko. Retrolambda [online]. Akt. 2015-04-14, ver. 2.0.2, [cit. 2015-06-01]. Dostupn´e z: https://github.com/ orfjackal/retrolambda [Mar10] MARCOTTE, Ethan. Responsive Web Design [online]. Pub. 201505-25, [cit. 2015-06-01]. Dostupn´e z: http://alistapart.com/ article/responsive-web-design [Nam13] NAM, Changwon. Decompiling Android [online]. Pub. 2013-09-28, [cit. 2015-06-18]. Dostupn´e z: http://nckwon.blogspot.cz/2013/ 09/decompiling-android.html [Not05] NOTTINGHAM, M. - SAYRE, R. The Atom Syndication Format [online]. Pub. 2005-12, [cit. 2015-06-18]. Dostupn´e z: https: //tools.ietf.org/html/rfc4287 [Omt15] Oracle Java documentation. Obtaining Method Type Information [online]. 2015, [cit. 2015-06-18]. Dostupn´e z: https://docs.oracle. com/javase/tutorial/reflect/member/methodType.html [Rss09] RSS Advisory board. RSS 2.0 Specification [online]. Pub. 2009-0430, [cit. 2015-06-18]. Dostupn´e z: http://www.rssboard.org/rssspecification [Rud14] RUDOPLPH, Patrick. Hybrid Mobile Apps: Providing A Native Experience With Web Technologies [online]. Pub. 2014-10-21, [cit. 201506-01]. Dostupn´e z: http://www.smashingmagazine.com/2014/10/ 21/providing-a-native-experience-with-web-technologies/ [Srr14] Staffing Robot. Responsive Web Design is Not a Fad, It’s Great for SEO [online]. Pub. 2014-12-05, [cit. 2015-06-01]. Dostupn´e z: http://www.staffingrobot.com/2014/12/responsiveweb-site-design-just-fad-great-seo.html [Sta13] STAFFA, Milan. Polymorfn´ı aplikace pro syst´em Android [online]. ´ ˇ ´ UNI2013, [cit. 2015-05-28]. Diplomov´a pr´ace. ZAPADO CESK A VERZITA V PLZNI, Fakulta aplikovan´ ych vˇed. Vedouc´ı pr´ace Ladislav Peˇsiˇcka. Dostupn´e z: http://theses.cz/id/fiunqh/. 65
LITERATURA
LITERATURA
[Sum15] SUMMERFIELD, Jason. Mobile Website vs. Mobile App [online]. 2015, [cit. 2015-05-28]. Dostupn´e z: http://www.hswsolutions. com/services/mobile-web-development/mobile-website-vsapps/ [Tat15] TATARKA, Evan. Gradle-Retrolambda [online]. Akt. 2015-05-02, ver. 3.1.0, [cit. 2015-06-01]. Dostupn´e z: https://github.com/ evant/gradle-retrolambda [Vog13] VOGEL, Lars. RSS feeds with Java - Tutorial [online]. Akt. 201303-06, [cit. 2015-06-18]. Dostupn´e z: http://www.vogella.com/ tutorials/RSSFeed/article.html [W3r15] W3Schools. HTML Responsive Web Design [online]. 2015, [cit. 2015-06-01]. Dostupn´e z: http://www.w3schools.com/html/html_ responsive.asp [W3t15] W3Techs. Usage of content management systems for websites [online]. Akt. 2015-06-06, [cit. 2015-06-06]. Dostupn´e z: http:// w3techs.com/technologies/overview/content_management/all [Wpc15] Wordpress.com. Responsive Layout WordPress Themes [online]. 2015, [cit. 2015-06-01]. Dostupn´e z: https://theme.wordpress. com/themes/features/responsive-layout/ [Xaf15] Xamarin. Introduction to Xamarin.Forms [online]. 2015, [cit. 201505-28]. Dostupn´e z: http://developer.xamarin.com/guides/ cross-platform/xamarin-forms/introduction-to-xamarinforms/ [Zai14] ZAITSEV, Serge. Lambda support for Android [online]. Pub. 201401-09, [cit. 2015-06-01]. Dostupn´e z: http://zserge.com/blog/ android-lambda.html
66
SEZNAM ZKRATEK
SEZNAM ZKRATEK
Seznam zkratek V textu pr´ace byly pouˇzity n´asleduj´ıc´ı v´ yrazy a zkratky: • 3D - Three-dimensional, trojrozmˇern´ y • Activity - aktivita, z´akladn´ı ˇc´ast aplikace pro OS Android • Android - operaˇcn´ı syst´em mobiln´ıch zaˇr´ızen´ı • AOT - Ahead Of Time, pˇredbˇeˇzn´a kompilace k´odu • API - Application Programming Interface, aplikaˇcn´ı rozhran´ı • APK - Android Application Package, bal´ıˇcek aplikace • ART - prostˇred´ı platformy Android • Button - tlaˇc´ıtko, prvek uˇzivatelsk´eho rozhran´ı aplikace • C# - programovac´ı jazyk • CSS - Cascading Style Sheets, kask´adov´e styly • Dalvik - prostˇred´ı platformy Android • DEX - Dalvik EXecutable, spustiteln´ y k´od Dalviku • DOM - Document Object Model, objektov´ y model dokumentu • Drawable - grafick´ y zdroj aplikace • DVM - Dalvik Virtual Machine, virtu´aln´ı stroj Dalviku • DX - n´astroj pro kompilaci bal´ıˇck˚ u dex • Eclipse - v´ yvojov´e prostˇred´ı 67
SEZNAM ZKRATEK
SEZNAM ZKRATEK
• EditText - kolonka, prvek uˇzivatelsk´eho rozhran´ı aplikace • Fragment - ˇca´st aktivity, z´akladn´ı ˇca´st aplikace pro OS Android • Framework - sada v´ yvoj´aˇrsk´ ych n´astroj˚ u • HSPA+, 3G - pˇredch˚ udce mobiln´ıho pˇripojen´ı LTE • HTML - HyperText Markup Language, znaˇckovac´ı jazyk pro tvorbu webu • CheckBox - prvek uˇzivatelsk´eho rozhran´ı aplikace • ID - identifik´ator • ImageView - obr´azek, prvek uˇzivatelsk´eho rozhran´ı aplikace • Integer - typ cel´eho ˇc´ısla • iOS - operaˇcn´ı syst´em spoleˇcnosti Apple • JAR - Java ARchive, bal´ıˇcek k´odu jazyka Java • Java - programovac´ı jazyk • JavaScript - programovac´ı jazyk • JIT - Just In Time, kompilace k´odu za bˇehu • JVM - Java Virtual Machine, virtu´aln´ı stroj Javy • Layout - definice rozloˇzen´ı uˇzivatelsk´eho rozhran´ı • LinearLayout - ˇr´adkov´e rozloˇzen´ı prvk˚ u View v uˇzivatelsk´em rozhran´ı • LINQ - Language-Integrated Query, dotazovac´ı funkce jazyka C# • LTE, 4G - standard rychl´eho mobiln´ıho pˇripojen´ı • Manifest - soubor popisuj´ıc´ı aplikaci a jej´ı povolen´ı • Mono - platforma pro aplikace v jazyku C# • .NET - platforma pro aplikace v jazyku C# • OS - operaˇcn´ı syst´em • Permission - opr´avnˇen´ı aplikace 68
SEZNAM ZKRATEK
SEZNAM ZKRATEK
• RelativeLayout - relativn´ı rozloˇzen´ı prvk˚ u View v uˇzivatelsk´em rozhran´ı • RSS - Really Simple Syndication, syst´em zpˇr´ıstupnˇen´ı zpr´av v s´ıti • ScrollView - posuvn´e rozloˇzen´ı prvk˚ u View v uˇzivatelsk´em rozhran´ı • SDK - Software Development Kit, sada v´ yvojov´ ych n´astroj˚ u • SEO - Search Engine Optimization, optimalizace webu pro vyhled´avaˇc • SHA1 - 160 bitov´e k´odov´an´ı pro tvorbu kl´ıˇc˚ u aplikac´ı • StAX - Streaming API for XML, n´astroj pro ˇcten´ı XML proud˚ u • String - typ ˇretˇezce • TextView - text, prvek uˇzivatelsk´eho rozhran´ı aplikace • ToolBar - n´astrojov´ y panel, prvek uˇzivatelsk´eho rozhran´ı aplikace • UI - User Interface, uˇzivatelsk´e rozhran´ı • UI Thread - hlavn´ı vl´akno aplikace • URL - Uniform Resource Locator, jednotn´a adresa zdroje • View - prvek uˇzivatelsk´eho rozhran´ı aplikace • ViewGroup - prvek uˇzivatelsk´eho rozhran´ı aplikace obsahuj´ıc´ı prvky View ˇci ViewGroup • WebView - zobrazen´ı HTML k´odu v aplikaci • Wordpress - platforma pro v´ yvoj webov´ ych str´anek • XAML - eXtensible Application Markup Language, znaˇckovac´ı jazyk pro grafick´a rozhran´ı • XML - eXtensible Application Markup Language, znaˇckovac´ı jazyk
69
Opr´avnˇen´ı aplikace
A Opr´avnˇen´ı aplikace Prvn´ı sada povolen´ı obsahuje poloˇzky potˇrebn´e pro pˇr´ıstup k s´ıti. Ten je potˇrebn´ y jednak pro stahov´an´ı poˇzadovan´ ych soubor˚ u ˇsablon a archiv˚ u dex, jednak je vyˇzadov´an uk´azkov´ ymi aplikacemi. Bez pˇripojen´ı k s´ıti je moˇzn´e st´ale vyuˇz´ıvat posledn´ı pouˇzit´e soubory z pamˇeti zaˇr´ızen´ı a pˇr´ıpadnˇe pouˇstˇet d´ılˇc´ı aplikace, kter´e pro svoji funkci pˇripojen´ı k s´ıti nevyˇzaduj´ı. Poloˇzka ACCESS NETWORK STATE slouˇz´ı pro ovˇeˇren´ı, zda je pˇripojen´ı aktivn´ı, ˇci nikoli, zat´ımco povolen´ı INTERNET je vyˇzadov´ano pro pouˇzit´ı pˇripojen´ı k s´ıti. < uses - permission android:name = " android . permission . INTERNET " / > < uses - permission android:name = " android . permission . AC CES S_ NET WOR K_ STA TE " / >
Uk´azka k´odu A.1: Opr´avnˇen´ı - Internet Povolen´ı WRITE EXTERNAL STORAGE zajiˇst’uje moˇznost z´apisu soubor˚ u na pamˇet’ovou kartu (obecnˇe do extern´ı pamˇeti zaˇr´ızen´ı). Toto povolen´ı zahrnuje rovnˇeˇz i ˇcten´ı soubor˚ u z extern´ı pamˇeti. < uses - permission android:name = " android . permission . W R I T E_ E X T E RN A L _ ST O R A G E " / >
Uk´azka k´odu A.2: Opr´avnˇen´ı - Extern´ı pamˇet’ Posledn´ı povolen´ı slouˇz´ı k pˇriˇrazen´ı polymorfn´ı aplikace k uˇzivatelsk´emu u ´ˇctu zaˇr´ızen´ı a k vyuˇzit´ı u ´daj˚ u z tohoto uˇzivatelsk´eho u ´ˇctu pro pˇrihl´aˇsen´ı do sluˇzby Google Drive. < uses - permission android:name = " android . permission . GET_ACCOUNTS " / > < uses - permission android:name = " android . permission . USE_CREDENTIALS " / >
Uk´azka k´odu A.3: Opr´avnˇen´ı - Uˇzivatelsk´e u ´ˇcty
70
Uˇzivatelsk´a pˇr´ıruˇcka
B Uˇzivatelsk´a pˇr´ıruˇcka V t´eto pˇr´ıloze jsou pops´any z´akladn´ı kroky pro u ´spˇeˇsnou instalaci a pouˇz´ıv´an´ı vytvoˇren´e polymorfn´ı aplikace a pro pr´aci s jednotliv´ ymi generovan´ ymi aplikacemi.
B.1
Instalace aplikace
Jedn´ım zp˚ usobem, jak nainstalovat aplikaci do zaˇr´ızen´ı, je import projektu aplikace z pˇriloˇzen´eho CD do v´ yvojov´eho prostˇred´ı Android Studio a n´asledn´e spuˇstˇen´ı projektu. Takov´ y pˇr´ıstup umoˇzn ˇuje souˇcasnou kontrolu zdrojov´ ych k´od˚ u a logu zaˇr´ızen´ı. Rovnˇeˇz je moˇzn´e pouˇz´ıt n´astroje pro ladˇen´ı aplikace a jej´ı bˇeh na vybran´em m´ıstˇe pozastavit ˇci krokovat. Klasick´ ym pˇr´ıstupem je vˇsak instalace pomoc´ı aplikaˇcn´ıho bal´ıˇcku polymorph.apk. Ten se nach´az´ı na pˇriloˇzen´em CD ve sloˇzce apk. Jedn´a se o aplikaci vydanou neofici´aln´ı cestou, proto bude na vˇetˇsinˇe zaˇr´ızen´ı nutn´e povolit instalaci aplikac´ı z nezn´am´ ych zdroj˚ u. Tento krok je moˇzn´e podniknout samostatnˇe pomoc´ı odpov´ıdaj´ıc´ı moˇznosti v Nastaven´ı > Zabezpeˇcen´ı > Spr´ava zaˇr´ızen´ı (m˚ uˇze se liˇsit dle modelu a verze syst´emu). Pˇr´ıpadnˇe k nˇemu bude uˇzivatel vyzv´an pˇri pokusu o instalaci aplikace, jak ukazuje obr´azek B.1a. V prvn´ım kroku instalace je nutn´e prov´est souhlas se vˇsemi povolen´ımi, kter´e aplikace pro sv˚ uj bˇeh potˇrebuje. Seznam tˇechto povolen´ı pˇri instalaci zobrazuje sn´ımek B.1b, jejich seznam a od˚ uvodnˇen´ı pak popisuje kapitola A. Po u ´spˇeˇsn´em dokonˇcen´ı aplikace je moˇzn´e ji pouˇz´ıvat.
71
Uˇzivatelsk´a pˇr´ıruˇcka
Pouˇz´ıv´an´ı aplikace
(a) Nezn´ am´e zdroje
(b) Povolen´ı aplikace
Obr´azek B.1: Instalace polymorfn´ı aplikace
B.2
Pouˇ z´ıv´ an´ı aplikace
Pˇri prvn´ım spuˇstˇen´ı aplikace je uˇzivatel vyzv´an, aby provedl sp´arov´an´ı aplikace se sv´ ym uˇzivatelsk´ ym u ´ˇctem (obr´azek B.2a). Po pˇrid´an´ı tohoto u ´ˇctu je provedeno sp´arov´an´ı a vyˇzadov´an souhlas uˇzivatele s pˇr´ıstupem aplikace k jeho dat˚ um ve sluˇzbˇe Google Drive, viz obr´azek B.2b. Pro zruˇsen´ı p´arov´an´ı je tˇreba odebrat odpov´ıdaj´ıc´ı moˇznost v nastaven´ı u ´ˇctu Google v kategorii Pˇrihl´aˇsen´ı a zabezpeˇcen´ı > Pˇridruˇzen´e aplikace a weby > Spravovat aplikace > Polymorph. Po proveden´ı autorizace je moˇzn´e aplikaci pouˇz´ıvat, pˇriˇcemˇz pˇripojen´ı k uˇzivatelsk´emu u ´ˇctu uˇz je zajiˇst’ov´ano automaticky a aplikaci lze pouˇz´ıvat bez omezen´ı.
72
Uˇzivatelsk´a pˇr´ıruˇcka
Pouˇz´ıv´an´ı aplikace
(a) Pˇripojen´ı u ´ˇctu
(b) Pˇr´ıstup ke Google Drive
Obr´azek B.2: P´arov´an´ı s u ´ˇctem Google Play Obr´azek B.3a ukazuje vˇsechny prvky uˇzivatelsk´eho rozhran´ı u ´vodn´ı aktivity aplikace. Pomoc´ı prvku 1 je moˇzn´e pˇrep´ınat mezi v´ ybˇerem souboru ˇsablony a souboru knihovny dex. Pokud je prvek vybr´an, uloˇzen a pˇriˇrazen, zobraz´ı se n´azev dan´eho souboru v prvku 2, kter´ y je jinak pr´azdn´ y. Prvky 3, 4, 6, 7, 8 slouˇz´ı pro v´ ybˇer souboru z pamˇeti zaˇr´ızen´ı, z historie, ´ ziˇstˇe Google Drive a z vybran´eho URL. Dialogy ze sluˇzby Dropbox, z Uloˇ tˇechto sluˇzeb zobrazuje pˇr´ıloha E.2. Tlaˇc´ıtko 5 slouˇz´ı k odstratnˇen´ı dan´e poloˇzky z v´ ybˇeru. Prvek 9 pak slouˇz´ı k pˇrechodu na generovanou aplikaci v dalˇs´ı aktivitˇe. Na obr´azku B.3b je zobrazen v´ ybˇer souboru z historie posledn´ıch pouˇzit´ ych ˇsablon.
73
Uˇzivatelsk´a pˇr´ıruˇcka
Vytvoˇren´ı dex archivu
(a) Prvky rozhran´ı
(b) Historie v´ ybˇer˚ u
Obr´azek B.3: Pouˇz´ıv´an´ı aplikace
B.3
Vytvoˇ ren´ı dex archivu
Vytvoˇren´ı dex knihovny pro generovanou aplikaci je relativnˇe jednoduchou z´aleˇzitost´ı. Nejprve je nutn´e zaloˇzit nov´ y Java projekt v libovoln´em IDE. Struktura bal´ık˚ u, obsah tˇr´ıd a funkce k´odu je na program´atorovi. Je vˇsak nutn´e zajistit, aby z´akladn´ı tˇr´ıda projektu obsahovala metodu doLibraryFunction, nejl´epe pomoc´ı implementace rozhran´ı ILibraryFunction, kter´e je souˇc´ast´ı projektu aplikace a nach´az´ı se v bal´ıku cz.zcu.kiv.polymorph.type. Naˇc´ıt´an´ı knihovny je pops´ano v kapitole 5.2.2, se kterou je nutn´e se pˇredem sezn´amit. Pro volanou funkci je potˇreba vytvoˇrit odpov´ıdaj´ıc´ı ˇsablonu, ze kter´e bude moˇzn´e funkci spustit. Struktura prvk˚ u ˇsablon je popsan´a v pˇr´ıloze C a je nutn´e, aby program´ator zachoval poˇzadovanou strukturu ˇsablony. 74
Uˇzivatelsk´a pˇr´ıruˇcka
Pouˇzit´ı extern´ı knihovny
Funkcionalitu programu je vhodn´e nejprve otestovat pˇr´ımo ve v´ yvojov´em prostˇred´ı a odladit pˇr´ıpadn´e chyby. Pot´e je moˇzn´e projekt pˇreloˇzit libovoln´ ym zp˚ usobem pomoc´ı kompil´atoru javac. Dalˇs´ım krokem je zabalen´ı vygenerovan´ ych soubor˚ u .class do spoleˇcn´eho archivu. To lze prov´est napˇr´ıklad pˇr´ıkazem uveden´ ym na uk´azce B.1 z pˇr´ıkazov´e ˇr´adky. lib.jar pˇredstavuje n´azev v´ ysledn´eho archivu, druh´ ym parametrem je um´ıstˇen´ı soubor˚ u k zabalen´ı, v tomto pˇr´ıpadˇe ./com. jar cf lib . jar ./ com
Uk´azka k´odu B.1: Vytvoˇren´ı archivu jar Po zabalen´ı soubor˚ u je vhodn´e pˇrekontrolovat, jestli cesta k c´ılov´emu souboru opravdu sed´ı s cestou uvedenou v ˇsablonˇe pro spuˇstˇen´ı aplikace, jinak nebude moˇzn´e spustit poˇzadovanou funkci. Jakmile bude archiv pˇrek´odov´an do form´atu dex, nebude jiˇz moˇzn´e zobrazit a proch´azet jeho obsah. Kompilaci n´astrojem dx je moˇzn´e spustit pˇr´ıkazem ve tvaru uveden´em na uk´azce B.2. Um´ıstˇen´ı n´astroje dx se liˇs´ı na kaˇzd´em stroji, proto nen´ı moˇzn´e vytvoˇrit jednoduch´ y kompilaˇcn´ı skript. Standardn´ı um´ıstˇen´ı n´astroje dx je /build-tools//dx.bat. Cestu k Android SDK m´a nastavenu uˇzivatel individu´alnˇe a je moˇzn´e ji zjistit napˇr´ıklad pomoc´ı n´astroje Android SDK Manager, kter´ y slouˇz´ı ke spr´avˇe v´ yvoj´aˇrsk´ ych n´astroj˚ u platformy Android. dx -- dex -- verbose -- keep - classes -- output ="./ lib . dex " ./ lib . jar
Uk´azka k´odu B.2: Vytvoˇren´ı archivu dex V uk´azce B.2 pˇredstavuje ./lib.jar archiv vytvoˇren´ y v uk´azce B.1, jm´eno v´ ystupn´ıho archivu je pak nutn´e uv´est do parametru --output. Parametr --verbose d´av´a program´atorovi pˇrehled o tom, jak´e tˇr´ıdy jiˇz byly zpracov´any. T´ımto krokem je knihovna dex vytvoˇrena a lze ji pouˇz´ıt v zaˇr´ızen´ı.
B.4
Pouˇ zit´ı extern´ı knihovny
N´astroj dx neum´ı spolehlivˇe zabalit do v´ ysledn´eho archivu knihovny tˇret´ıch stran. Proto je nutn´e pˇri jejich pouˇzit´ı pˇridat knihovny pˇr´ımo do projektu polymorfn´ı aplikace pomoc´ı n´asleduj´ıc´ıch krok˚ u:
75
Uˇzivatelsk´a pˇr´ıruˇcka
Pouˇzit´ı extern´ı knihovny
1. V n´astroji Android Studio pˇrepnˇete v postrann´ım panelu perspektivu z Android na Project. 2. V modulu aplikace app vyberte adres´aˇr libs a do nˇej nakop´ırujte vybranou knihovnu. 3. V n´astrojov´em panelu vyberte moˇznost File > Project Structure. 4. Ve zobrazen´em oknˇe vyberte modul app a kartu Dependencies, viz obr´azek B.4. 5. Pomoc´ı n´astroje pˇridat (+) pˇridejte poˇzadovanou knihovnu (File Dependency). 6. Potvrd’te tlaˇc´ıtkem OK. Po sestaven´ı projektu by mˇela b´ yt knihovna jeho souˇc´ast´ı.
Obr´azek B.4: Z´avislosti projektu Pro knihovny vyuˇz´ıvaj´ıc´ı syst´emu z´avislost´ı Gradle nebo Maven je proces jednoduˇsˇs´ı a staˇc´ı pouze zan´est knihovnu do dependencies souboru build.gradle modulu app.
76
Prvky uˇzivatelsk´eho rozhran´ı
C Prvky uˇzivatelsk´eho rozhran´ı V r´amci t´eto kapitoly jsou pops´any takov´e prvky, kter´e lze v generovan´e aplikaci vykreslit pomoc´ı ˇsablon uˇzivatelsk´eho rozhran´ı, a tak se do velk´e m´ıry prol´ın´a s pˇr´ılohou D. Kaˇzd´emu z prvk˚ u uˇzivatelsk´eho rozhran´ı lze pˇriˇradit urˇcit´ y poˇcet vybran´ ych argument˚ u. Pˇri zpracov´an´ı ˇsablony rozhran´ı pomoc´ı XML parseru pak doch´az´ı k v´ ybˇeru tˇechto prvk˚ u a jejich atribut˚ u, na jejichˇz z´akladˇe se pak vytv´aˇrej´ı samotn´e objekty uˇzivatelsk´eho rozhran´ı.
C.1
Obecn´ e vlastnosti
Jak popisuje ˇca´st 5.1.3, jsou vˇsechny vytvoˇren´e prvky nejprve obaleny rozloˇzen´ım LinearLayout a n´asledovnˇe vloˇzeny do prvku ScrollView. Pro tento rodiˇcovsk´ y LinearLayout je pouˇzita v´ ychoz´ı direktiva, kter´a zajiˇst’uje, ˇze vˇsechny prvky vloˇzen´e do seznamu budou m´ıt stejnou v´ahu. A rovnˇeˇz se budou snaˇzit vyplnit maximum pˇridˇelen´eho prostoru. LinearLayout . LayoutParams lp = new LinearLayout . LayoutParams ( LinearLayout . LayoutParams . MATCH_PARENT , LinearLayout . LayoutParams . MATCH_PARENT , defaultWeight ) ; parent . setLayoutParams ( lp ) ;
Uk´azka k´odu C.1: V´ ychoz´ı nastaven´ı LinearLayout T´ım je zajiˇstˇeno, ˇze pokud bude jedin´ ym definovan´ ym prvkem dan´eho fragmentu pouze LinearLayout, dostane k dispozici prostor cel´eho displeje, nikoli pouze jednu ˇra´dku z obaluj´ıc´ıho prvku. V´ahu jednotliv´ ych prvk˚ u obaluj´ıc´ıho layoutu je moˇzn´e mˇenit pomoc´ı parametru weight. Jeho hodnota ud´av´a, jak´ y pod´ıl prostoru by mˇel v r´amci obaluj´ıc´ıho LinearLayout zabrat. Napˇr´ıklad LinearLayout obsahuj´ıc´ı tˇri prvky s vahami 1, 1, 2 by mˇel pˇridˇelit polovinu (2/4) prostoru posledn´ımu, nejvˇetˇs´ımu, prvku a zbyl´ y prostor rozdˇelit mezi dva menˇs´ı prvky. Nicm´enˇe je nutn´e vz´ıt v potaz to, ˇze na fin´aln´ı zobrazen´ı maj´ı vliv napˇr´ıklad i rozestupy mezi prvky, okraje a dalˇs´ı faktory. Pˇri pouˇzit´ı atributu weight je vˇsak tˇreba d´at pozor na to, ˇze urˇcuje rozmˇer prvku pouze v jednom rozmˇeru. Pokud tedy prvek obsahuje text ˇci popisek, bude jeho obsah rovnˇeˇz pˇrizp˚ usoben rozmˇer˚ um cel´eho prvku. M˚ uˇze 77
Prvky uˇzivatelsk´eho rozhran´ı
Fragment
se tak st´at, ˇze obsah prvku pˇreteˇce na dalˇs´ı ˇra´dky a t´ım dojde k protaˇzen´ı a vizu´aln´ı deformaci objektu. V´ahu prvk˚ um je tedy potˇreba pˇriˇrazovat s rozmyslem. Vˇsechny prvky s textov´ ym obsahem mohou zpracov´avat jak obsah atributu text, tak pˇr´ımo textov´ y obsah elementu. To umoˇzn ˇuje pouˇzit´ı atributu pro text tlaˇc´ıtek, zat´ımco bloky textu je moˇzn´e um´ıstit dovnitˇr elementu v XML souboru ˇsablony.
C.2
Fragment
Fragment slouˇz´ı jako prvek rozhran´ı, ve kter´em se vˇsechen obsah nahran´ y ze ˇsablony zobraz´ı. Pro jednoduchost je moˇzn´e v r´amci jednoho souboru ˇsablony definovat v´ıce fragment˚ u, kde kaˇzd´ y bude m´ıt sv˚ uj titulek dan´ y atributem title a vlastn´ı prvky rozhran´ı, t´ım p´adem i vlastn´ı funkci. Pokud ˇsablona neobsahuje pˇr´ımo prvek typu , povaˇzuje se veˇsker´ y jej´ı obsah za obsah jednoho fragmentu a je s n´ım d´ale i tak nakl´ad´ano. Pokud obsahuje titulek fragmentu znaky , jsou tyto znaky nahrazeny ve v´ ysledn´em n´azvu znakem mezera“. Analogick´ y postup je pouˇzit pˇri vytv´a” ˇren´ı atributu XML ˇsablony z ˇretˇezce n´azvu. Atribut
Hodnoty
• title
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony Tabulka C.1: Atributy prvku fragment
C.3
LinearLayout
Pomoc´ı kombinace prvk˚ u lze rozloˇzen´ı displeje rozdˇelit na ˇra´dky a sloupce. Orientace layoutu m˚ uˇze b´ yt dvoj´ı - horizontal (prvky jsou pouˇzit´e jako sloupeˇcky) a vertical (prvky jsou pouˇzit´e jako ˇra´dky). V souboru ˇsablony je orientace specifikov´ana atributem orientation. Pro lepˇs´ı vizu´aln´ı orientaci v prvc´ıch grafick´eho rozhran´ı lze pouˇz´ıt t´eˇz prvek oddˇelovaˇce. Jeho vzhled je pevnˇe nastaven v samotn´e aplikaci, uˇzivatel pouze m˚ uˇze specifikovat, zda se prvek zobraz´ı, ˇci nikoli. 78
Prvky uˇzivatelsk´eho rozhran´ı
Atribut
Button
Hodnoty
• orientation horizontal nebo vertical (v´ ychoz´ı) • divider
true nebo false (v´ ychoz´ı)
• weight
ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0)
Tabulka C.2: Atributy prvku linearlayout
C.4
Button
Tlaˇc´ıtka pouˇz´ıvaj´ı kromˇe z´akladn´ıho popisku i nˇekolik dalˇs´ıch d˚ uleˇzit´ ych atribut˚ u, kter´e sice nebyly v uk´azkov´ ych aplikac´ıch vyuˇzity, nicm´enˇe mohou m´ıt z´asadn´ı vliv na v´ ysledn´ y layout. Jedn´a se o atributy visible, kter´ y um´ı tlaˇc´ıtko zneviditelnit ve v´ ysledn´em layoutu pˇri zachov´an´ı jeho pozice. A d´ale byl pouˇzit atribut enabled slouˇz´ıc´ı k deaktivaci tlaˇc´ıtka. Atribut
Hodnoty
• enabled false nebo true (v´ ychoz´ı) • visible
false nebo true (v´ ychoz´ı)
• weight
ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0) Tabulka C.3: Atributy prvku button
Souˇca´st´ı kaˇzd´eho tlaˇc´ıtka je i funkce, kterou m´a tlaˇc´ıtko vykon´avat. Obecnˇe je moˇzn´e specifikovat r˚ uzn´e typy funkc´ı atributem type, nicm´enˇe v souˇcasn´e verzi polymorfn´ı aplikace je implementov´ana pouze funkce typu replace, kter´a prov´ad´ı spuˇstˇen´ı metody doLibraryFunction ve tˇr´ıdˇe specifikovan´e atributem target. Ve v´ ysledn´e aplikaci nebyla zavedena moˇznost spouˇstˇen´ı r˚ uzn´ ych funkc´ı v c´ılov´e tˇr´ıdˇe, ale atribut name byl u objektu funkce ponech´an pro moˇzn´a budouc´ı rozˇs´ıˇren´ı.
79
Prvky uˇzivatelsk´eho rozhran´ı
EditText
Atribut
Hodnoty
• type
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony
• target libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony • name
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony Tabulka C.4: Atributy prvku function
C.5
EditText
Editovateln´e poloˇzky maj´ı spoleˇcn´ y atribut hint, kter´ y pˇredstavuje n´apovˇedu v dan´e kolonce pˇredt´ım, neˇz zaˇcne uˇzivatel vyplˇ novat jej´ı obsah. Dalˇs´ım v´ yznamn´ ym atributem je type, kter´ y specifikuje pouˇzit´ı dan´eho prvku pro vybran´ y typ obsahu. T´ım je moˇzn´e prov´est obdobu validace vstupu na u ´rovni samotn´e kolonky. Skuteˇcn´a validace by vˇsak vyˇzadovala zpracov´an´ı ud´alosti pˇri zad´an´ı u ´daj˚ u do dan´eho pol´ıˇcka. Takovou funkci vˇsak nen´ı moˇzn´e jednoduˇse prov´adˇet u dynamicky vytvoˇren´eho rozhran´ı. Proto je nutn´e vystaˇcit si pˇri tvorbˇe generovan´ ych aplikac´ı s nˇekolika vybran´ ymi typy vstupu. Pˇr´ıpadnˇe pouˇz´ıt obecn´ y vstup text a validaci prov´adˇet aˇz v r´amci spouˇstˇen´e funkce doLibraryFunction. Atribut
Hodnoty
• hint
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony
• type
number pro zad´an´ı cel´eho ˇc´ısla phone pro zad´an´ı telefonn´ıho ˇc´ısla datetime pro zad´an´ı data multiline pro pouˇzit´ı v´ıceˇra´dkov´eho vstupu text (v´ ychoz´ı) pro obecn´ y vstup
• weight ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0) Tabulka C.5: Atributy prvku edittext
80
Prvky uˇzivatelsk´eho rozhran´ı
C.6
TextView
TextView
Nejd˚ uleˇzitˇejˇs´ım atributem prvku pro zobrazen´ı textu b´ yv´a zpravidla atribut text, kter´emu je pˇriˇrazen obsah prvku. Pro souvisl´e texty je vˇsak lepˇs´ı vyuˇz´ıt moˇznosti vloˇzen´ı textu do tˇela elementu, coˇz jednak zpˇrehledˇ nuje z´apis ˇsablony, a pak zajiˇst’uje, ˇze validita dokumentu ˇsablony nebude ohroˇzena nevhodn´ ym znakem v hodnotˇe atributu. Textov´e prvky je moˇzn´e stylovat pomoc´ı atributu style, kter´ y umoˇzn ˇuje rozliˇsen´ı nadpis˚ u, bˇeˇzn´eho textu a textu psan´eho kurz´ıvou. Rovnˇeˇz je moˇzn´e nastavit zarovn´an´ı textu k okraji ˇci na stˇred pomoc´ı atributu gravity. V´ yznam textu je moˇzn´e zd˚ uraznit atributem type, kter´ y um´ı rozliˇsit telefonn´ı ˇc´ısla, e-mailov´e adresy a webov´a URL. V pˇr´ıpadˇe pouˇzit´ı URL je tˇreba jeho text pˇredem pˇrek´odovat tak, aby neobsahoval nebezpeˇcn´e znaky. Pˇri naˇcten´ı tohoto textu pak probˇehne dek´odov´an´ı, takˇze je zaruˇceno korektn´ı zobrazen´ı vybran´e adresy. Atribut
Hodnoty
• text
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony (Lze nahradit obsahem elementu)
• style
italics pro pouˇzit´ı kurz´ıvy bold pro pouˇzit´ı tuˇcn´eho p´ısma bolditalics pro kombinaci obou normal obyˇcejn´ y text (v´ ychoz´ı)
• gravity right zarovn´an´ı vpravo center zarovn´an´ı na stˇred leftzarovn´an´ı vlevo (v´ ychoz´ı) • type
url pro asociaci s prohl´ıˇzeˇcem mail pro asociaci s poˇstovn´ım klientem phone pro asociaci s telefonem
• weight
ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0) Tabulka C.6: Atributy prvku textview
81
Prvky uˇzivatelsk´eho rozhran´ı
C.7
CheckBox
CheckBox
CheckBox pˇredstavuje jednoduch´ y prvek se dvˇema atributy - text pro popisek a checked pro v´ ychoz´ı hodnotu prvku. Atribut
Hodnoty
• text
libovoln´ y ˇretˇezec validn´ı v souboru ˇsablony
• checked true nebo false (v´ ychoz´ı) • weight
ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0) Tabulka C.7: Atributy prvku checkbox
C.8
ImageView
Prvek pro zobrazen´ı grafick´eho obsahu je definov´an jedn´ım atributem - src - ud´avaj´ıc´ım zdrojovou adresu obr´azku, kter´ y se zobraz´ı po naˇcten´ı prvku v uˇzivatelsk´em rozhran´ı. Pokud z nˇejak´eho d˚ uvodu ke zobrazen´ı nedojde, neprob´ıh´a ani stahov´an´ı samotn´eho obr´azku do zaˇr´ızen´ı. Vˇsechny prvky ImageView maj´ı standardnˇe obsah pˇrizp˚ usoben´ y velikosti prvku uˇzivatelsk´eho rozhran´ı a vycentrovan´ y v r´amci prvku. Je tˇreba tedy poˇc´ıtat s t´ım, ˇze zobrazen´ı dvou r˚ uzn´ ych obr´azk˚ u m˚ uˇze na stejn´em prostoru p˚ usobit rozliˇsnˇe, a pokud je to nutn´e, pouˇz´ıt oddˇelovaˇc prvku LinearLayout k oddˇelen´ı obr´azku od ostatn´ıho obsahu. Atribut
Hodnoty
• src
k´odovan´ y ˇretˇezec s adresou obr´azku
• weight ˇc´ıslo form´atu double (v´ ychoz´ı hodnota 1.0) Tabulka C.8: Atributy prvku imageview
82
Soubory ˇsablon
D Soubory ˇsablon Z pˇredchoz´ı kapitoly C vypl´ yv´a, ˇze funkce vykon´avan´a v r´amci generovan´e aplikace mus´ı vracet v´ ystup splˇ nuj´ıc´ı definici popsanou dokumentem na uk´azce D.1.
button button button button button
( function ) > text CDATA # IMPLIED > visible ( true | false ) " true " > enabled ( true | false ) " true " > weight CDATA " 1 " >
function function function function
EMPTY > type CDATA # REQUIRED > target CDATA # REQUIRED > name CDATA # IMPLIED >
gravity ( right | center | left ) " left " > type ( url | mail | phone | text ) " text " > weight CDATA " 1 " >
EMPTY > text CDATA # IMPLIED > checked ( true | false ) " true " > weight CDATA " 1 " >
checkbox checkbox checkbox checkbox
CDATA > style ( italics | bold | italicsbold | normal )
83
Soubory ˇsablon
RSS ˇcteˇcka
]>
Uk´azka k´odu D.1: Definice ˇsablony fragmentu
D.1
RSS ˇ cteˇ cka
N´asleduj´ıc´ı uk´azky obsahuj´ı ˇsablony pouˇzit´e pro spouˇstˇec´ı ˇc´ast uk´azkov´e apliˇ cka (D.2) a v´ kace RSS Cteˇ ystup samotn´e ˇcteˇcky se tˇremi poloˇzkami a bez obr´azk˚ u (D.3). < application title = " RSS ˇ C te ˇ c ka " > < edittext hint = " url " / > < edittext hint = " po ˇ c et " type = " number " / > < checkbox text = " checkbox " text = " Na ˇ c´ ı tat obr ´ a zky " / > < button text = " Na ˇ c´ ı st " > < function type = " replace " target = " com . example . control . RSSReader " name = " readUrl " / >
ˇ Uk´azka k´odu D.2: Sablona vstupn´ı ˇca´sti < fragment title = " Sport_iDNES . cz_ - _Nejlep ˇ s´ ı _sport " > < linearlayout orientation = " vertical " divider = " true " > < linearlayout orientation = " vertical " > < textview style = " bold " > ˇ C ty ˇ r i duely , ˇ c ty ˇ ri v´ y hry . Basketbalov ´ ym v´ ybe ˇr˚ u m druh ´ y den v Baku vy ˇ s el < textview style = " italics " > 24.06.2015 , 21 :14 < textview > Po ´ u tern ´ ı ch chmurn ´ y ch premi ´ er´ a ch na Evropsk ´ y ch hr ´ a ch vysvitlo pro ˇ c esk ´ e basketbalov ´ e t´ y my v Baku slun ´ ıˇ c ko . Mu ˇ zi i z ˇ eny z ´ ı skali po dvou d ˚ u le ˇ z it ´ y ch v´ ıtˇ e zstv ´ ı ch a do play - off jdou z druh ´ y ch m ´ ı st sv ´ y ch z´ a kladn ´ ı ch skupin . < textview style = " italics " type = " url " > http %3 A %2 F %2 Foh . idnes . cz %2 Fbaku - evropske - hry - basketbal -3 x3 - deh -%2 Fbaku -2015. aspx %3 Fc %3 DA150624_232404
84
Soubory ˇsablon
RSS ˇcteˇcka
_olympiada - baku -2015 _ten %23 utm_source %3 Drss %26 utm_medium %3 D feed %26 utm_campaign %3 Dsport %26 utm_content %3 Dmain < linearlayout orientation = " vertical " > < textview style = " bold " > Portugalsko - ˇ Sv´ e dsko 1 :1 , drama v z´ avˇ e ru , po rem ´ ı ze slavily oba t ´ y my < textview style = " italics " > 24.06.2015 , 20 :59 < textview > Dlouho to vypadalo na nudnou bezg ´ o lovou rem ´ ı zu , a ˇ z v z´ avˇ e ru se z ´ a pas Portugalska se ˇ Sv´ e dskem na fotbalov ´ e m Euru do 21 let zm ˇ e nil v drama . Po vedouc ´ ım g´ o lu Portugalc ˚ u ˇ Sv´ e dov ´ e na chv ´ ı li ztratili postupovou jistotu , vr ´ a til jim ji ale g ´ o l v posledn ´ ı minut ˇ e . < textview style = " italics " type = " url " > http %3 A %2 F %2 Ffotbal . idnes . cz %2 Fportugalsko - svedsko - mistrovstvi - evropy - do -21 - let - fbt -%2 Fme - fotbal -2015 . aspx %3 Fc %3 DA150624_182654_me - fotbal -2015 _min %23 utm_source %3 D rss %26 utm_medium %3 Dfeed %26 utm_campaign %3 Dsport %26 utm_content %3 Dmain < linearlayout orientation = " vertical " > < textview style = " bold " > Hokejbalist ´ e po bezbrankov ´ e rem ´ ı ze s Kanadou vyhr ´ a li na MS skupinu < textview style = " italics " > 24.06.2015 , 20 :52 < textview > ˇ Ceˇ st´ ı hokejbalist ´ e remizovali v z ´ avˇ e re ˇ cn´ em vystoupen ´ ı v z´ a kladn ´ ı skupin ˇ e na mistrovstv ´ ı sv ˇ e ta v Zugu s Kanadou 0 :0 a p ˇ r es prvn ´ ı bodovou ztr ´ a tu na turnaji ovl ´ a dli tabulku . V p ´ a tek od 17 :45 ˇ c ek ´ a sv ˇ eˇ r ence tren ´ e ra Drahom ´ ı ra Kadlece ˇ c tvrtfin ´ a lov ´ y souboj s v ´ ıtˇ e zem kvalifikace mezi Finskem a Indi ´ ı . < textview style = " italics " type = " url " > http %3 A %2 F %2 Fsport . idnes . cz %2 Fmistrovstvi - sveta - hokejbalistu -2015 - dty -%2 Fsporty . aspx %3 Fc %3 D A 1 5 0 6 2 4 _ 2 2 5 4 1 2 _ s p o r t y _ a l d %23 utm_source %3 D rss %26 utm_medium %3 Dfeed %26 utm_campaign %3 Dsport %26 utm_content %3 Dmain
Uk´azka k´odu D.3: Uk´azka v´ ystupn´ı ˇca´sti
85
ˇ Kontakty ZCU
Soubory ˇsablon
D.2
ˇ Kontakty ZCU
ˇ ˇ pˇredstavuj´ı vstupn´ı Sablony poch´azej´ıc´ı z uk´azkov´e aplikace Kontakty ZCU ˇc´ast generovan´e aplikace (D.4) a v´ ystup s vizitkou jednoho zamˇestnance (D.5). < application title = " Kontakty Z ˇ CU"> < edittext hint = " Jm ´ e no " / > < edittext hint = " P ˇ r´ ı jmen ´ ı"/> < button text = " Naj ´ ıt"> < function type = " replace " target = " com . example . control . ContactFinder " / >
ˇ Uk´azka k´odu D.4: Sablona vstupn´ı ˇca´sti < fragment title = " Ing . _Ladislav_Pe ˇ siˇ c ka " > < linearlayout orientation = " vertical " > < textview style = " bold " > Ing . Ladislav Pe ˇ siˇ c ka < linearlayout orientation = " horizontal " divider = " true " > < imageview src = " http %3 A %2 F %2 Fwww . zcu . cz %2 Ffoto . jsp %3 Fid %3 D16847 " / > < linearlayout orientation = " vertical " weight = " 2 " > < textview text = " Telefon: " / > < textview style = " italics " type = " phone " > +420377632469 < textview / > < textview text = " Email: " / > < textview style = " italics " type = " mail " > pesicka@kiv . zcu . cz < textview text = " Pracovi ˇ stˇ e:"/> < textview style = " italics " > Fakulta aplikovan ´ y ch vˇ e d < textview text = " Kancel a ´ˇ r:"/> < textview style = " italics " > UN 358
Uk´azka k´odu D.5: V´ ystup aplikace - jeden kontakt
86
Soubory ˇsablon
D.3
Dalˇs´ı uk´azky
Dalˇ s´ı uk´ azky
N´asleduj´ıc´ı uk´azka D.6 nen´ı v samotn´e aplikaci vyuˇzita, jedn´a se pouze o pˇr´ıklad, jak lze jednotliv´e prvky rozhran´ı pouˇz´ıvat. Vizu´aln´ı podobu fragment˚ u popsan´ ych touto ˇsablonou si lze prohl´ednout na obr´azku E.5. < application > < fragment title = " texty " > < linearlayout orientation = " vertical " > < textview text = " Nadpis Vlevo " gravity = " left " style = " bold " / > < textview > Lorem ipsum dolor sit amet , consectetur adipiscing elit , sed do eiusmod tempor incididunt ut labore et dolore magna aliqua . Ut enim ad minim veniam , quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat . < textview text = " Nadpis St ˇ r ed " gravity = " centerhorizontal " style = " bold " / > < textview style = " italics " > Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur . Excepteur sint occaecat cupidatat non proident , sunt in culpa qui officia deserunt mollit anim id est laborum . < textview text = " Nadpis Vpravo " gravity = " right " style = " bold " / > < fragment title = " tla ˇ c´ ı tka " > < linearlayout orientation = " horizontal " divider = " true " > < button text = " button1 " / > < button text = " button2 " / > < button text = " button3 " / > < linearlayout orientation = " horizontal " > < linearlayout orientation = " vertical " divider = " true " weight = " 1 " > < button text = " button4 " / > < button text = " button5 " / > < button text = " button6 " / > < linearlayout orientation = " vertical " weight = " 2 " > < imageview src = " https: // www . seznam . cz / favicons / 26/ b d 3 7 3 9 b 9 0 1 a a 5 a f 7 b a 3 6 d 1 d 7 4 f b 5 a 0 4 2 . jpg " / >
87
Soubory ˇsablon
Dalˇs´ı uk´azky
< linearlayout orientation = " horizontal " > < button text = " button8 " weight = " 2 " / > < button text = " button9 " weight = " 1 " / > < linearlayout orientation = " horizontal " > < button text = " button10 " weight = " 2 " / > < linearlayout orientation = " horizontal " weight = " 1 " > < button text = " button11 " / > < button text = " button12 " / > < linearlayout orientation = " horizontal " > < button text = " button13 " / > < button text = " button14 " / > < fragment title = " editace " > < edittext hint = " datum " type = " datetime " / > < edittext hint = " telefon " type = " phone " / > < edittext hint = " cislo " type = " number " / > < edittext hint = " multiline text " type = " multiline " / > < checkbox text = " checkbox " / >
Uk´azka k´odu D.6: Uk´azka text˚ u, tlaˇc´ıtek a editovateln´ ych prvk˚ u
88
Dalˇs´ı grafick´e pˇr´ılohy
E Dalˇs´ı grafick´e pˇr´ılohy Na n´asleduj´ıc´ı pˇr´ılohy je odkazov´ano v textu pr´ace, aˇckoli do nˇej nebyly pˇr´ımo zaˇrazeny. Jedn´a se o obr´azky informativn´ıho charakteru, kter´e nejsou nutn´e pro pochopen´ı principu fungov´an´ı polymorfn´ı aplikace, nicm´enˇe mohou b´ yt zaj´ımav´e zejm´ena pro uˇzivatele, kter´ y nebude aplikaci zkouˇset pˇr´ımo na fyzick´em zaˇr´ızen´ı.
E.1
Archivy dex a jar
Obr´azek E.1 zn´azorˇ nuje rozd´ıl v syst´emu kompilace obou archiv˚ u. Jedn´a se t´eˇz o d˚ uvod, proˇc nejde oba typy libovolnˇe zamˇen ˇovat.
Obr´azek E.1: Struktura jar a dex archiv˚ u, zdroj: [Nam13]
89
Dalˇs´ı grafick´e pˇr´ılohy
E.2
Polymorfn´ı aplikace
Polymorfn´ı aplikace
N´asleduj´ıc´ı sn´ımky obrazovek E.2 ukazuj´ı postup pˇri v´ ybˇeru souboru z pamˇeti zaˇr´ızen´ı. Prvn´ım krokem je vybr´an´ı aplikace spr´avce soubor˚ u (E.2a), n´asleduje v´ ybˇer souboru v samotn´e aplikaci ES File Explorer (E.2b).
(a) V´ ybˇer aplikace
(b) V´ ybˇer souboru
Obr´azek E.2: V´ ybˇer souboru ze zaˇr´ızen´ı
90
Dalˇs´ı grafick´e pˇr´ılohy
Polymorfn´ı aplikace
Obdobn´ y postup je na sn´ımc´ıch E.4, jedn´a se o v´ ybˇer souboru z u ´loˇziˇstˇe Dropbox (E.3a) a v´ ybˇer souboru z u ´loˇziˇstˇe Google Drive (E.3b).
(a) Dropbox
(b) Google Drive
Obr´azek E.3: V´ ybˇer souboru z cloudov´eho u ´loˇziˇstˇe
91
Dalˇs´ı grafick´e pˇr´ılohy
Polymorfn´ı aplikace
Pˇri staˇzen´ı souboru z URL je nejprve tˇreba zadat jeho adresu, a to ruˇcnˇe, ˇci vloˇzen´ım zkop´ırovan´eho odkazu (E.4a). N´aslednˇe je tˇreba vyˇckat, neˇz bude soubor staˇzen do zaˇr´ızen´ı (E.4b).
(a) Zad´ an´ı URL
(b) Progress dialog
Obr´azek E.4: Staˇzen´ı souboru z URL
92
Dalˇs´ı grafick´e pˇr´ılohy
Polymorfn´ı aplikace
Posledn´ı uk´azka E.5 pˇredstavuje r˚ uzn´e kombinace prvk˚ u uˇzivatelsk´eho rozhran´ı. Prvn´ı ˇc´ast pˇredstavuje kominaci r˚ uzn´ ych typ˚ u prvku TextView (E.5a). Druh´ y sn´ımek pak pˇredv´ad´ı r˚ uzn´e kombinace pouˇzit´ı prvk˚ u LinearLayout a Button (E.5b).
(a) Textov´e prvky
(b) Tlaˇc´ıtka
Obr´azek E.5: Pˇr´ıklady rozloˇzen´ı prvk˚ u
93
ˇ cka RSS Cteˇ
Dalˇs´ı grafick´e pˇr´ılohy
E.3
ˇ cka RSS Cteˇ
N´asleduj´ıc´ı sn´ımky pˇredstavuj´ı porovn´an´ı pouˇzit´ı RSS ˇcteˇcky bez stahov´an´ı obr´azk˚ u (E.6a) a pouˇzit´ı se stahov´an´ım obr´azk˚ u (E.6b)
(a) Text
(b) S obr´azky
Obr´azek E.6: V´ ysledek pr´ace RSS ˇcteˇcky
94