Mendelova univerzita v Brně Provozně ekonomická fakulta
Tvorba mobilní aplikace pro správu reklamací a závad Bakalářská práce
Vedoucí práce: Ing. Jaromír Landa
Bc. Eliška Hanáková
Brno 2015
Ráda bych poděkovala svému vedoucímu Ing. Jaromíru Landovi za pomoc při psaní této bakalářské práce, postřehy a připomínky. Dále bych ráda poděkovala rodičům a přítelovi za podporu.
Čestné prohlášení Prohlašuji, že jsem tuto práci: Tvorba mobilní aplikace pro správu reklamací a závad vypracovala samostatně a veškeré použité prameny a informace jsou uvedeny v seznamu použité literatury. Souhlasím, aby moje práce byla zveřejněna v souladu s § 47b zákona č. 111/1998 Sb., o vysokých školách ve znění pozdějších předpisů, a v souladu s platnou Směrnicí o zveřejňování vysokoškolských závěrečných prací. Jsem si vědoma, že se na moji práci vztahuje zákon č. 121/2000 Sb., autorský zákon, a že Mendelova univerzita v Brně má právo na uzavření licenční smlouvy a užití této práce jako školního díla podle § 60 odst. 1 Autorského zákona. Dále se zavazuji, že před sepsáním licenční smlouvy o využití díla jinou osobou (subjektem) si vyžádám písemné stanovisko univerzity o tom, že předmětná licenční smlouva není v rozporu s oprávněnými zájmy univerzity, a zavazuji se uhradit případný příspěvek na úhradu nákladů spojených se vznikem díla, a to až do jejich skutečné výše.
V Brně dne 14. května 2015
_________________
Abstract Hanáková, E. Creating a mobile application for managing complaints and defects. Bachelor thesis. In Brno: Mendel University, 2015. This thesis deals with the creation of application for operational system Android. Application is created for managing reclamations and faults which can appear in several projects like buildings projects. Keywords Mobile application, android, faults managing, buildings projects.
Abstrakt Hanáková, E. Tvorba mobilní aplikace pro správu reklamací a závad. Bakalářská práce. Brno: Mendelova univerzita v Brně, 2015. Tato bakalářská práce se zabývá tvorbou mobilní aplikace pro operační systém Android. Aplikace spravuje závady a reklamace, které se vyskytnou na jednotlivých stavbách či projektech. Klíčová slova Mobilní aplikace, android, správa závad, stavební projekty.
6
Obsah
Obsah 1
2
3
Úvod a cíl práce
9
1.1
Úvod ...........................................................................................................9
1.2
Cíl práce .....................................................................................................9
Operační systém Android
11
2.1
Historie Androidu.................................................................................... 11
2.2
Konkurenční operační systémy ............................................................... 12
2.3
Princip Androidu ..................................................................................... 13
2.4
Typy aplikací ............................................................................................ 15
Prvky aplikace
16
3.1
Prvky aplikace .......................................................................................... 16
3.2
Vývojové prostředí Eclipse ...................................................................... 18
4
Metodika
23
5
Tvorba aplikace
26
5.1
Struktura databáze ..................................................................................26
5.2
Hlavní obrazovka .................................................................................... 28
5.3
Seznam závad ..........................................................................................29
5.4
Nová závada ............................................................................................ 30
5.5
Editace závady .........................................................................................32
5.6
Poslání informací emailem ......................................................................33
5.7
Nový projekt ............................................................................................ 37
5.8
Editace projektů ..................................................................................... 38
5.9
Vytvoření, načtení a smazání zálohy .......................................................39
5.10 Nastavení dnů na alarm, zapnutí a vypnutí alarmu ............................... 41 6
Diskuze
44
7
Závěr
45
8
Literatura
46
Seznam obrázků
7
Seznam obrázků Obr. 1 Světové tržní podíly prodaných chytrých operačních systému dle ceny 13 Obr. 2
Architektura operačního systému Android
14
Obr. 3
Životní cyklus activity
16
Obr. 4 Ukázka emulátoru, načítající se emulátor vlevo, připravený emulátor k použití vpravo 20 Obr. 5
Ukázka struktury projektu
21
Obr. 6
Diagram obrazovek a funkcí
24
Obr. 7
Hlavní ikona aplikace
25
Obr. 8 Vlevo hlavní obrazovka, vpravo hlavní obrazovka a nabídka menu
28
Obr. 9 Vlevo seznam závad nefiltrovaný, vpravo seznam závad filtrovaný 29 Obr. 10 Vlevo nová závada, vpravo upozornění na špatně zadané datum 30 Obr. 11
Vlevo editace závady, vpravo přiložené fotografie k závadě32
Obr. 12
Vlevo poslání informací emailem, vpravo vytvořený email33
Obr. 13 Vlevo nový projekt, vpravo upozornění na prázdné jméno projektu 37 Obr. 14
Vlevo editace projektů, vpravo editace projektu
38
Obr. 15
Vlevo vytvoření zálohy, vpravo načtení a smazání zálohy 39
Obr. 16
Nastavení dnů pro alarm, zapnutí a vypnutí alarmu
41
8
Seznam tabulek
Seznam tabulek Tab. 1
Porovnání podílů na trhu
11
Úvod a cíl práce
9
1 Úvod a cíl práce 1.1
Úvod
Současnou dobu lze charakterizovat velkým rozmachem informačních technologií a s ním rozmachem mobilních zařízení. Není tomu tak dávno, kdy mobilní zařízení existovaly pouze v podobě vojenských vysílaček. Následoval vývoj mobilů, které měli ze začátku funkci pouze pro volání. V posledních letech se ale rozrostl význam mobilních zařízení, kdy již neslouží pouze pro účely hovoru, ale mají čím dál více funkcí a jsou pomocí těchto funkcí integrovány do našich životů. Mobilní zařízení tedy již neslouží pouze jako zprostředkovatel hovoru, ale obsahuje v sobě i další funkce jako jsou například alarm, předpověď počasí, navigace, přehrávač hudby a další aplikace, které mají jejich uživatelům zpříjemnit a zjednodušit život. Pojem mobilní zařízení nezahrnuje již pouze mobilní telefony, ale i tablety. Vývojáři mobilních aplikací vyvíjejí stále nové a složitější aplikace v různých oblastech použití. Tato skutečnost je umožněna stále rychlejším vývojem nových technologií mobilních zařízení. V současné době existují aplikace, které uživatele informují například o zápasech oblíbeného sportovního týmu, různé herní aplikace, aplikace, které jsou napojeny na sociální sítě, aplikace, které uživateli umožnují nakupovat přes internet, aplikace, pomocí kterých může uživatel ovládat takzvané „chytré domy“, či aplikace pro přístup k bankovním účtům. Aplikace pro mobilní zařízení ale nevyužívá pouze soukromý sektor, ale staly se i součástí firemních procesů. Právě na vývoj a využití aplikací pro firemní sektor bude zaměřena tato bakalářská práce. Aplikace bude umožňovat zadávat, evidovat a editovat informace ohledně závad a reklamací, které mohou na různých stavbách a projektech nastat. Každý projekt bude obsahovat svůj seznam závad, kdy každá závada bude obsahovat základní informace jako je poloha, fotografie závady, v jaké fázi řešení závada je, datum vzniku závady či datum, do kdy má být závada vyřešena. Všechny tyto informace o závadě bude možné zadávat hlasem, měnit a poslat komukoliv přímo z aplikace na email. Pro potřebu zálohy uložených dat v aplikaci nebo pro potřebu přenositelnosti dat například kolegovi v případě dovolené, lze všechny informace v podobě celé databáze uložit a předat kolegovi, který si je může na svém mobilním zařízení načíst.
1.2 Cíl práce Cílem této bakalářské práce je vytvoření aplikace, která bude spravovat závady na různých projektech nebo stavbách a bude vytvořena dle požadavků stavební společnosti Stavit, s.r.o. Cílem aplikace je evidovat různé stavby a různé závady na nich a tím zjednodušit a zpřehlednit práci stavby vedoucích. Zároveň musí evidovat všechny
10
Úvod a cíl práce
požadované informace a musí mít možnost předání těchto informací jiným osobám. Aplikace bude vytvářena ve vývojovém prostředí Eclipse a bude vytvářena pro operační systém Android. Aplikace bude převážně tvořena pomocí jazyku Java a dále pomocí SQL a XML.
Operační systém Android
11
2 Operační systém Android Android je operační systém, který je navržen pro mobilní zařízení, a je založen na open source platformě. Je založený společností Google a je v držení společnosti Open Handset Alliance. Hlavním účelem bylo vytvořit open source platformu, která bude nabízet větší množství aplikací a zároveň bude pro zákazníky levnější. Jedná se o první operační systém pro mobilní zařízení, který zcela odděluje software od hardwaru, uvádí Gargenta a Nakamura (2014). Vstup androidu v roce 2008 výrazně ovlivnil trh chytrých telefonů. Již po dvou letech od vstupu androidu na trh byl druhou nejpoužívanější platformou pro mobilní zařízení ve Spojených státech amerických, popisuje Hoog (2011).
2.1 Historie Androidu Na následujících řádcích budou uvedeny významné události, které ovlivnily operační systém Android. Prvním významným rokem je rok 2005, kdy společnost Google kupuje Android. Následuje rok 2007, kdy je oznámen vznik aliance „Open Handset Alliance“ a Android se oficiálně stává open source platformou. V následujícím roce 2008 je na trhu představen takzvaný G1 mobil a zároveň je vydána první verze androidu „Android SDK 1.0“. V následujících letech jsou vydávány nové verze Androidu a tato platforma se stává čím dál rozšířenější. V roce 2011 je android na prvním místě, co se týče nově prodaných přístrojů. V roce 2013 jsou na trh vydány „Google brýle“, které také používají systém Android. Operační systém Android tedy používají nejen mobilní telefony, ale i tablety, televize, atd. V roce 2014 se Android stává nejpoužívanějším operačním systémem pro mobilní zařízení, jak dokládá tabulka níže. Tab. 1
Porovnání podílů na trhu
Název operačního systému Android iOS Windows Phone BlackBerry Ostatní
Podíl na trhu 84,7 % 11,7 % 2,5 % 0,5 % 0,6 %
Zdroj: androidpolice.com(2014)
Vize Androidu do budoucnosti je konkurovat jinému open source operačnímu systému Linuxu, a rozšířit tím android i do palubních desek automobilů, domovních automatizovaných systémů a jiných zařízení. Na řádcích výše byla zmíněna aliance „Open Handset Alliance“, tato aliance je tvořena nejen společností Google, ale také mobilními operátory, softwarovými
12
Operační systém Android
i hardwarovými společnostmi, kteří se zavázali, že budou usilovat o otevřenost a inovaci na poli mobilních zařízeních, uvádí Gargenta a Nakamura (2014).
2.2 Konkurenční operační systémy Největším konkurentem operačního systému Android je iOS. Tento operační systém lze najít pouze na mobilních zařízeních, které jsou vyrobeny od společnosti Apple. Společnost Apple prosazuje zásadu, že operační systém a hardware jsou spolu úzce propojeny. Aby byla zajištěna jejich maximální výkonost musí být vyvíjeny společně. Cenová hladina těchto mobilních zařízení je však vyšší, než jak tomu je u Androidu, uvádí Lafek (2015). Druhým největším konkurentem je Windows Phone, který funguje lépe oproti Androidu a iOS na zařízeních, které mají slabší hardwarové vybavení, tedy na mobilních zařízeních, které budou levnější. Oproti předešlým operačním systémům má ale velmi málo aplikací, které by na něm fungovali, uvádí Lafek (2015). Posledním konkurentem, který bude brán v potaz je BlackBerry. Tento operační systém měl donedávna velmi málo aplikací, které by na něm fungovaly, avšak nyní na něj lze nainstalovat aplikace, které jsou určené pro Android, funkčnost aplikací může být omezena. Tento operační systém je vhodný pro manažery, kteří potřebují mít k dispozici neustálou a snadnou komunikaci s okolím. Tuto komunikaci BlackBerry podporuje BlackBerry Hubem, což je aplikace, která obsahuje všechny zprávy z různých zdrojů, jako jsou sociální sítě, emaily a BlackBerry Messenger, uvádí Lafek (2015). Obrázek níže názorně ukazuje porovnání jednotlivých operačních systémů podle ceny zařízení, ve druhém čtvrtletí v roce 2014. Jak lze vidět, tak Android a Windows Phone mají největší objem a to kolem 60 % prodaných zařízení v nízké cenové relaci do 200 dolarů. Naopak iOS má největší objem kolem 80 % prodaných zařízení v nejvyšší cenové relaci nad 400 dolarů, uvádí Kilián (2014).
Operační systém Android
13
Obr. 1 Světové tržní podíly prodaných chytrých operačních systému dle ceny Zdroj:svetandroida.cz (2014)
2.3 Princip Androidu Operační systém android je založen na 5 vrstvách, které společně zajišťují chod celého operačního systému. Na obrázku níže jsou jednotlivé vrstvy znázorněny a u každé vrstvy je uvedeno, které prvky obsahuje.
14
Operační systém Android
Obr. 2 Architektura operačního systému Android Zdroj: Meier (2009)
2.3.1
Linux Kernel
První vrstva je linuxové jádro, které je při každém zapnutí zařízení nataženo do jeho paměti. Využívání linuxového jádra v operačním systému Android má svá opodstatnění, Linux je totiž velice flexibilní operační systém, který lze použít na různá zařízení, slouží tedy Androidu k abstrakci od hardwaru, protože linuxové jádro ovládá hardwarové komponenty. Zároveň se stará o řízení paměti, přístup k síti, či bezpečnost. Vzhledem k tomu, že je Linux jako operační systém v rámci výpočetní techniky dlouhodobě využíván, tak se jedná o velmi bezpečný operační systém, popisuje Gargenta a Nakamura (2014). 2.3.2
Libraries
Druhou vrstvu tvoří knihovny, které běží nad první vrstvou tvořenou linuxovým jádrem. Mezi knihovny patří například „mediální knihovna“, která je používána při přehrávání audiovizuálních záznamů nebo videí. Nebo knihovna „SQLite knihovna“, která slouží k ukládání dat do databáze, popisuje Meier (2012).
Operační systém Android
2.3.3
15
Android Run Time
Tato třetí vrstva obsahuje jednak základní knihovny a také „Dalvik Virtual Machine“, což je virtuální zařízení, které zabezpečuje, že na zařízení bude moci efektivně běžet více procesů v jeden okamžik. Aby bylo dosaženo co nejvyšší bezpečnosti, tak každý nový proces vytvoří nový Dalvik VM, v jednom okamžiku tedy na daném zařízení může existovat několik Dalvik VM. Za účel minimalizace spotřeby paměti sdílí mezi sebou všechny Dalvik VM systémové knihovny, popisuje Gargenta a Nakamura (2014). 2.3.4
Application Framework
Čtvrtá vrstva obsahuje aplikační rámec, pomocí kterého mohou programátoři mobilních aplikací přistupovat k nejrůznějším službám mobilního zařízení v rámci své aplikace. Mohou například přistoupit ke zjištění lokace, Wi-Fi či sensorům. Tento aplikační rámec umožňuje nejen přistoupit, ale i pracovat s obsahem jiných aplikací jako jsou například aplikace Kontakty či Kalendář, popisují Vávrů Jiří, Ujbányai Miroslav (2013). 2.3.5
Application Layer
Poslední vrstva je aplikační a zahrnuje již samostatné aplikace, které byly na daném mobilním zařízení nainstalovány. Tato vrstva tedy obsahuje takzvané „Nativní aplikace“, mezi které řadíme například Kontakty či Prohlížeč. Dále také aplikace od vývojářů nebo aplikace třetích stran.
2.4 Typy aplikací Aplikace lze rozdělit na následující tři typy: Aplikace běžící na popředí - pro tyto aplikace je charakteristické, že je potřeba, aby běžely, pouze pokud je uživatel používá. Jedná se tedy například o aplikace používající mapy nebo hry. Aplikace běžící na pozadí - u těchto aplikací je potřeba, aby běžely, i když je uživatel momentálně nepoužívá. Jedná se například o aplikace, které sledují, jestli nedošla nová sms zpráva, nebo jestli není nový příchozí hovor. Aplikace s přerušovanou činností - u těchto aplikací je typické, že se požaduje jejich chod na pozadí, a zároveň, aby uživatele upozornily na nastalé situace. Jedná se například o přehrávač muziky, popisuje Ujbányai (2012).
16
Prvky aplikace
3 Prvky aplikace V následující kapitole bude čtenář seznámen s jednotlivými prvky, které tvoří aplikaci, dále s životním cyklem aplikace a s vývojovým prostředím Eclipse.
3.1 Prvky aplikace Každá aplikace obsahuje několik prvků, které spolu dohromady vytvářejí fungující aplikaci, jednotlivé prvky budou níže popsány. 3.1.1
Activity
Activity je základní stavební kámen každé aplikace. Lze na ní pohlížet tak, že každá obrazovka, která se uživateli zobrazí, je jedna activity. Uživatel se může mezi jednotlivými activity libovolně pohybovat a to i zpět na předchozí activity. Každá aplikace má více acivity a každá activity používá několik prvků, které budou popsány níže. Activity je tedy ta část aplikace, která je nejvíce vidět. Každá aplikace má tzv. hlavní activity, která se většinou zobrazuje jako první obrazovka, kterou uživatel uvidí po spuštění aplikace. Activity mají svůj životní cyklus, který je zobrazen na obrázku níže, popisuje Gargenta a Nakamura (2014).
Obr. 3 Životní cyklus activity Zdroj: Developer android (2014)
Prvky aplikace
17
Celý životní cyklus activity, tedy od jejího spuštení, až po její konec, proběhne mezi metodami onCreate a onDestroy. Viditelná část activity, tedy ta část activity, kterou uživatel vidí na své obrazovce, proběhne mezi metodami onStart a onStop. Activity je v popředí tehdy, když je před všemi ostatními activity, které běží na daném zařízení. Je tedy viditelná uživatelem a je připravena pro interakci s uživatelem, mezi metodami onResume a onPause. Metoda onCreate je zavolána při prvním vytvoření aktivity. V této metodě se nastavují všechny statické prvky jako je například View nebo zjištění dat, která byla poslána předchozí aktivitou. Po této metodě vždy následuje metoda onStart. Metoda onRestart je zavolána v případě, kdy byla activity zastavena a nyní se má znovu spustit. Po této metodě také vždy následuje metoda onStart. Metoda onStart je zavolána těsně před tím, než se activity stane viditelnou uživateli. Po této metodě může následovat buď metoda onResume, a to v případě, kdy se activity dostává do popředí, anebo onStop, a to v případě, kdy má byt activity skryta. Metoda onResume je zavolána těsně před tím, než je activity připravena interagovat s uživatelem. V této fázi se activity nachází na vrcholu zásobníku všech activit a uživatel s activity může interagovat a zadávat jí vstup. Metoda onResume je vždy následována metodou onPause. Metoda onPause je zavolána pokaždé, když má být na jiné activity zavolána metoda onResume. V této metodě se ukládají neuložená data, která by byla jinak ztracena nebo se zastavují animace. Po této metodě je buď zavolána metoda onResume, a to v případě, kdy se activity opět dostává do popředí, anebo je zavolána metoda onStop, a to v případě, kdy se activity stává pro uživatele neviditelnou. Metoda onStop je zavolána, pokud se activity stane pro uživatele neviditelnou. Activity se může stát pro uživatele neviditelnou buď proto, že ji překryla jiná aktivity, anebo pokud byla daná activity zničena metodou onDestroy. Po této metodě tedy může následovat buď metoda onResume, v případě, kdy se má activity opět dostat do popředí, anebo v případě zničení aktivity, metoda onDestroy. Poslední metodou je onDestroy, která je zavolána před tím, než je daná activity zničena. Tato metoda je zavolána, pokud na danou activity někdo zavolal metodu finish, která říká, že activity má být ukončena. Anebo pokud operační systém maže danou aktivity, aby ušetřil místo v paměti, uvádí Developer android oid (2014). 3.1.2
Intents
Intents jsou systémové zprávy, které jsou posílány v rámci zařízení jako reakce na události, jako jsou například: vložení SD karty, příchozí SMS, spuštění nové aktivity. Na intenty lze v rámci dané aplikace nejen reagovat, ale zároveň si pro-
18
Prvky aplikace
gramátoři vytváří své vlastní, aby pomocí nich mohli spouštět další aktivity a mezi aktivitami si posílat důležitá data, popisuje Murphy (2011). 3.1.3
Services
Service je prvek, který běží na pozadí bez jakékoliv interakce s uživatelem. Služba může být spuštěna, využívána či zastavena jakýmkoliv prvkem aplikace, dokonce se služba může sama zastavit, uvádí Schwarz a spol (2013). Dle Darcey a Conder (2012) se možnosti poskytovaných služeb mohou dle zařízení lišit, například mapovací služby jsou součástí nadstavby vytvořené společností Google a tedy nemusí je obsahovat všechny mobilní zařízení, které obsahují operační systém Android. 3.1.4
Content providers
Content providers umožňují efektivně sdílet velké množství dat mezi různými aplikacemi. Například Contacts provider, umožňuje přístup všem aplikacím ke všem uživatelovým kontaktům. Na této ukázce je vidět, jak funguje aplikace Kontakty, která ve skutečnosti neobsahuje žádná data, a zároveň Contacts provider, který obsahuje data o kontaktech, ale nemá žádné uživatelské rozhraní, popisuje Gargenta a Nakamura (2014). 3.1.5
Broadcast Recievers
Pokud vytvoříme a zaregistrujeme Broadcast reciever, může naše aplikace sledovat, zdali nějaký Intent nevysílá data, která se shodují s námi nastavenými kritérii. Pokud se data s kritérii budou shodovat, může Broadcast reciever spustit požadovanou aplikaci. Gargenta a Nakamura (2014) uvádí jako základní stavební kameny každé aplikace výše zmíněných pět prvků, avšak Meier (2012) přidává k těmto pěti ještě jeden prvek: Notifications. 3.1.6
Notitfications
Notification je způsob upozornění uživatele, že se stala nějaká událost bez toho, aby se přerušila uživatelova právě probíhající činnost. Například pokud uživatel používá nějaký browser a zároveň obdržel novou sms zprávu, začne mobilní zařízení vibrovat, blikat, atd., popisuje Meier (2012).
3.2 Vývojové prostředí Eclipse Aby bylo možné vytvářet aplikace pro Android, je třeba mít v počítači takzvané Android SDK (Software Development Kit) a JDK (Java Development Kit), které lze zdarma stáhnout na internetových stránkách. Android SDK obsahuje samotnou platformu, ukázky kódu, nástroje pro vývoj aplikací a dokumentaci potřeb-
Prvky aplikace
19
nou pro vývoj aplikací. Aby nebylo nutné hledat a stahovat další potřebné doplňky, vytvořila společnost Google balíček, který pojmenovala ADT Bundle, jenž obsahuje již všechny prvky potřebné pro vývoj. Lze jej používat v operačních systémech Windows, Mac OS i Linux. Vývojové prostředí Eclispe je velmi často používané při vývoji aplikací pro Android. Lze jej zdarma stáhnout z internetových stránek, kdy je stáhnut soubor, který je třeba rozbalit. Po rozbalení lze Eclipse ihned používat. Při prvním spuštění je uživatel dotázán, jak si přeje pojmenovat svoje pracovní místo, kam se budou jednotlivé aplikace ukládat, po tomto kroku lze ihned vytvářet první aplikaci, popisuje Haseman (2011). 3.2.1
Emulátor
V rámci vývojového prostředí Eclipse je k dispozici i emulátor, který je používán v případě, kdy chceme zkusit, jestli námi vytvořená aplikace bude fungovat na telefonu. Emulátor je implementace virtuálního stroje, který běží na počítači, kde je aplikace vyvíjena. Emulátor se tedy používá k testování vyvíjené aplikace, aniž bychom museli používat reálný telefon. Vývojové prostředí Eclipse umožňuje uživateli nastavit si různé vlastnosti Emulátoru, například pojmenování telefonu, typ telefonu, paměť telefonu, nebo zdali bude mít telefon fotoaparát, popisuje Meier (2009). Při spuštění emulátoru se nejdříve objeví načítající se obrazovka emulovaného telefonu, tak jak je tomu na levém obrázku níže. Po plném načtení emulátoru se objeví druhá obrazovka, tak jak je ukázáno na obrázku níže vpravo.
20
Prvky aplikace
Obr. 4 Ukázka emulátoru, načítající se emulátor vlevo, připravený emulátor k použití vpravo Zdroj: vlastní tvorba autorky
3.2.2
Struktura Android projektu
Při zakládání nového projektu bude uživatel veden přes dialogová okna. V těchto oknech postupně vyplní Eclipsem požadované informace jako je například název nového projektu, místo uložení nového projektu či jméno vytvářené aktivity. Bez zadání jakéhokoli kódu vytvoří Eclipse v rámci nového projektu několik souborů, které jsou organizovány do stromové struktury, jak je zobrazeno na obrázku níže.
Prvky aplikace
21
Obr. 5 Ukázka struktury projektu Zdroj Gargenta a Nakamura (2014)
První složkou, která bude popsána, bude složka res. V této složce se nachází soubor AndroidManifest.xml. Tento soubor obsahuje: balíček, ve kterém se nová aplikace nachází, verze aplikace, kód aplikace a její jméno, cílové SDK, které je potřeba pro to, aby mohla být aplikace spuštěna, povolení, která jsou potřebná pro spuštění aplikace, uživatelská povolení, která jsou deklarována nebo mohou být požadována od prvků aplikace. Dále jsou zde informace o aplikaci a o základních stavebních prvcích aplikace, kterými jsou activity, services, providers, recievers. Další složkou, která bude rozebrána je složka values, kde se nachází soubor strings.xml. V tomto souboru se nachází páry - název hodnoty a hodnota. Umožňuje tedy oddělení Java kódu od řetězců, uvádí Gargenta a Nakamura (2014). Pokud tedy potřebujeme změnit některé textové prvky, jako je například text tlačítka, nebudeme měnit text na tlačítku tam, kde je napsaný Java kód nebo XML kód, ale ve složce values/strings.xml. Tyto textové hodnoty lze mít napsány v několika odnožích souboru strings.xml, kdy každý další soubor zastupuje jiný jazyk, což se projeví tak, že pokud bude na telefonu změněno nastavení jazyku z anglického na španělský, tak i v aplikaci dojde k této změně, pokud v ní bude příslušný soubor typu strings.xml. Složka layout obsahuje soubor, který umožňuje oddělit prezentační vrstvu od logiky fungování aplikace. Tento soubor může být například pojmenován main.xml. Jednotlivé prvky uživatelského rozhraní tedy budou uvedeny zde, a
22
Prvky aplikace
nikoliv v Java kódu. Layout je ta část aplikace, kterou uživatel vidí. Každý layout má svůj vlastní soubor, uvádí Meier (2012). Posledními složkami, které se nachází ve složce res jsou čtyři složky s názvem drawable. Tyto složky se liší v názvu pouze v části za pomlčkou, která uvádí, o jaké rozlišení se jedná. Tyto složky obsahují stejné obrázky, ale každý obrázek je určen pro jiné rozlišení. Pokud tedy bude mít mobilní zařízení nastaveno malé rozlišení, bude v aplikaci použit obrázek, který se nachází ve složce drawable-ldpi a obdobně u ostatních rozlišení, uvádí Gargenta a Nakamura (2014). Dalším adresářem po adresáři res je adresář bin, jenž obsahuje aplikaci, která již byla jednou zkompilována. V adresáři assets jsou uchovány všechny statické složky, které si vývojář přeje přiložit do balíčku dané aplikace. Do adresáře gen se ukládají zdrojové kódy generované android build tools. V adresáři src jsou uloženy zdrojové kódy napsané v jazyce Java. Tedy takové kódy, které vytváří logiku celé aplikace, uvádí Murphy (2011).
Metodika
23
4 Metodika První fází vývoje nové aplikace je sběr požadavků na aplikaci. Požadavky byly zjišťovány během dvou sezení, kdy společnost vysvětlila své základní požadavky na aplikaci a kde proběhla dohoda s autorkou. Během prvního sezení byly autorce sděleny základní požadavky, které byly na druhém sezení rozšířeny a upřesněny. Požadavky společnosti byly: Možnost vytvářet stavby neboli projekty a u těchto projektů evidovat jednotlivé závady. U každého projektu budou evidovány informace: název projektu a lokace projektu. U každé závady budou evidovány informace: název závady, poloha závady (například druhé patro vlevo), datum, kdy závada vznikla, datum, do kdy má být závada opravena, dále možnost evidovat u závady poznámky, evidovat zda byla závada již vyřízena či nikoliv, možnost vkládat fotografie závady (bylo upřesněno, že počet je stanoven na čtyři fotografie). Dále možnost evidovat u každé závady, v jakém stavu se závada nachází. Možnost poslat informace o závadě včetně fotografií a stavu závady na email. Možnost veškeré informace editovat, mazat a přidávat závady a projekty. Možnost nastavit upozornění na dobu, do kdy má být závada vyřízena. Možnost provést zálohu všech závad, možnost načíst jinou zálohu a možnost zálohu smazat. Možnost zadávat informace hlasem. Autorka si požadavky sepsala a rozhodla se, že vzhledem k požadavkům a povaze dat bude nejlepší možností, jak skladovat data, skladovat je pomocí SQLite databáze, protože se jedná o opakující se strukturovaná data. Po sdělení požadavků autorka vytvořila návrh logiky a funkcí aplikace, který je zobrazen na obrázku níže.
24
Metodika
Obr. 6 Diagram obrazovek a funkcí Zdroj: vlastní tvorba autorky
Jak lze z obrázku vidět, z hlavní obrazovky lze: Vytvořit nový projekt. Vybrat projekt, který chce uživatel editovat a následně daný projekt editovat. Zálohovat databázi. Vybrat databázi, kterou chce uživatel načíst a vybranou databázi načíst. Vybrat databázi, kterou chce uživatel smazat a danou databázi smazat. Nastavit alarm na počet dnů, které zbývají do konce termínu, kdy má být závada opravena. Zapnout alarm, který hlídá, zdali má nějaká závada nastavený počet dnů před koncem doby, do které má být opravena. Pokud ano, uživatel bude upozorněn notifikací s odkazem na danou závadu. Vypnout alarm.
Metodika
25
Uživatel může kliknout na zvolený projekt a objeví se mu seznam závad v daném projektu. V tomto seznamu může filtrovat závady, které byly již vyřízené, tedy zobrazí se mu buď všechny závady anebo jen nevyřízené závady. Dále má možnost přidávat nové závady. Může smazat jakoukoliv závadu. Může editovat jakoukoliv závadu, a pokud ji edituje, může veškeré informace o závadě poslat komukoliv na email. Poslední možností je smazání projektu, pokud bude daný projekt smazán, budou smazány i všechny závady, které obsahuje.
Dalším krokem po rozvržení logiky a funkcí aplikace, bylo vytvoření jejího designu tak, aby celkový dojem působil uceleně, a proto byly vybrány kombinace z palety s názvem „Blue grey“. Následovalo vytvoření hlavní ikony aplikace, která bude zobrazena na ploše telefonu.
Obr. 7 Hlavní ikona aplikace Zdroj: vlastní tvorba autorky
Jednotlivé třídy se nachází ve složce src a jejich funkcionalita bude probrána níže. Další složku, kterou aplikace obsahuje je složka res. Její podsložka layout obsahuje jednak všechny layouty pro jednotlivé aktivity a fragmenty, ale také layout pro jednotlivé položky v seznamu. Složka res dále obsahuje všechny ikony a obrázky, které byly v aplikaci použity a to v podsložkách drawable. Další podsložkou ve složce res je složka menu, která obsahuje všechny menu, které byly vytvořeny pro různé aktivity. Další složka ve složce res je values, která obsahuje definované řetězce, které jsou v aplikaci používány. Dále obsahuje definování barev, kdy jsou tyto barvy používány v celé aplikaci. Dále obsahuje základní nastavení obrazovky a styl.
26
Tvorba aplikace
5 Tvorba aplikace 5.1
Struktura databáze
Vzhledem k povaze dat, která jsou strukturovaná a budou často vytvářena, měněna a mazána, rozhodla autorka data ukládat pomocí SQL databáze. Android umožnuje ukládat data pomocí SQLite databází, kdy prvním krokem je navržení schéma databáze, neboli formální deklarace toho, jak bude databáze organizována, uvádí developer.android (2015). Všechny tyto informace obsahuje v tomto projektu třída “DatabaseHelper“, která je potomkem třídy „SQLiteOpenHelper“. Na ukázce kódu níže lze vidět základní strukturu třídy Projekt a třídy Závada. Třída závada obsahuje mimo jiné atributy photo1 až photo4, kdy do těchto atributů jsou ukládány fotografie, které uživatel přiložil k dané závadě. Dalším podstatným atributem je idprojektu, který obsahuje identifikační číslo projektu neboli stavby, ke kterému závada náleží. Pomocí tohoto atributu jsou pak selektovány závady a přiřazovány k projektům. public static final class Projekt implements BaseColumns{ public static final String TABLE_NAME = "projekt"; public static final String _ID = BaseColumns._ID; public static final String _NAME = "name"; public static final String _LOKACE = "lokace"; } public static final class Zavada implements BaseColumns{ public static final String TABLE_NAME = "zavada"; public static final String _ID =BaseColumns._ID; public static final String _NAME = "name"; public static final String _LOKACEL = "lokacel"; public static final String _ZACATEK = "zacatek"; public static final String _KONEC = "konec"; public static final String _VYRIZENO = "vyrizeno"; public static final String _POZNAMKY = "poznamky"; public static final String _PHOTO = "photo"; public static final String _PHOTO2 = "photo2"; public static final String _PHOTO3 = "photo3"; public static final String _PHOTO4 = "photo4"; public static final String _IDPROJEKTU = "idprojektu"; }
Tvorba aplikace
27
V metodě onCreate ve třídě DatabaseHelper pak dochází k vlastnímu vytvoření jednotlivých tabulek databáze tak, jak lze vidět na kódu níže, kde je vytvářena tabulka projektu. db.execSQL( "CREATE TABLE " + Projekt.TABLE_NAME + "(" + Projekt._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + Projekt._NAME + " TEXT NOT NULL UNIQUE, " + Projekt._LOKACE +" TEXT NOT NULL )" ); Pro vytváření nového projektu nebo závady jsou vytvořeny speciální metody. V následujícím kódu je ukázána metoda pro tvorbu nového projektu a vložení hodnot zadaných uživatelem do databáze. public void insertProjekt( String title,String lokace){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Projekt._NAME, title); values.put(Projekt._LOKACE, lokace); db.insert(Projekt.TABLE_NAME, null, values); } Projekt a závady lze nejen vytvářet, ale i editovat. Pro tento případ jsou opět vytvořeny metody. Metodu pro úpravu projektu lze vidět níže. Tato metoda potřebuje parametry, které byly editovány uživatelem a id projektu, který byl upraven. public int updateProjekt( String title,String lokace, long id) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Projekt._NAME, title); values.put(Projekt._LOKACE, lokace); return db.update(Projekt.TABLE_NAME, values, Projekt._ID + " = ?", new String[] { String.valueOf(id) }); } Pro možnost smazání celého projektu je vytvořena metoda níže. Tato metoda se od metody smazání závady liší tím, že se smaže nejen projekt, ale smažou se zároveň se smazáním projektu i všechny závady, které obsahoval. public void deleteProjekt( long id) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(Projekt.TABLE_NAME, Projekt._ID + " = ?", new String[] { String.valueOf(id) });
28
Tvorba aplikace
db.delete(Zavada.TABLE_NAME, Zavada._IDPROJEKTU + " = ?", new String[] { String.valueOf(id) }); }
5.2 Hlavní obrazovka
Obr. 8
Vlevo hlavní obrazovka, vpravo hlavní obrazovka a nabídka menu
Hlavní obrazovka obsahuje seznam všech staveb neboli projektů, které uživatel vytvořil. Pokud uživatel klikne na nějaký projekt, tak se dostane do seznamu všech závad, které se na dané stavbě nachází. Pokud uživatel provede takzvaný LongClick (neboli dotyk delší než jedna vteřina) na některý z projektů, bude dotázán, zdali chce opravdu smazat daný projekt. Pokud tuto akci potvrdí, tak se smaže celý projekt a s ním všechny závady, které se v daném projektu nacházely. Uživatel může zvolit z nabídky menu jednu z nabízených možností, které se objeví po kliknutí na nabídku v pravém horním rohu, tyto možnosti budou probrány níže.
Tvorba aplikace
29
5.3 Seznam závad
Obr. 9
Vlevo seznam závad nefiltrovaný, vpravo seznam závad filtrovaný
Pokud uživatel klikl na některý z projektů, tak se dostane na seznam závad evidovaných v dané stavbě. Pokud klikne na závadu, dostane se na obrazovku, kde se zobrazí informace o závadě a zároveň může závadu editovat. Pokud uživatel klikne na menu, zobrazí se mu dvě možnosti: filtruj, kdy se zobrazí jen ty závady, které jsou nevyřízené, anebo nefiltruj, kdy se zobrazí všechny závady, včetně vyřízených. Další možností je kliknutí na tlačítko plus, jehož prostřednictvím je možné vytvořit novou závadu. Pokud uživatel provede LongClick na závadu, opět se mu zobrazí dialog, jestli chce danou závadu smazat, pokud ano, závada bude smazána z databáze. Při načítání seznamu závad se při hledání v databázi používá pouze jedna podmínka, a to atribut idprojektu, který určuje náležitost závady k projektu. Pokud však uživatel zvolí možnost filtrování, přidá se při vyhledávání druhá podmínka, jak lze vidět na ukázce níže. DatabaseHelper bookH = new DatabaseHelper(this); SQLiteDatabase db = bookH.getReadableDatabase(); String[] selectionArgs = {KodProjektu, "Nevyřízeno"}; String where = "IDPROJEKTU=? AND VYRIZENO=?"; Cursor cursor = db.query(Zavada.TABLE_NAME, null, where, selectionArgs, null, null, null);
30
Tvorba aplikace
5.4 Nová závada
Obr. 10
Vlevo nová závada, vpravo upozornění na špatně zadané datum
V obrazovce Nová Závada může uživatel vytvořit novou závadu. Položky: Jméno Závady, Poloha a Poznámky může uživatel diktovat hlasem, což byl jeden z požadavků společnosti. Dále může zadat datum vzniku závady a datum, do kdy je závadu potřeba vyřídit. Pokud uživatel zadá položku „datum do kdy vyřídit“ dřívějšího data, než položku „datum vzniku“, tak bude upozorněn, že je třeba, aby položka „datum do kdy vyřídit“ byla pozdějšího data, než datum „vzniku závady“. Stejně tak bude upozorněn, pokud nezadá „jméno závady“, že je potřeba jej vyplnit. Uživatel může zatrhnout políčko, jestli danou závadu již vyřídil nebo ne. Dále může v dolní části scrolovací obrazovky vybrat fotografie, které bude chtít u závady evidovat. Po kliknutí na ikonu diskety se závada uloží a uživatel se dostane zpět na seznam závad. Jako jeden z hlavních požadavků na aplikaci byl uveden požadavek na možnost zadávání informací hlasem. Tento požadavek byl zcela splněn a to pomocí metody uvedené níže. Zadávání hlasem se spustí, pokud uživatel použije LongClick na editovatelnou položku, jak je ukázáno v kódu níže u položky název. Vytvoří se nový intent typu RecognizerIntent, kterému se následně vloží typ jazyku, kterým bude uživatel hovořit. Pokud uživatel nemá ve svém zařízení podporu překladu mluveného slova do textu, zobrazí se mu oznámení, že jeho zařízení tuto funkcionalitu nemá. nazevE.setOnLongClickListener(new View.OnLongClickListener() {
Tvorba aplikace
31
@Override public boolean onLongClick(View v) { Intent intent = new Intent( RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "cs"); try { startActivityForResult(intent, RESULT_SPEECH); nazevV=nazevE.getText().toString(); } catch (ActivityNotFoundException a) { Toast t = Toast.makeText(getApplicationContext(), "Vaše zařízení nepodporuje mluvené zadávání textu", Toast.LENGTH_SHORT); t.show(); } return true; } }); V metodě onActivityResult je pak tato akce vyhodnocena dle požadovaného identifikátoru, který je v tomto případě “RESULT_SPEECH“. Pokud vše proběhlo v pořádku, tak je převzat list řetězců a ten je přidán k řetězci, který před úpravou v daném poli již existoval. Metoda onActivityResult je zavolána, pokud byla spuštěna nějaká aktivita pomocí metody startActivityForResult, tato aktivita skončila a zároveň potřebujeme zjistit nějaké informace z takto spuštěné aktivity. case RESULT_SPEECH: { if (resultCode == RESULT_OK && null != data) { ArrayList<String> text = data .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); String i=nazevV+text.get(0); i = i.substring(0,1).toUpperCase()+ i.substring(1).toLowerCase(); nazevE.setText(i); } break;
32
Tvorba aplikace
5.5 Editace závady
Obr. 11
Vlevo editace závady, vpravo přiložené fotografie k závadě
V rámci této obrazovky může uživatel prohlížet a měnit všechny zadané informace. Může hlasem editovat položky: Jméno Závady, Poloha, Poznámky. Dále může měnit i fotografie, které jsou k závadě přiložené. Pokud klikne na ikonu fotografie krátce, požadovaná fotografie se zvětší. Pokud klikne dlouze, otevře se dialogové okno, kde uživatel může zvolit možnost: „vymazat fotografii“ nebo „vybrat jinou fotografii“, kdy se otevře galerie fotek, ze které může vybrat požadovanou fotografii a přiložit ji tak k informacím o závadě. Pokud uživatel klikne na možnost stav oprav, ukáže se mu nová obrazovka, která mu umožnuje přidávat poznámky o stavu závady. Tyto poznámky o stavu závady lze dlouhým klikem smazat. Pokud chce uživatel veškeré informace uložit, tak klikne na ikonu diskety. Pokud klikne na ikonu obálky, dostane se do možnosti poslat všechny informace o závadě emailem. Při načítání informací o závadě je použita následující ukázka kódu, kdy je závada nejdříve vyhledána dle jejího id a následně jsou načteny všechny informace, které jsou v ní uloženy do proměnných typu String, krom fotografií, které jsou uloženy ve formátu BLOB. DatabaseHelper bookH = new DatabaseHelper( getActivity()); SQLiteDatabase db = bookH.getReadableDatabase(); String[] selectionArgs = {KodZavady}; Cursor cursor=db.query(Zavada.TABLE_NAME, null, Zavada._ID + " = ?", selectionArgs, null, null, Zavada._NAME); while(cursor.moveToNext()) {
Tvorba aplikace
33
nazevS = cursor.getString(cursor.getColumnIndex(Zavada._NAME)); polohaS=cursor.getString(cursor.getColumnIndex(Zavada._LOKACEL)); datumVznkuS= cursor.getString(cursor.getColumnIndex(Zavada._ZACATEK)); datumKonceS= cursor.getString(cursor.getColumnIndex(Zavada._KONEC)); doneS = cursor.getString(cursor.getColumnIndex(Zavada._VYRIZENO)); poznamkyS= cursor.getString(cursor.getColumnIndex(Zavada._POZNAMKY)); photoS = cursor.getBlob(cursor.getColumnIndex(Zavada._PHOTO)); photoS2 = cursor.getBlob(cursor.getColumnIndex(Zavada._PHOTO2)); photoS3 = cursor.getBlob(cursor.getColumnIndex(Zavada._PHOTO3)); photoS4 = cursor.getBlob(cursor.getColumnIndex(Zavada._PHOTO4)); }
5.6 Poslání informací emailem
Obr. 12
Vlevo poslání informací emailem, vpravo vytvořený email
Na obrazovce „Pošli“ může uživatel zadat příjemce a subjekt emailu. Po kliknutí na tlačítko Pošli email, mu bude nabídnuta možnost, jak chce dané informace o
34
Tvorba aplikace
závadě poslat. Lze zvolit například možnost Disk, kdy jsou fotografie ze závady uložené na Google Drive. Další možností je zvolit Total Commander, kdy se fotografie přiložené k závadě uloží do námi zvoleného adresáře. Pokud uživatel zvolí gmail, tak se mu zobrazí email, ve kterém budou obsaženy všechny informace včetně fotografií, jak je zobrazeno na obrázku vpravo výše. Před posláním jsou načteny všechny informace ze závady, tak jak bylo ukázáno výše. Následně jsou všechny informace dány do jednoho řetězce. Je zjištěn zadaný adresát a subjekt. Poté je vytvořen list, který obsahuje odkazy fotek, které byly přidány k závadě. Uložení fotografií přímo do databáze bylo zvoleno vzhledem k možné přenositelnosti databáze mezi různé mobilní zařízení, kdy tato metoda ukládání zajistí nejlépe dostupnost fotografií. Vzhledem k tomu, že jsou fotografie uloženy do interní paměti aplikace, se kterou například emailový klient „Gmail“ „nekomunikuje“, je třeba vytvořit fotografie, které jsou interně uložené a tyto nově vytvořené fotografie uložit na SD kartu. Následně poslat emailovému klientu list uri adres, které odkazují právě na vytvořené fotografie na SD kartě. Tento list fotografií je přidán k emailu. Následně je spuštěn nový intent, který umožňuje uživateli zvolit emailového klienta, pomocí kterého bude zpráva odeslána, jak lze vidět na kódu níže. a="Název závady: " + nazevS + System.getProperty("line.separator") +"Poloha: " + polohaS +System.getProperty("line.separator") +"Datum vzniku: " + datumVznikuS + System.getProperty("line.separator") +"Datum konce: " + datumKonceS + System.getProperty("line.separator") +"Vyøízeno: " + doneS +System.getProperty("line.separator") +"Poznámky: " + poznamkyS +System.getProperty("line.separator") +"Stav: " + str; ; String[] recipients = {prijemceE.getText().toString()}; Intent email = new Intent(Intent.ACTION_SEND_MULTIPLE, Uri.parse("mailto:")); email.setType("text/plain"); email.putExtra(Intent.EXTRA_EMAIL, recipients); email.putExtra(Intent.EXTRA_SUBJECT, subjektE.getText().toString()); email.putExtra(Intent.EXTRA_TEXT, a); bitmapp=BitmapFactory.decodeByteArray(photoS, 0, photoS.length); String path = Environment.getExternalStorageDirectory().toString(); filename = new File(path, "myImg.png"); FileOutputStream out = null; bitmapp2=BitmapFactory.decodeByteArray(photoS2, 0, photoS2.length); String path2 = Environment.getExternalStorageDirectory().toString(); filename2 = new File(path2, "myImg2.png");
Tvorba aplikace
35
FileOutputStream out2 = null; bitmapp3=BitmapFactory.decodeByteArray(photoS3, 0, photoS3.length); String path3 = Environment.getExternalStorageDirectory().toString(); filename3 = new File(path3, "myImg3.png"); FileOutputStream out3 = null; bitmapp4=BitmapFactory.decodeByteArray(photoS4, 0, photoS4.length); String path4 = Environment.getExternalStorageDirectory().toString(); filename4 = new File(path4, "myImg4.png"); FileOutputStream out4 = null; try { out = new FileOutputStream(filename); if(bitmapp!=null){ bitmapp.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); }if(bitmapp2!=null){ out2 = new FileOutputStream(filename2); bitmapp2.compress(Bitmap.CompressFormat.PNG, 100, out2); out2.flush(); out2.close(); }if(bitmapp3!=null){ out3 = new FileOutputStream(filename3); bitmapp3.compress(Bitmap.CompressFormat.PNG, 100, out3); out3.flush(); out3.close(); }if(bitmapp4!=null){ out4 = new FileOutputStream(filename4); bitmapp4.compress(Bitmap.CompressFormat.PNG, 100, out4); out4.flush(); out4.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } ArrayList
uris = new ArrayList(); if(bitmapp != null){ Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "myImg.png")); uris.add(uri);
36
Tvorba aplikace
}if(bitmapp2 != null){ Uri uri2 = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "myImg2.png")); uris.add(uri2); } if(bitmapp3 != null){ Uri uri3 = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "myImg3.png")); uris.add(uri3); }if(bitmapp4 != null){ Uri uri4 = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "myImg4.png")); uris.add(uri4); } email.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); try { // the user can choose the email client startActivityForResult(Intent.createChooser(email, "Vyberte emailového klienta:"),1); } catch (android.content.ActivityNotFoundException ex) { Toast.makeText(Posli.this, "Nemáte nainstalovaného žádného emailového klienta.", Toast.LENGTH_LONG).show(); } } }
Tvorba aplikace
37
5.7 Nový projekt
Obr. 13
Vlevo nový projekt, vpravo upozornění na prázdné jméno projektu
V této obrazovce může uživatel vytvořit nový projekt neboli stavbu. Jak položka Jméno projektu, tak položka Lokace projektu, mohou být diktovány hlasem, nebo psány pomocí klasické klávesy. Pokud uživatel klikne na ikonu diskety, tak se nový projekt uloží. Pokud uživatel zapomene vyplnit název projektu, tak bude upozorněn. Při vkládání nového projektu jsou převzaty všechny informace, které uživatel zadal, a jsou vloženy do databáze, zároveň jde zde implementovaná ochrana proti zapomenutí zadání názvu, jak lze vidět níže. Po uložení nového projektu je uživatel nasměrován na hlavní obrazovku. DatabaseHelper db = new DatabaseHelper(this); public void saveProjekt(){ nazevS= nazevE.getText().toString(); if (nazevE.getText().toString().trim().equalsIgnoreCase("")){ nazevE.setError("Zadejte název projektu"); } else{ mistoS= polohaE.getText().toString(); db.insertProjekt( nazevS,mistoS); Intent i=new Intent(this,MainActivity.class); startActivity(i); } }
38
Tvorba aplikace
5.8 Editace projektů
Obr. 14
Vlevo editace projektů, vpravo editace projektu
Pokud uživatel zvolí na hlavní obrazovce v menu Editace projektů, tak se mu zobrazí obrazovka se seznamem projektů. Po kliknutí na projekt, se zobrazí obrazovka, pomocí které může editovat všechny údaje hlasem nebo pomocí klasické klávesnice. Po uložení změn bude uživatel opět převeden na hlavní obrazovku.
Tvorba aplikace
39
5.9 Vytvoření, načtení a smazání zálohy
Obr. 15
Vlevo vytvoření zálohy, vpravo načtení a smazání zálohy
Pokud uživatel zvolí v hlavní obrazovce v menu možnost Zálohuj, tak se mu zobrazí dialog, který jej vyzve, aby zadal název, jak chce závadu pojmenovat. Po zadání názvu zálohy a stisknutí tlačítka OK, je vytvořena záloha celé databáze se zadaným jménem. Tato záloha je uložena na SD kartu. Tuto zálohu pak uživatel může poslat kolegovy, pokud například odjíždí na delší dobu pryč. Kolega si zálohu uloží a může si ji načíst do své aplikace. Tímto způsobem se kolega dostane ke všem informacím a je tak zaručena přenositelnost uložených informací. Další možností je předání celé SD karty kolegovy. Pokud uživatel v hlavní obrazovce v menu zvolí možnost Načti zálohu, otevře se mu okno, které lze vidět na obrázku výše vpravo. V tomto okně může uživatel libovolně procházet adresáři, které se nacházejí na jeho SD kartě. Záloha databáze tedy může být uložena buď ve vlastním vytvořeném adresáři anebo kdekoliv jinde na SD kartě. Pro lepší orientaci mají složky rozdílnou ikonku než soubory. Pokud uživatel zvolí některou ze záloh, bude jeho databáze uložená v aplikaci celá smazána a nahrazena zvolenou databází. Zvolení databáze uživatel provádí klikem na požadovaný soubor. V případě, kdy na v hlavní obrazovce v menu uživatel zvolí možnost Smazání zálohy, otevře se mu opět okno, které je vidět na obrázku výše vpravo. Uživatel opět může libovolně procházet adresáři a smazat kteroukoliv zálohovanou databázi. Smazání provede kliknutím na požadovaný soubor.
40
Tvorba aplikace
Vytvoření zálohy lze vidět na kódu níže, ze kterého vyplývá, že celá databáze je zkopírována na externí paměť mobilního zařízení. Název zálohy databáze je dán dle uživatelova vstupu. Tuto zálohu lze tedy poslat jinému kolegovi v případě potřeby a ten má k dispozici veškeré naše zadané informace včetně fotografií. File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath= "//data//" + "com.xhanak10.sprava_zavad" + "//databases//" + "zavady"; String backupDBPath = userInput.getText().toString(); File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); }
Tvorba aplikace
41
5.10 Nastavení dnů na alarm, zapnutí a vypnutí alarmu
Obr. 16
Nastavení dnů pro alarm, zapnutí a vypnutí alarmu
Pokud uživatel na hlavní obrazovce v možnostech menu zvolí: nastav alarm dny, tak se mu zobrazí obrazovka s číselníkem, pomocí kterého mění čísla. Jakmile nastaví číslo na požadované dny a stiskne potvrdit, tak se zvolené číslo uloží. Pokud uživatel zvolí možnost Zapni alarm, objeví se slovní upozornění, že byl alarm zapnut, jak je vidět na druhém obrázku výše. Alarm se nastaví tak, že aplikace každý den sama zkontroluje, jestli existuje nějaká závada, která není vyřízená a má stanovený počet dní do data uvedeného v kolonce datum do kdy vyřídit. Pokud taková závada existuje, je vysláno upozornění v podobě klasické notifikace. Pokud uživatel na danou notifikaci klikne, dostane se přímo do dané závady a může si přečíst či editovat informace v závadě obsažené. Pokud by uživatel klikl na Zapni alarm a alarm již byl zapnutý, bude na tuto skutečnost upozorněn slovním upozorněním neboli Toastem. Pokud uživatel zvolí poslední možnost v menu, kterou je: vypni alarm, tak se alarm vypne a přestane upozorňovat na nevyřízené závady se stanoveným počtem dní, do kdy závada má být vyřízena. Uživatel je na vypnutí alarmu opět upozorněn, jak je vidět na třetím obrázku výše. Pokud je zvolena možnost zapnout alarm, je nejdříve zkontrolováno, jestli alarm není již zapnutý, pokud není, tak je vytvořen alarmmanager, který se každých 24 hodin zapne a spustí třídu NotifService, která dědí z třídy Service. Zde je zjištěn počet dnů, který uživatel zadal. Dále je zjištěno, jestli existuje nějaká závada, která není vyřízená a která má daný počet dnů do konce doby opravy. Pokud taková závada existuje, je vytvořena notifikace s ikonou, která je pro tuto
42
Tvorba aplikace
aplikaci ikonou hlavní a pokud uživatel na tuto notifikaci klikne, tak je okamžitě přesměrován na informace o dané závadě. DatabaseHelper dbh2 = new DatabaseHelper(this); SQLiteDatabase db2 = dbh2.getReadableDatabase(); String[] selectionArgs = {"1"}; Cursor cursor2 = db2.query(Alarmik.TABLE_NAME, null, Alarmik._ID + " = ?", selectionArgs, null, null, null); while(cursor2.moveToNext()) { days=cursor2.getInt(0); } db2.close(); final Calendar c2 = Calendar.getInstance(); int year2 = c2.get(Calendar.YEAR); int month2 = c2.get(Calendar.MONTH); int day2 = c2.get(Calendar.DAY_OF_MONTH+ days); DatabaseHelper dbh = new DatabaseHelper(this); SQLiteDatabase db = dbh.getReadableDatabase(); Cursor cursor = db.query(Zavada.TABLE_NAME, null, null, null, null, null, Zavada._NAME); while(cursor.moveToNext()) { id=cursor.getInt(0); nazevS=cursor.getString(1); datumKonceS=cursor.getString(4); doneS=cursor.getString(5); KodProjektu= cursor.getInt(11); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date1 = sdf.parse(datumKonceS); Date date2 = c2.getTime(); int result = date1.compareTo(date2); if(doneS.equalsIgnoreCase("Nevyøízeno")){ if (result==days ){ counterik++; // Set the icon, scrolling text and timestamp Notification notification = new Notification(R.drawable.ic_launcher, "Upozornìní na konec doby opravy",System.currentTimeMillis());
Tvorba aplikace
43
// The PendingIntent to launch our activity if the user selects this notification Intent ip=new Intent(this,MainActivityEdituj.class); String idS=String.valueOf(id); String KodS=String.valueOf(KodProjektu); ip.putExtra("code", idS); ip.putExtra("code2", KodS); PendingIntent contentIntent = PendingIntent.getActivity(this, counterik, ip, PendingIntent.FLAG_CANCEL_CURRENT); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(this, "Upozornìní na konec doby opravy", nazevS, contentIntent); // Send the notification. nm.notify(counterik, notification); } } }
44
Diskuze
6 Diskuze Aplikace byla vyvíjena ve vývojovém prostředí Eclipse, byly v ní použity tři programovací jazyky, kdy největší část kódu aplikace je napsána v jazyce Java, pro tvorbu a manipulaci s databází je využit jazyk SQL a pro vytvoření designu aplikace byl použit jazyk XML. V rámci tvorby aplikace bylo potřeba vyřešit několik problémů. Bylo důležité správně rozvrhnout databázi a ukládat přiložené obrázky přímo do databáze. Tento přístup poté umožnil tvorbu záloh a přenositelnost celé databáze. Dále bylo důležité rozhodnout, jak bude databáze zálohována a přenášena. Zde byla vybrána možnost celkové zálohy databáze. Dalším problém bylo zasílání přiložených obrázků emailem, jelikož obrázky jsou uloženy ve vnitřní paměti aplikace, kam emailový klient nemá přístup. Tento problém byl vyřešen tak, že se vytvoří na paměťové kartě SD čtyři soubory, které se při každém poslání emailu přepisují. Ze zkušeností s používáním aplikace byly zjištěny připomínky ohledně ovládání aplikace. Jedná se o kategorii editace, která se některým uživatelům zdá zdlouhavá. Autorka je si této zkušenosti vědoma, a při rozhodování nakonec zvolila tuto zdlouhavější metodu oproti například možnému „swipování“, který by uživateli okamžitě umožnil editovat projekt. Autorka se totiž obávala, že by většinu uživatelů nenapadlo pro editaci projektů použít zmíněné „swipování“, když pro editaci závady je potřeba pouze krátký klik. Druhou připomínkou byla velikost pole pro poznámky. Kdy se některým uživatelům zdála tato velikost příliš velká a následně zapomněli, že pod poznámkou lze připojit ještě fotografie. Této skutečnosti je si autorka opět vědoma a pole pro poznámky udělala záměrně veliké, jelikož jak pole, tak celá obrazovka je scrolvací, a pokud bylo pole pro poznámky menší hůře se s ním manipulovalo, jedná se tedy o záležitost velice subjektivní. Ohledně možností vylepšení či rozšíření lze uvažovat o propojení této aplikace s informačním systémem firmy, pokud by společnost informační systém měla. Společnost Stavit informační systém nemá, a proto toto rozšíření nebylo do aplikace implementováno. Dalším možným rozšířením aplikace, by mohl být převod informací o závadě do formátu PDF, kdy by byly informace o závadě vloženy do dokumentu typu PDF. Formát by byl standardizován a předem stanoven. Takto vytvořený dokument by sloužil pro tisk, pokud by bylo potřeba závady stvrzovat podpisem. Převod textu do PDF lze udělat pomocí speciálních tříd PrintedPdfDocument, tyto třídy jsou však k dispozici až od verze API 19. Další možností je použít knihovny iText, které jsou však pro komerční užití placené. Vzhledem k tomu, že zadavatelé mají menší API než 19 a nejednalo se z jejich strany o požadavek, nebylo toto vylepšení implementováno. Aplikace byla vyvíjena postupně a byla testována na zařízeních Sony Experia s verzí systému androidu 4.1.2 a na zařízení Nexus 4 s verzí 5.0.1.
Závěr
45
7 Závěr Cílem této bakalářské práce bylo vytvořit aplikaci, která by splňovala potřeby stavební firmy Stavit s.r.o. Mezi základní požadavky patřilo možnost vytvářet projekty a u těchto projektů neboli staveb editovat závady, které na těchto stavbách v průběhu doby vznikají. Možnost zadávat informace hlasem, možnost upozornění na dobu do kdy má být daná závada opravena. Možnost poslat informace o závadě emailem a možnost zálohovat data. Všechny tyto základní požadavky a i ostatní, které byly souhrnně uvedeny v kapitole „Metodika“, byly splněny. Aby mohla být aplikace vyvinuta, bylo potřeba zjistit jaký typ informací má aplikace uchovávat, jak bude s informacemi zacházeno a jak má být aplikace ovládána. Dále bylo nutné ujasnit si logiku aplikace a navrhnout jednoduchý a funkční design. Jedná se o jedinou aplikaci pro systém Android, která je vytvořena pro stavby vedoucí, elektrikáře, malíře, plynaře, vodaře či jiné profese, které by spojovali podobné problémy. V době psaní této bakalářské práce nebyla nalezena jiná aplikace na českém trhu, která by byla svojí povahou zaměřena na řešení podobného problému a byla vyvinuta pro systém Android.
46
Literatura
8 Literatura ANDROID POLICE [ONLINE]. 2014 [CIT. 2014-09-7]. Dostupný z < http://www.androidpolice.com/2014/08/14/idc-androidnow-accounts-for-84-7-of-all-smartphone-shipments-grew-33-3-yearover-year-this-quarter/> DARCEY.L, CONDER,S., Sams Teach Yourself Android Application Development in 24 Hours. 1. vydání. Indianapolis: Sams, 2010. ISBN 978-0-32167335-0. DEVELOPER ANDROID [ONLINE]. 2014 [CIT. 2014-09-7]. Dostupný z < http://developer.android.com/guide/components/activities.html> DEVELOPER ANDROID [ONLINE]. 2015 [CIT. 2015-03-29]. Dostupný z GARGENTA, M., NAKAMURA,M., Learning Android. 2. přeprac. vydání. California: O’Reilly Media, 2014. ISBN 978-1-449-31923-6. HASEMAN,CH., Creating Android Applications: Develop and Design. 1. vydání. USA: Peachpit Press, 2011. ISBN 978-0-321-78409-4. HOOG,A., Android forensics : investigation, analysis, and mobile security for Google Android. 1. vydání. Indiana: Elsevier, 2011. ISBN 978-1-59749-6513. KILIÁN K. [ONLINE]. 2014 [CIT. 2015-04-5]. Dostupný z < http://www.svetandroida.cz/android-trh-dominance201408> LAFEK J. [ONLINE]. 2015 [CIT. 2015-04-5]. Dostupný z < http://www.mobilnizivot.cz/jaky-operacni-system-asmartphone-si-vybrat-cast-ctvrta-blackberry-os/> LAFEK J. [ONLINE]. 2015 [CIT. 2015-04-5]. Dostupný z < http://www.mobilnizivot.cz/jaky-operacni-system-asmartphone-si-vybrat-cast-druha-ios/ > LAFEK J. [ONLINE]. 2015 [CIT. 2015-04-5]. Dostupný z < http://www.mobilnizivot.cz/jaky-operacni-system-asmartphone-si-vybrat-cast-prvni-android/ > MEIER,R., Professional Android™ Application Development. 1. vydání. Indiana: Wiley Publishing, 2009. ISBN 978-0-470-34471-2. MEIER,R., Professional Android™ 4 Application Development. 1. vydání. Indiana: John Wiley & Sons, 2012. ISBN 978-1-118-10227-5. MURPHY,M., The Busy Coder's Guide to Android Development. 2. přeprac. vydání. USA: CommonsWare, 2011. ISBN 978-0-9816780-0-9.
Literatura
47
SCHWARZ,R., DUTSON,P., STEELE,J., TO,N., The Android Developer's Cookbook: Building Applications with the Android SDK. 1. vydání. Indiana: Pearson Education, 2013. ISBN 978-0-321-89753-4. UJBÁNYAI,M., Programujeme pro Android. 1. vydání. Praha: Grada Publishing, 2012. ISBN 978-80-247-3995-3. VÁVRŮ.J, UJBÁNYAI,M., Programujeme pro Android. 2. rozšířené vydání. Praha: Grada Publishing, 2013. ISBN 978-80-247-4863-4.