České vysoké učení technické v Praze Fakulta elektrotechnická
Diplomová práce
Modul pro správu informací pro Android Bc. Luboš Hilgert
Vedoucí práce: Ing. Tomáš Novotný
Studijní program: Otevřená informatika – Softwarové inženýrství Obor: Softwarové inženýrství a interakce leden 2012
ii
Poděkování Rád bych poděkoval vedoucímu mé diplomové práce, Ing. Tomáši Novotnému, své rodině a přátelům za podporu při tvorbě tohoto projektu.
iii
iv
Prohlášení Prohlašuji, že jsem svou diplomovou práci vypracoval samostatně, a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu § 60 Zákona č.121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
……………………………………. Podpis
V Praze dne 21.12.2011
v
vi
Abstract The aim of this thesis was to design and implement a synchronization module for Android. Its functionality is demonstrated on synchronizing notes, tasks and contacts. This module should also manage the synchronization of attached binary data. This thesis also brings new application for searching emails and file sharing function. All parts of this work use protocol IMAP. All applications in this work were tested to detect errors and test the suitability of the user interface.
Abstrakt Cílem této diplomové práce bylo navrhnout a implementovat synchronizační modul pro Android, jehož funkce je demonstrována na synchronizaci poznámek, úkolů a kontaktů. Tento modul zvládá synchronizovat i přiložená binární data. Součástí práce je také návrh vyhledávače emailů a funkce sdílení souborů. Všechny části této práce využívají protokolu IMAP. Veškeré aplikace byly také testovány s cílem odhalit chyby a vyzkoušet vhodnost uživatelského rozhraní.
vii
viii
Obsah
1.
2.
Úvod ................................................................................................................................... 1 1.1.
Motivace ...................................................................................................................... 1
1.2.
Android ........................................................................................................................ 2
Cíle ..................................................................................................................................... 4 2.1.1.
Funkční požadavky úkolové aplikace .................................................................. 5
2.1.2.
Nefunkční požadavky úkolové aplikace............................................................... 5
2.1.3.
Funkční požadavky synchronizace kontaktů ........................................................ 5
2.1.4.
Nefunkční požadavky synchronizace kontaktů .................................................... 6
2.1.5.
Funkční požadavky vyhledávače emailů .............................................................. 6
2.1.6.
Nefunkční požadavky vyhledávače emailů .......................................................... 6
3.
Struktura práce.................................................................................................................... 6
4.
Analýza ............................................................................................................................... 9 4.1.
Rozdíly mezi klasickým a chytrým telefonem ............................................................ 9
4.2.
Rozdíly mezi chytrým telefonem a počítačem .......................................................... 10
4.3.
Programování aplikací pro Android .......................................................................... 11
4.4.
Podobné existující aplikace ....................................................................................... 13
4.4.1.
S2 Calendar Widget 2 – free .............................................................................. 13
4.4.2.
Smooth calendar ................................................................................................. 14
4.4.3.
Business Calendar Free ...................................................................................... 15
4.4.4.
Astrid Tasks ........................................................................................................ 16
4.4.5.
Voice2Do............................................................................................................ 17
4.4.6.
Checkmark ToDo List a Checkmark Calendar .................................................. 18
4.4.7.
TODO Task Manager ......................................................................................... 19
4.4.8.
Evernote.............................................................................................................. 20 ix
4.4.9. 5.
Návrh ................................................................................................................................ 22 5.1.
Deklarace záměru ...................................................................................................... 22
5.1.1.
6.
Případy užití – jednoduchá úkolová aplikace ..................................................... 23
5.2.
Návrh uživatelského rozhraní .................................................................................... 26
5.3.
Synchronizace ............................................................................................................ 29
5.3.1.
Internet Message Access Protocol ...................................................................... 29
5.3.2.
Struktura synchronizované položky ................................................................... 30
5.3.3.
UUID .................................................................................................................. 31
5.3.4.
Komunikace........................................................................................................ 31
5.3.5.
Kolize ................................................................................................................. 36
5.3.6.
Poznámky ........................................................................................................... 39
Implementace ................................................................................................................... 41 6.1.
MailBrowser .............................................................................................................. 41
6.1.1.
JavaMail ............................................................................................................. 41
6.1.2.
Vyhledávání........................................................................................................ 42
6.2.
Kontakty v Androidu ................................................................................................. 44
6.2.1.
Manipulace s kontakty........................................................................................ 45
6.3.
TaskManager ............................................................................................................. 46
6.4.
Synchronizační modul ............................................................................................... 48
6.4.1.
Synchronizační objekty ...................................................................................... 48
6.4.2.
Synchronizační třída ........................................................................................... 50
6.5. 7.
SMS backup........................................................................................................ 21
Funkce share .............................................................................................................. 52
Testování .......................................................................................................................... 55 7.1.
Společná část ............................................................................................................. 55
7.2.
Synchronizace ............................................................................................................ 56
7.3.
MailBrowser .............................................................................................................. 57 x
8.
Závěr ................................................................................................................................. 59
9.
Použitá literatura............................................................................................................... 61
10.
Uživatelská příručka ...................................................................................................... 63
10.1.
MailBrowser ........................................................................................................... 63
10.1.1.
Nastavení ........................................................................................................ 63
10.1.2.
Hledání............................................................................................................ 63
10.1.3.
Manipulace ..................................................................................................... 64
10.2.
TaskManager .......................................................................................................... 64
10.2.1.
Tvorba úkolu................................................................................................... 64
10.2.2.
Synchronizace ................................................................................................. 64
10.3.
Funkce share........................................................................................................... 65
10.3.1. 10.4.
Synchronizace kontaktů ......................................................................................... 65
10.4.1. 11.
Sdílení souboru ............................................................................................... 65
Tvorba synchronizačního účtu........................................................................ 65
Obsah CD ...................................................................................................................... 66
xi
xii
Seznam obrázků Obrázek 1: Hlavní komponenty OS Android ............................................................................. 4 Obrázek 2: Porovnání telefonů ................................................................................................... 9 Obrázek 3: Pás karet ribbon v Microsoft Word 2010............................................................... 10 Obrázek 4: Nová připravovaná Windows ................................................................................ 11 Obrázek 5: Životní cyklus Activity .......................................................................................... 12 Obrázek 6: S2 Calendar Widget ............................................................................................... 14 Obrázek 7: Smooth Calendar.................................................................................................... 15 Obrázek 8: Business Calendar Free.......................................................................................... 16 Obrázek 9: Astrid Tasks ........................................................................................................... 17 Obrázek 10: Voice2Do ............................................................................................................. 18 Obrázek 11: Checkmark ToDo List a Calendar ....................................................................... 19 Obrázek 12: TODO Task Manager .......................................................................................... 20 Obrázek 13: Evernote ............................................................................................................... 21 Obrázek 14: SMS backup ......................................................................................................... 22 Obrázek 15: Obrazovka - seznam úkolů .................................................................................. 23 Obrázek 16: Obrazovka - zadání komplexního úkolu .............................................................. 25 Obrázek 17: Úvodní obrazovka - varianty ............................................................................... 26 Obrázek 18: Nový úkol ............................................................................................................ 27 Obrázek 19: Nová událost ........................................................................................................ 28 Obrázek 20: Zobrazení detailů události.................................................................................... 29 Obrázek 21: Přidání nového kontaktu ...................................................................................... 32 Obrázek 22: Synchronizace kontaktů ze serveru...................................................................... 33 Obrázek 23: Obecný postup synchronizace kontaktů .............................................................. 35 Obrázek 24: Modifikace kontaktu ............................................................................................ 37 Obrázek 25: Kolize při synchronizaci ...................................................................................... 38 Obrázek 26: Schéma databáze pro uložení poznámek ............................................................. 39 Obrázek 27: Ukázka aplikace - MailBrowser .......................................................................... 43 Obrázek 28: Struktura kontaktů v Androidu ............................................................................ 44 Obrázek 29: Ukázka aplikace - TaskManager.......................................................................... 47
xiii
Obrázek 30: Hierarchie synchronizačních tříd ......................................................................... 49 Obrázek 31: Funkce share ........................................................................................................ 53
xiv
Seznam tabulek Tabulka 1: Celosvětový tržní podíl vybraných OS .................................................................... 3 Tabulka 2: Synchronizační objekt pro událost ......................................................................... 50
xv
xvi
Kapitola 1 1. Úvod Mobilní internet a chytrá zařízení se pomalu začínají rozšiřovat napříč společností. Odhaduje se, že do konce roku 2011 budou mít chytré mobilní telefony více jak třetinu českého i celosvětového trhu [1]. Mobilním internetem pak disponuje asi 17% [2] českých uživatelů, celosvětově je to něco přes 20% [3] a vzhledem k růstu prodeje chytrých zařízení můžeme očekávat, že se toto číslo bude nadále zvyšovat. Navíc zde není započítán přístup přes Wi-Fi. Tato mobilní chytrá zařízení vděčí za svou popularitu především velkému množství aplikací, které nám mohou usnadnit a zefektivnit práci. Velké popularitě se těší všemožné kalendářové a úkolové aplikace. Například schůzku si můžeme jednoduše poznamenat do kalendáře v našem mobilním telefonu, který nám ji pak může den předem připomenout. Google nám pak nabízí uložit si akce do webového kalendáře, který si po přihlášení můžeme prohlédnout z kteréhokoliv zařízení (mobilní telefon, tablet, PC apod.). Odpadá tak starost, že při ztrátě telefonu přijdeme i o uložené informace. Cílem této práce je proto navrhnout a implementovat univerzální synchronizační modul pro Android [4], pomocí kterého budeme moci přes IMAP (internet message access protocol) [5] synchronizovat nejrůznější informace včetně binárních dat. Funkci tohoto modulu budeme demonstrovat na synchronizaci kontaktů a úkolů v chytrém mobilním telefonu.
1.1.
Motivace
Dnešní doba, kdy vlastnit počítač a mít přístup k internetu začíná být standardem, a další chytrá zařízení si u nás postupně vydobývají své místo, nás začíná učit, že pokud chceme, aby nám tato moderní zařízení skutečně usnadňovala a zefektivňovala naší práci, je třeba se je naučit propojit. Tak budeme mít požadovanou informaci vždy po ruce, i když nejsme u svého počítače. Potřebujeme mít možnost přečíst si email, nahlédnout do kalendáře, do kterého si můžeme něco poznamenat, a toto mít pak ihned k dispozici i na jiném zařízení s přístupem na internet. 1
V poslední době se hojně setkáváme s termínem Cloud. Uchovávání informací pouze na pevném disku počítače začíná být minulostí a nabízí se možnost mít svá data v cloudu, tedy někde na internetu. Tato data si následně můžeme zobrazit a upravit kdekoliv na světě na jakémkoliv zařízení s přístupem na internet. Příkladem takové služby může být třeba emailová schránka nebo webový kalendář. Sdílet informace ale nemusíme jen mezi svými zařízeními. Představme si třeba tým lidí, pracujících na nějakém projektu. Pro tento tým je důležité, aby měli všichni jednoduchý přístup ke společným informacím, což mohou být třeba různé úkoly, ale například i prosté kontakty. Tato práce je součástí projektu ExtBrain [6], který si právě klade za cíl zjednodušit život různým týmům softwarových vývojářů, projektových manažerů a výzkumníků tím, že jim umožní jednoduše manipulovat s informacemi a sdílet je se svými kolegy. Část tohoto projektu je právě vytvoření univerzálního synchronizačního modulu, který toto sdílení rozličných informací umožní.
1.2.
Android
V roce 2005 Google koupil menší společnost zvanou Android Inc., jejíž zaměstnanci začali vyvíjet na Linuxu založený systém pro mobilní zařízení. Tímto počinem se začaly šířit spekulace, že se
Google se chystá vtrhnout na trh mobilních
telefonů. V roce 2007 pak vzniklo uskupení velkých firem známé jako Open Handset Alliance (Google, HTC, Motorola, LG, Samsung apod.), které si dalo za cíl vyvinout otevřené standardy pro mobilní zařízení. Roku 2008 se stal Android open-source projektem [7], když Google publikoval jeho zdrojový kód. Díky této volné licenci, kdy si kdokoliv může kód libovolně upravit a znovu distribuovat, získal Android oblibu mezi výrobci mobilních telefonů, kterým tak odpadají náklady na operační systém. I z tohoto důvodu na Androidu běží nejen high-end přístroje, ale můžeme se setkat i s cenově velmi dostupnými modely, které jsou tak přístupné široké veřejnosti. I proto je v současnosti Android nejrychleji rostoucí platforma na trhu. Tržní podíl jednotlivých operačních systémů včetně prognózy do roku 2015 ukazuje následující tabulka [8].
2
Tabulka 1: Celosvětový tržní podíl vybraných OS Operační systém
Tržní podíl 2011
Tržní podíl 2015
A ndroid
38.9%
43.8%
BlackBerry OS
14.2%
13.4%
Symbian
20.6%
0.1%
iOS
18.2%
16.9%
Windows Phone 7
3.8%
20.3%
Ostatní
4.3%
5.5%
Celkem
100.0%
100.0%
Aplikace pro Android se primárně vyvíjejí v jazyce Java [9] a dále zkompilují do java .class souborů. Na Androidu ale nenalezneme klasickou Java Virtual Machine a tak ještě před instalací jsou tyto soubory převedeny do souborů kompatibilních s Dalvik Virtual Machine [10] (.dex soubory). Při převodu se také konvertuje Java bytecode do Dalvik bytecode. Dalvik byl primárně navržen pro systémy s omezenou velikostí paměti a rychlostí
procesoru
(mobilní
zařízení).
Následující
komponenty operačního systému Android [11].
3
diagram
nám
ukazuje
hlavní
Obrázek 1: Hlavní komponenty OS Android
Z tohoto diagramu je vidět, že všechny aplikace, ať už ty předinstalované, nebo ty, které si vytvoříme, jsou si rovny a mají přístup ke stejným systémovým prostředkům. Vývojáři tak ve svých aplikacích mohou využít hardwaru telefonu, mají přístup k informacím o poloze, a mohou spouštět různé procesy na pozadí (služby, alarmy). Další zajímavostí je, že se aplikace mohou vzájemně adresovat a využívat tak svých funkcí, což pomáhá zredukovat množství duplicitního kódu.
2. Cíle Cílem této práce je navrhnout univerzální synchronizační modul pro Android, který umožní zadávání libovolných informací včetně binárních dat a tyto informace pak synchronizovat přes IMAP. Tato data mohou být například poznámky, úkoly, události, kontakty nebo SMS zprávy. Výsledná synchronizovaná položka může mít podobu buďto XML [12] dokumentu nebo bude v podobě JSONu [13]. Program tak načte lokální data,
4
převede si je na požadovanou podobu a pošle je na server. Výsledná aplikace také bude umět řešit kolize (změna lokální proti změně na serveru). Funkci modulu budeme demonstrovat na jednoduché poznámkové a úkolové aplikaci, která bude podporovat zadání titulku, popisu, štítků a nastavení data dokončení. Pokročilou synchronizaci pak ukážeme při práci s kontakty, která je hlavním cílem této práce. K textovým údajům bude možno připojit i fotografii daného kontaktu a aplikace bude umět řešit i případné kolize. V průběhu práce tak implementuji synchronizační účet, na nějž bude uživatel moci ukládat kontakty a tyto kontakty pak synchronizovat přes IMAP. Všechny tyto položky tak budou k dispozici v zabudovaném prohlížeči kontaktů. V rámci práce pak vznikne aplikace zastřešující nejen již zmíněné aktivity, ale navíc ještě nabídne funkci uložení lokálního souboru na IMAP úložiště. Součástí bude i program umožňující vyhledat emaily na základě zadaných klíčových slov. Jak už vyplývá z předešlého textu, implementace bude probíhat v jazyce Java, jenž je primárním programovacím jazykem pro Android.
2.1.1.
Funkční požadavky úkolové aplikace
aplikace umožní zadat, upravit nebo smazat daný úkol / poznámku
umožní zadat termín splnění úkolu
úkoly se budou řadit dle termínu splnění
úkol bude možno opatřit různými značkami
k dispozici bude základní synchronizace textových položek
2.1.2.
Nefunkční požadavky úkolové aplikace
intuitivní uživatelské rozhraní
snadná rozšiřitelnost
2.1.3.
Funkční požadavky synchronizace kontaktů synchronizační
účet
nám
umožní zadávání kontaktů
v zabudované
aplikaci pro kontakty
výběr synchronizační složky na serveru
pokročilá synchronizace včetně binárních dat (fotka kontaktu)
schopnost řešit kolize o sjednocení nekolizních položek u kontaktu
5
o u kolizních položek dát uživateli na výběr, kterou verzi chce zachovat
2.1.4.
Nefunkční požadavky synchronizace kontaktů snadná rozšiřitelnost (například pokud v budoucnu přibude možnost uložení nové položky ke kontaktu)
2.1.5.
Funkční požadavky vyhledávače emailů
vyhledání emailů na základě zadaných klíčových slov
možnost zobrazení emailu
funkce přiřazování štítku
možnost označení flagem
stažení přílohy
výběr složky k prohledávání
volba počtu zobrazených emailů na stránku
2.1.6.
Nefunkční požadavky vyhledávače emailů intuitivní uživatelské rozhraní
3. Struktura práce Ve zbývající části detailně popíši svou práci na synchronizačním modulu pro Android. V následující kapitole se pokusím zanalyzovat rozdíly ve vývoji klasických java aplikací a aplikací pro Android, a také rozdíly v ovládání počítače, klasického telefonu a chytrého telefonu, který se v případě Androidu ovládá převážně dotykem. Seznámíme se také s několika existujícími aplikacemi, ať už se jedná o kalendářové, úkolové nebo synchronizační aplikace. Popíši jejich funkce, uživatelské prostředí a ovládání. V návrhu pak ze získaných poznatků vytvořím diagramy případu užití, čímž si vymezím funkce aplikace, a pokusím se navrhnout uživatelské rozhraní komplexní kalendářové a úkolové aplikace, ze kterého následně vzejde jednoduší úkolová aplikace za účelem demonstrace funkčnosti synchronizačního modulu. V části zabývající se implementací rozeberu všechny části své aplikace a pokusím se je zdokumentovat tak, aby nebyl problém při případném dalším rozšiřování. 6
Testování je nedílnou součástí každé implementační práce, a proto se pokusím v této části shrnout zkušenosti a připomínky od uživatelů k této aplikaci.
7
8
Kapitola 2 4. Analýza Tuto kapitolu zahájím zamyšlením se nad rozdíly v ovládání aplikací pro klasický mobilní telefon, chytrý telefon s operačním systémem Android, a jelikož se moderní chytré telefony už v mnohém spíše podobají klasickým počítačům (výkon, operační systém), porovnám ovládání i pro ně. Z rozdílného ovládání nám přirozeně vyplynou i určité požadavky na návrh uživatelského
rozhraní.
Dále pak
představím rozdíly
v programování klasických Java aplikací, a aplikací pro Android. Tato část bude zakončena analýzou podobných existujících aplikací.
Rozdíly mezi klasickým a chytrým telefonem
4.1.
Aby telefon získal označení „chytrý“, musí obsahovat operační systém. Operační systém je dle definice základní programové vybavení počítače [14]. Pomocí něho komunikujeme s telefonem a můžeme instalovat různé aplikace,
které
systému
můžou
nám pomocí aplikačního zpřístupnit
ovládání
rozhraní
Obrázek 2: Porovnání telefonů
hardware
telefonu (např. fotoaparát). Operační systém také rozhoduje, jak naloží se systémovými prostředky (přiděluje a odebírá je různým procesům). Kromě již zmiňovaného
Androidu
existuje
několik
dalších
systémů pro chytré telefony, jako například iOS od Applu
pro
mobilní
telefony
iPhone,
Symbian,
Windows se svou novinkou Windows Phone 7.5 nebo například manažerské BlackBerry. Na obrázku můžeme porovnat vzhled klasického telefonu Nokia 2323 a smartphonu od LG. Na první pohled si všimneme, že mezi velikostí obou přístrojů nejsou zase až tak velké rozdíly. Společným znakem většiny smartphonů s OS Android je velký dotykový displej, což znamená, že veškerá komunikace s telefonem se odehrává gesty nebo dotykem. Na tento způsob ovládání musíme myslet při návrhu našich aplikací a veškerá tlačítka musíme vytvořit dostatečně velká, případně by mezi nimi měl být 9
dostatečný rozestup, aby nedocházelo k chybám. Všimněme si, že na telefonu vpravo by se dotykem jen těžko vybíraly jednotlivé položky, zatímco na telefonu vlevo jsou ikony poměrně velké, s dostatečným rozestupem a výběr je tedy přesný. Velkou nevýhodou chytrého mobilního telefonu je malá výdrž baterií. Pokud budeme chtít telefon používat na surfování na internetu, práci s emaily, jako GPS nebo mp3 přehrávač, patrně nám nabitý nevydrží ani den. I na toto musíme při vývoji myslet, a dát si pozor, aby naše aplikace zbytečně nezatěžovala telefon.
4.2.
Rozdíly mezi chytrým telefonem a počítačem
Možná se to zdá být překvapivé, ale počítač je chytrému mobilnímu telefonu bližší nežli klasický mobilní telefon. Leckdo ještě dnes vlastní starší počítač, který by svým výkonem moderním smartphonům jen těžko konkuroval. Pro mnoho lidí může být dokonce smartphone plnohodnotná náhrada za počítač, jelikož stejně dobře zvládne prohlížení internetu, odesílání emailů, sledování seriálů, hraní her či poslech hudby a navíc nabídne ještě GPS navigaci. Výhodou je i větší výdrž baterie než je u přenosných počítačů. Samozřejmě ovládání na malém displeji není příliš pohodlné, a tak se velice populárními stávají tablety, které jsou takovým kompromisem mezi notebookem a smartphonem. Na některou práci (střih videa, psaní delších textů či úprava fotografií) však i nadále zůstává jako nejpohodlnější prostředek klasický počítač nebo notebook. Avšak i operační systémy a aplikace pro počítače se připravují na dotykové ovládání, a tak se některé znaky uživatelského rozhraní začínají podobat tomu na chytrých telefonech. Jako příklad můžete na obrázcích 3 a 4 vidět pás karet ribbon, kterým Microsoft u svých aplikací nahradil klasické textové nabídky, a také nová připravovaná Windows.
Obrázek 3: Pás karet ribbon v Microsoft Word 2010
10
Obrázek 4: Nová připravovaná Windows
Na obou obrázcích můžeme vidět dostatečně velká tlačítka, jejichž textový popis je doplněn ikonou, což je jeden ze znaků uživatelského rozhraní u chytrých telefonů.
4.3.
Programování aplikací pro Android
Jak už jsem se zmínil, programování pro Android v Javě není stejné jako programování klasických desktopových aplikací. Android totiž nemá žádnou JVM (Java virtual machine) a kód nepíšeme do metody main(). Napsaný kód pro Android je zkompilován do jediného souboru s příponou .apk (Android package). Takovýto soubor je vlastně onou naší aplikací a zároveň je to i instalační soubor. Zatímco v Javě pro spuštění kódu používáme metodu main (), v aplikacích pro Android využíváme tzv. Activity. Každá jednotlivá Activity reprezentuje jednu obrazovku s uživatelským rozhraním (například seznam úkolů a tlačítko pro přidání dalšího úkolu). Mezi jednotlivými Activity
můžeme přepínat pomocí Intents. Intent je vlastně takový
komunikační balíček, který řekne, jakou Activity chceme spustit, a případně skrz něj můžeme poslat nějaká data. Životní cyklus takové Activity můžeme vidět na obrázku 5. 11
Obrázek 5: Životní cyklus Activity
Další komponentou jsou Services neboli služby. Tyto služby nemají žádné uživatelské rozhraní a používají se pro běh déle trvajících operací na pozadí. Například emailová aplikace spustí službu, která periodicky kontroluje, zda na serveru není nějaká nová zpráva. Sdílení informací mezi aplikacemi probíhá pomocí Content providerů. Příkladem nám může být třeba databáze kontaktů, která není přístupná pouze zabudované aplikaci 12
pro správu kontaktů, ale můžeme z ní brát, modifikovat nebo mazat data i z jakékoliv jiné aplikace.
Tohoto
využijeme
při implementaci našeho
programu pro synchronizaci
kontaktů. V neposlední řadě tu máme Broadcast receivers. Tato komponenta zachycuje různé signály ze systému, jako např. stav baterie, ale třeba i to, že přišla SMS zpráva. Stejně jako Content providers netvoří uživatelské rozhraní, může však vyvolávat různá upozornění (např. ve stavovém řádku), aby se uživatel o dané skutečnosti dozvěděl. Právě velkou výhodou při návrhu aplikací pro Android je znuvupoužitelnost již existujících částí. Každá aplikace tak může spustit komponentu aplikace jiné. Například aplikace pro tvorbu SMS spustí aplikaci s kontakty pro výběr příjemce zprávy apod. Důležitou součástí každé aplikace je takzvaný Manifest File (AndroidManifest.xml), který obsahuje seznam všech komponent, které naše aplikace používá a také výčet oprávnění, jež aplikace požaduje (např. čtení kontaktů, přístup na internet apod.). Mimo jiné zde také definujeme vstupní Activity našeho programu. [15]
4.4.
Podobné existující aplikace
V této části se podíváme na již existující kalendářové, úkolové, poznámkové či synchronizační aplikace. Zaměříme se především na poznámkové aplikace, u kterých si můžeme všimnout, že v základu je jejich návrh uživatelského rozhraní velmi podobný. Dále bych pak ještě upozornil na aplikaci SMS Backup, která nám zálohuje naše SMS zprávy na zadaný Google účet, což je v principu totéž, co budeme chtít dělat v této práci s kontakty.
4.4.1.
S2 Calendar Widget 2 – free
Jak už název napovídá, jedná se o widget, který můžeme umístit na hlavní obrazovku v několika formátech (2 x 1, 2 x 2, 3 x 3 a 4 x 3), ale vždy se zobrazí pouze období jednoho měsíce. Nabízí široké možnosti nastavení, ať už se jedná o design (pozadí, barva písma), nebo možnosti zobrazování, jako například číslování týdnů, kterým dnem má týden začínat, nebo formát data. Máme zde i možnost zobrazování státních svátků, avšak bohužel svátky pro Českou republiku zatím chybí. V nastavení můžeme také definovat, co se stane po kliknutí na widget. Zda se nám má otevřít přehled událostí, nebo se má spustit zabudovaná kalendářová aplikace v telefonu. Zajímavé je, že můžeme nastavit, aby se nám otevřela jakákoli aplikace nainstalovaná v telefonu. Pod 13
widgetem máme možnost zobrazit panel, kam můžeme umístit zkratky na různé zobrazení, nastavení, či libovolnou aplikaci. Do kalendáře můžeme zanést události importované z Google kalendáře. V nastavení lze vybrat, z kterých kalendářů se mají události zobrazovat, a také jak se mají zobrazovat. Máme možnost odlišit zobrazování celodenních událostí od časových událostí, a to dokonce odlišně pro jednotlivé kalendáře. Zobrazit si můžeme také seznam událostí a k nim i patřičné nastavení, jako například zobrazení odpočtu dnů do události, zobrazení jména kalendáře, ze kterého je událost, nebo které kalendáře chceme v seznamu mít a které ne. Obrázek 6: S 2 Calendar Widget
4.4.2.
Smooth calendar
O poznání minimalističtější widget zobrazující se pouze ve formátu 4 x 1. Opět zde můžeme zvolit, ze kterých kalendářů se budou události zobrazovat, a zda se zobrazí události tři nebo jedna detailní. Nechybí zde nastavení, co se má stát po kliknutí na widget, zda zobrazit menu nebo jinou aplikaci (například již zmiňovaný zabudovaný
14
kalendář). Zajímavé je nastavení tzv. offsetu, tedy kolik událostí se má přeskočit neboli jak dopředu chceme zobrazovat nadcházející události. Zvolit zde můžeme i formát data a času a nechybí ani nastavení barvy písma či zvýraznění. Obrázek 7: S mooth Calendar
4.4.3.
Business Calendar Free
Dle mého názoru jedna z nejpovedenějších a nejkomplexnějších kalendářových aplikací. Můžeme si zde vybrat mezi dvanácti formáty widgetů od velikosti 2 x 1 až do 4 x 4. Widgety menšího formátu zobrazují pouze události a máme zde možnost navolit, kolik jich chceme zobrazit. U větších widgetů pak můžeme zvolit, zda chceme zobrazit úkoly, měsíční nebo týdenní přehled. U týdenního přehledu je navíc možné nastavit počet zobrazených dnů (od jednoho do čtrnácti). Po kliknutí na widget s týdenním nebo měsíčním přehledem se nám otevře samotná aplikace. V dolní části okna máme zobrazena jména kalendářů, na kterých kliknutím vypínáme či zapínáme jejich zobrazení. Události se dají velmi intuitivně přidávat, editovat nebo mazat. Aplikace dokonce umožňuje nastavení připomínání událostí. Zajímavou a užitečnou funkci představuje
15
vyhledávání, které najde událost i podle části zadaného řetězce. Kromě nastavení zvýrazňujících
barev
pro
víkendy nebo
aktuální den zde můžeme oproti výše
zmiňovaným aplikacím nastavit i samotné barvy kalendářů. Právě v nastavení jsem měl jediný problém. Provedení změn je totiž nutné potvrdit tlačítkem „Save“. Tlačítkem „Zpět“ se sice dostaneme zpět na původní obrazovku, ale provedená nastavení nejsou uložena, jak můžeme být zvyklí z jiných aplikací. Tato aplikace je opravdu velmi propracovaná a nabízí mnoho možností ovládání, proto téměř každá obrazovka obsahuje titulní proužek, na který když klikneme, otevřeme stručnou nápovědu pro tuto obrazovku.
Obrázek 8: Business Calendar Free
4.4.4.
Astrid Tasks
Zajímavá úkolová aplikace umožňující synchronizaci s online službou Producteev i s Google Tasks. Nabízí i widget o velikost 2 x 2 zobrazující aktuální úlohy. Aplikace i 16
widget umožňuje rychle zadat nový úkol, u kterého můžeme nastavit čtyři stupně důležitosti,
termín
dokončení,
štítek,
případně
poznámky.
V pokročilém nastavení
můžeme zadat upozorňování na úkol. Zajímavá je možnost nastavit náhodné upozornění jednou za vybraný čas (např. jednou za týden). Pokud úkolu zadáme přesné datum a čas, můžeme nastavit, aby se nám úkol přidal přímo do kalendáře. Ne moc vhodná se mi jeví žlutá malá ikonka vedle úkolu, upozorňující na další poznámky. Navíc pokud si zobrazíme úkoly podle listu, tato ikona naruší rozvržení checkboxů na obrazovce. V nastavení aplikace sice můžeme zaškrtnout volbu, aby se poznámky zobrazovaly přímo v úkolu, bohužel však toto nastavení zřejmě nefunguje, a po návratu z něj dochází k prodlevám uživatelských akcí. Pokud v aplikaci Gmail vytvoříme úkol z emailu, tak nás na to aplikace po synchronizaci nijak neupozorní, ale zobrazí pouze titulek. Obrázek 9: Astrid Tasks
4.4.5.
Voice2Do
Velmi jednoduchá aplikace, která se pyšní vysokou kvalitou záznamu, i když nahráváte v hlasitém prostředí (puštěná hudba, ruch ulice). Ve své free verzi nabízí nahrávání úkolů, které můžete označit předem definovanými tagy. Takto nahrané 17
poznámky si můžete libovolně pojmenovat, vyhledávat mezi nimi, třídit dle tagů nebo data. Verze Pro pak nabízí i užitečný widget na plochu pro rychlé nahrávání. Obrázek 10: Voice2Do
4.4.6.
Checkmark ToDo List a Checkmark Calendar
Dvě navzájem se doplňující aplikace. Checkmark ToDo List je aplikace na tvorbu seznamů a úkolů. Jak aplikace, tak i widget umožňují rychlé a snadné přidávání úkolů. Kromě úkolů můžeme přidávat i různé seznamy (např. nákupní seznam), v placené verzi dokonce víceúrovňové. Velmi jednoduše se můžeme přepnout do související kalendářové aplikace, kde jsou úkoly (v případě zvolení data) zakresleny. Kalendářová aplikace nabízí tradiční měsíční, týdenní a denní zobrazení a synchronizuje se s Google kalendářem. V kalendáři můžeme na určitý den přidat úkol, čímž se nám přepne zobrazení zpátky do úkolové aplikace. Přepnutí proběhne také tehdy, pokud v kalendáři klikneme na nějaký zadaný úkol.
18
Obrázek 11: Checkmark ToDo List a Calendar
4.4.7. Velmi
TODO Task Manager jednoduchý
správce
úkolů,
který
umožňuje
synchronizaci s Google
kalendářem, nikoliv však s Google úkoly. Kromě tradičních věcí jako je štítek nebo stupeň důležitosti, můžeme zadat i kontakt nebo místo. Obojí musíme ale ručně vepsat, kontakt totiž nelze vybrat z žádného seznamu. Zadávat úkoly a informace k nim můžeme i hlasem, ovšem rozpoznání řeči není bezchybné a je k němu vyžadováno připojení k internetu. Na úkoly můžeme zadávat upomínky, můžeme mezi nimi vyhledávat a filtrovat jejich zobrazení.
19
Obrázek 12: TODO Task Manager
4.4.8.
Evernote
Už podle názvu můžeme usoudit, že se jedná o poznámkovou aplikaci, ve které si můžeme poznamenat vše, co nás zrovna napadne, co se nám líbí nebo si dokonce vytvořit TODO list. Poznámky mohou mít různou podobu. Jako poznámku lze totiž přiložit obrázek, zvuk nebo soubor. Pro lepší vyhledávání pak poznámkám můžeme přiřadit různé štítky. Silná stránka této aplikace je také v tom, že ji kromě svého mobilního telefonu můžeme mít i na svém počítači, nebo k ní přistupovat kdekoli z webových stránek. Součástí aplikace je také widget, který nám umožňuje rychle zaznamenat nové poznámky.
20
Obrázek 13: Evernote
4.4.9.
SMS backup
Tato aplikace nám může sloužit jako příklad, že protokol IMAP se dá použít i jinak, než jen na manipulaci s poštou. Tento jednoduchý program nám nabízí možnost zazálohovat naší SMS korespondenci. Po spuštění si vyžádá naše přístupové údaje ke službě Gmail. Dále si pak můžeme nastavit jméno složky, do které budou zprávy na serveru uloženy a také zda mají mít nastavený příznak přečtené či nikoliv. Výsledkem je pak nová složka na serveru, která obsahuje emailové zprávy, mající jako předmět příjemce SMS, a v těle emailu je pak samotný obsah zprávy. Podobná, ale placená aplikace Backup to Gmail, nabízí dokonce zálohování MMS, kdy text je zobrazen v těle zprávy a obrázek je jako příloha.
21
Obrázek 14: S MS backup
5. Návrh V této části se již budeme zabývat konkrétním návrhem funkčnosti aplikace. Veškeré požadavky na aplikaci, a akce, které bude možné s aplikací provádět, jsou přehledně zakreslené v diagramech případů užití, ke kterým je připojen i vysvětlující textový popis. Na závěr pak ukáži grafický návrh komplexní aplikace pro zobrazení úkolů a událostí i s tím, jak by se měla ovládat. Pro účely této práce a demonstraci synchronizačního modulu pak implementuji její část – jednoduchý správce úkolů.
5.1.
Deklarace záměru
Cílem je vytvořit aplikaci pro Android umožňující správu informací. Její součástí bude synchronizační modul, který nám nabídne nejen synchronizaci kontaktů, ale využijeme ho i při synchronizaci poznámek ze související aplikace. Dále pak bude možné využít i vyhledávač emailů, který nám umožní nejen prohledávat různé složky na IMAP serveru, ale například i prohlížení emailů či stahování příloh. Tohoto využijeme například v kombinaci s další funkcí, která umožní poslat na server jakýkoliv lokálně uložený soubor. Všechny aplikace by samozřejmě měly být jednoduše ovladatelné a uživatelsky přívětivé. 22
5.1.1.
Případy užití – jednoduchá úkolová aplikace
Případy užití nám vlastně ukazují v diagramech uspořádané funkční požadavky aplikace. Všechny akce vyvolává jeden uživatel, který má možnost pohybovat se po dvou hlavních obrazovkách – seznam úkolů a přidání úkolu s různými detaily jako jsou štítky, popis nebo datum. Na každé obrazovce má k dispozici různé funkce, které jsou popsané pod diagramem.
5.1.1.1. Seznam úkolů Obrázek 15: Obrazovka - seznam úkolů
Akce – prohlížení úkolů Popis Uživateli jsou zobrazeny všechny jeho zadané úkoly seřazeny dle data ukončení.
23
Akce – zobrazení detailu úkolu Popis Pokud je k úkolu přiřazen kromě titulku i popis, je na tuto skutečnost uživatel upozorněn ikonou, a po klepnutí na daný úkol se otevře dialogové okno se zobrazenými detaily.
Akce – manipulace s úkoly Popis Uživatel může již zadaný úkol libovolně upravit, vymazat anebo splnit zaškrtnutím příslušného checkboxu.
Akce – přidání jednoduchého úkolu Popis Uživatel může
přidat
jednoduchý
úkol (pouze titulek) rovnou z první
obrazovky.
Akce – přidání komplexního úkolu Popis Možnost přepnout se do nového okna, kde lze zadat další informace k úkolu (např. popis, datum)
Akce – volba účtu pro synchronizaci Popis Uživatel zvolí, který ze zadaných synchronizačních účtů chce použít pro synchronizaci poznámek.
Akce – synchronizace Popis Možnost spustit synchronizaci úkolů.
24
5.1.1.2. Zadávání komplexního úkolu Obrázek 16: Obrazovka - zadání komplexního úkolu
Akce – zadání informací Popis Uživatel zadá povinně titulek úkolu a volitelně může přidat i detailní popis.
Akce – přiřazení štítku Popis Úkol můžeme označit štítkem. Ten buď zadáme, nebo vybereme ze seznamu již existujících.
Akce – nastavení data Popis Úkol můžeme opatřit datem, do kterého se má vykonat. Zadat můžeme buďto jen den, nebo případně i přesný čas.
25
Akce – uložení úkolu Popis Zadaný úkol si můžeme samozřejmě uložit, čímž se dostaneme na obrazovku se seznamem našich úkolů.
5.2.
Návrh uživatelského rozhraní
V průběhu této práce vznikne pouze část zabývající se jednoduchými úkoly, na které otestujeme univerzálnost synchronizačního modulu. Proto z následujícího návrhu použiji část týkající se úkolů a zbytek můžeme brát jako možnost dalšího vývoje. Jelikož se má jednat o aplikaci, která by měla umožnit jednoduchou a efektivní správu a zobrazení nejrůznějších úkolů a událostí, které si její uživatel přeje uchovat v paměti, měla by především nabízet přehledné zobrazení již zaznamenaného a zároveň možnost rychle zadat nový úkol nebo poznámku. Problémem je, že navrhovaná aplikace má zobrazovat jak události, které mají pevně přiřazené datum, popřípadě čas, tak i úkoly, které nemusí nutně nést žádný časový údaj. Při návrhu uživatelského rozhraní jsem tedy částečně vycházel z výše popsaných aplikací a kombinuji zde tak prvky kalendáře a TODO manažeru. Tento problém se dá proto vyřešit možností výběru z více variant úvodní obrazovky. Na obrázku 17 vidíme tři varianty. První dvě jsou vázané na kalendářové události a úkoly, ta třetí pak zobrazuje pouze seznam úkolů, které nutně nemusí mít zadané žádné datum. Obrázek 17: Úvodní obrazovka - varianty
26
První obrazovka zleva ukazuje týdenní přehled. Většina prostoru na obrazovce je věnována aktuálnímu datu a další nadcházející události. Ve spodní části obrazovky je pak pole dalších šesti dní. Události či úkoly na daný den jsou znázorněny trojúhelníčkem v pravém dolním rohu pole. Na druhé obrazovce máme klasický měsíční přehled. Šipkami v horní části obrazovky můžeme pohodlně přepínat mezi měsíci. Událost na daný den je opět znázorněna trojúhelníčkem v pravém dolním rohu. Celodenní událost je pak znázorněna pruhem v daném poli. Na obrázku můžeme vidět, že je vybráno datum 18. 2. 2011, a ve spodní části obrazovky k tomuto datu máme přiřazeny dvě události – celodenní a jednorázovou. Na třetí obrazovce je jednoduchý seznam zadaných úkolů. První úkol má přiřazené datum a je k němu přiřazen štítek. Druhý úkol má přiřazené datum a ikona vedle znázorňuje, že k danému úkolu jsou přiřazeny nějaké další informace jako například poznámky, kontakt apod. Třetí úkol nemá přiřazené žádné určité datum ani štítek. Dole je pak vidět textové pole, do kterého můžeme rychle vepsat nový úkol a přidat ho kliknutím na tlačítko s obrázkem „+“ po levé straně. Tlačítko po pravé straně nás dostane do nabídky vytváření nového úkolu nebo události. Obrázek 18: Nový úkol
27
Nejprve musíme rozlišit, zda chceme vytvořit úkol nebo událost. Hlavní rozdíl je v tom, že událost musí mít zadané datum. Podobu obrazovek pro vytváření události vidíme na obrázku 18. V základním nastavení máme možnost zadat titulek, popis, štítky a datum, do kterého se má úkol vykonat. V rozšířené nabídce, máme možnost zvolit, zda se nám má úkol zakreslit do kalendáře (úkol by v tomto případě měl mít nastavené datum), nastavit připomínky, nebo k úkolu přiřadit kontakt. Kontakt můžeme buď zadat ručně, nebo vybrat z adresáře telefonu. Dále máme možnost přidat k úkolu obrázek (z galerie nebo vyfotit nový), nahrát nebo přiložit zvuk, přidat soubor, SMS anebo email. Obrázek 19: Nová událost
Při vytváření nové události (obrázek 19) máme možnost zadat časové údaje o době konání, případně zda se jedná o celodenní akci. V rozšířených možnostech máme možnost vybrat kalendář, upomínku, opakování události, čímž můžeme rozlišit, zda se jedná o jednorázovou událost nebo jestli se opakuje například jednou za týden. Dále opět můžeme připojit kontakt nebo nějakou další informaci, jak je popsáno o odstavec výše.
28
Obrázek 20: Zobrazení detailů události
Obrázek 20 nám popisuje možnost, jak si prohlédnout detaily některé události. Budeme vycházet z týdenního přehledu a chceme si zobrazit podrobnosti o nadcházející akci. Po kliknutí na prostor zobrazující nadcházející události se dostaneme na obrazovku zobrazující denní přehled. Ve spodní části obrazovky máme opět možnost rychle zadat nějaký úkol či událost. V seznamu akcí na daný den vidíme, že druhá událost má k sobě přiřazený email, který se nám po kliknutí zobrazí.
5.3.
Synchronizace
Ze vzoru výše uvedené a popsané aplikace SMS backup vyplývá, že synchronizace by vlastně mohla fungovat jako zálohování a sdílení tohoto zálohování s ostatními klienty, ať už to jsou lidé z týmu, nebo třeba další zařízení (tablet, smartphone).
5.3.1.
Internet Message Access Protocol
K synchronizaci využijeme v naší aplikaci protokol IMAP. Jedním z důvodů je jeho rozšířenost, protože téměř každý má emailovou schránku, která nabízí přístup přes IMAP. Další jeho výhodou je, že na rozdíl od staršího protokolu POP3 umožňuje pracovat s celou emailovou schránkou. To znamená, že můžeme například vytvářet nebo mazat složky, a zprávy mezi nimi libovolně přesouvat. IMAP dále umožňuje připojení více klientů najednou, což se nám právě při použití tohoto protokolu k synchronizaci
29
může hodit. IMAP dále umožňuje vyhledávání zpráv na serveru nebo stažení jen určité části zprávy, která nás zajímá. Toto je výhodné hlavně kvůli datové náročnosti připojení.
5.3.2.
Struktura synchronizované položky
Kontakt bude mít formu emailové zprávy, kde předmět bude korespondovat se jménem a příjmením osoby a v těle zprávy bude strukturovaný dokument s ostatními údaji, jako je například telefonní číslo, emailová adresa nebo nějaké další poznámky. Případný obrázek k danému kontaktu by se nacházel v příloze dané zprávy. V případě kontaktů jako výměnný formát použijeme JSON, a to nejen z důvodu návaznosti na jinou diplomovou práci, ale poslouží nám i jako vzor pro tvorbu synchronizačních objektů, které popíši v implementační části. JSON je jednoduše čitelný a zapisovatelný jak strojově, tak i člověkem, a je nezávislý na programovacím jazyce. Je založený na kolekcích párů „název“ : „hodnota“, a na tříděném seznamu hodnot. Uložený kontakt by pak mohl vypadat takto: Subject: Jan Novak Attachment: tmp_image_contact1.png Body: {"uuid":"09226588-3157-4dde-8bfa-6285a1e72bb3","displayName":"Jan Novak","name":{"familyName":"Novak","givenName":"Jan","displayName":"Jan Novak","sync":"15657982-3563-4fdc-a833-d53aab6bed3b","primary":"false"}, "phone":[{"type":"home","value":"731356254","sync":"35fd79d0-03e5-4aeface8e563bc72a1b3","primary":"false"},{"type":"work","value":"235332145", "sync":"289235d8-dbae-481a-a6f7-b2a107c84e21","primary":"false"}], "email":[{"type":"home","value":"
[email protected]","sync":"c25d611f-4239492d-976a-2ad14c811b7c","primary":"false"}], "urls":[{"type":"other","value":"www.novak.com","sync":"778ebbd3-64ab4026-b034-bf832ea440f7","primary":"false"}], "photo":[{"sync":"a1c3f59a-544f-4608-aeaf28f748058d2b","photoName":"tmp_image_contact1.png","primary":"false"}], "note":[{"sync":"c58f6916-ec7f-48b3-8fea-1284a8e7b636","note":"Nevolat pred 8 am:-)","primary":"false"}]}
Kontakt jménem Jan Novak má přiřazen obrázek tmp_image_contact1.png. U kontaktu máme uložena dvě telefonní čísla, e-mailovou adresu a poznamenanou webovou stránku.
30
5.3.3.
UUID
Jak jsme si mohli všimnout na výše uvedeném příkladu, každý kontakt i položka kontaktu je označena pomocí UUID [16]. UUID je standardizovaný identifikátor, jehož účelem je jednoznačně rozlišit nějakou informaci. Skládá se z 32 hexadecimálních znaků rozdělených do pěti skupin oddělených pomlčkou. Jedinečnost UUID nemůžeme nijak garantovat, ale vhledem k formátu tohoto identifikátoru je prakticky nemožné, aby nám nastala kolize. První verze UUID do sebe spojovala MAC adresu počítače, který daný kód generoval a časovou známku, kdy ho generoval. Kvůli tomu byla tato verze kritizována, protože odhalovala identitu počítače. Naproti tomu čtvrtá verze využívá generování náhodných čísel.
5.3.4.
Komunikace
Na obrázku 21 vidíme sekvenční diagram, znázorňující komunikaci klientské aplikace a IMAP serveru, kam ukládáme naše kontakty. Tento server definujeme, když vytvoříme nový účet pro synchronizaci dat v našem telefonu (v tomto případě kontaktů). V tomto příkladu uživatel na tento účet vloží nový kontakt a takto pozměněný seznam kontaktů chce synchronizovat se serverem. Nejprve se klientská aplikace dotáže serveru na UID (unikátní identifikátor) poslední přidané zprávy, který porovná s lokálně uloženým UID z poslední synchronizace. Pokud se rovnají, znamená to, že na serveru od poslední synchronizace nepřibyl žádný kontakt (ani přidaný ani modifikovaný). Dále porovná, zda se rovná počet kontaktů na serveru a počet kontaktů v lokálním zařízení. Tím se ověří, že ze serveru ani z lokálního zařízení nebyl žádný kontakt smazán. Pokud se obě podmínky rovnají, znamená to, že od poslední synchronizace na serveru neproběhla žádná změna a nový kontakt se tak může bez problémů přidat.
31
Obrázek 21: Přidání nového kontaktu
Na diagramu 22 vidíme druhé zařízení, které chce výše provedené změny do sebe zahrnout. Nejprve proběhne kontrola, zda na serveru proběhla nějaká změna. To znamená, že se porovná UID u posledního kontaktu. Zjistí-li, že je vyšší, vezme všechny kontakty s vyšším UID než jsou lokálně uložené, z nich si zjistí UUID (unikátní identifikátor, který přidávám do kontaktu při jeho tvorbě) a tyto identifikátory porovnává s těmi lokálně uloženými. Pokud se nějaké dva rovnají, znamená to, že došlo k úpravě daného kontaktu. Pokud zjištěné UUID není uložené u žádného lokálního kontaktu, tak se jedná o zcela nový kontakt, který se přidá. Jelikož jsme v předchozím kroku na server přidali nový kontakt, UID bude vyšší než to lokálně uložené a UUID tohoto kontaktu bude jedinečné mezi našimi lokálně uloženými. Poté se ještě porovná počet kontaktů, čímž se zjistí, že nedošlo k žádné jiné změně.
32
Obrázek 22: S ynchronizace kontaktů ze serveru
Obecně si proces synchronizace můžeme shrnout na následujícím vývojovém diagramu (23).
Pokud
se uživatel rozhodne synchronizovat své zařízení s IMAP
serverem, zařízení vyšle na server dotaz, vracející mu poslední UID, které porovná s tím lokálně uloženým. Na základě vyhodnocení této podmínky se nám postup dále větví. Pokud se UID shodují, znamená to, že na serveru neproběhla žádná změna. Dále zjišťujeme, zda máme nějaké změny na lokálním zařízení. Pokud ano, vyšleme je na server, pokud ne, přejdeme rovnou na další podmínku, která nám zjišťuje, zda se počet kontaktů na klientu a na serveru rovná. Tím ověřujeme případné smazané kontakty. Pokud se počet rovná, tak na serveru žádné kontakty smazány nebyly a proces synchronizace tak končí. Pokud se nerovná, smažeme odpovídající kontakty i na klientu. Do druhé větve se dostaneme, pokud na začátku zjistíme, že na serveru proběhla změna (nerovná se poslední UID uložené na lokálním zařízení a na serveru). V takovém případě zjistíme, zda i na našem zařízení jsou změny, které chceme vyslat. Pokud ne, stáhneme změny ze serveru a pokračujeme do již popsaného kroku porovnávání počtu kontaktů. Ovšem pokud máme změny i na lokálním zařízení, musíme zjistit, zda tyto změny nekolidují se změnami,
které jsou provedeny na serveru. Toto zjistíme 33
porovnáváním UUID změněných kontaktů. Pokud se tyto identifikátory rovnají, musíme vyřešit kolize, jak je popsáno níže, když se nerovnají, znamená to, že se změny týkají různých kontaktů a můžeme je proto bez problémů provést. Po vyřešení tohoto kroku se nám proces opět sjednotí s druhou větví v kroku, kde zjišťujeme, zda byly na serveru smazány nějaké kontakty.
34
Obrázek 23: Obecný postup synchronizace kontaktů
35
5.3.5.
Kolize
Kolize nastává tehdy, pokud se zařízení pokusí vyslat na server nové změny, ale při porovnávání UID zjistí, že na serveru od poslední synchronizace proběhly nějaké úpravy (lokální UID se neshoduje s posledním UID na serveru). Vše si popíšeme na následujícím příkladu na obrázku 24, kde budeme využívat služby Gmail. Ve složce Contacts budeme mít uložené naše kontakty a do složky Contacts/Deleted budeme přesouvat kontakty buďto vymazané anebo ty, jež byly nahrazeny novou verzí. Představme si, že jsme lokálně změnili nějaký kontakt a změny chceme synchronizovat na server. Jak už jsem popsal výše, tak nejprve proběhne kontrola, zda na serveru nejsou od minulé synchronizace nějaké změny. To proběhne pomocí porovnání UID (bod 1). Nezjistím-li změny, nahraju na server pozměněný kontakt, který získá nové, vyšší UID a starou verzi tohoto kontaktu přesunu do složky Contacts/Deleted (bod 2 a 3).
36
Obrázek 24: Modifikace kontaktu
Na obrázku 25 pak vidíme druhé zařízení, na kterém je pozměněný ten samý kontakt. Při pokusu o synchronizaci nám tak nastává kolize. Nejprve zařízení zjistí, že na serveru proběhly od poslední synchronizace nějaké změny (bod 1) a porovnáním UUID (bod 2) určí, že se jedná o změny v kontaktu, který chceme právě synchronizovat. Tímto nám nastává kolize a program postupně začne procházet a porovnávat jednotlivé položky kontaktu. Nyní nám začne dávat smysl označování pomocí jednoznačného identifikátoru nejen celého kontaktu ale i jednotlivých položek. Kontakt totiž může mít klidně i několik telefonních čísel stejného typu (např. Domů, Práce atd.) a jednoznačný identifikátor nám 37
pomůže určit, zda se jedná o změnu stejné položky, nebo zda došlo například k přidání dalšího telefonního čísla stejného typu. Pokud se skutečně jedná o změnu ve stejné položce (bod 3), což poznáme podle identifikátoru, aplikace se uživatele zeptá, kterou verzi (lokální nebo serverovou) má použít. Dále také probíhá sloučení změn u nekolizních položek. To znamená, že pokud jsme například k lokálnímu kontaktu přidali nové telefonní číslo, ale na serveru se změna týkala emailové adresy, tak provedu sloučení takové, že nový kontakt bude obsahovat jak nové telefonní číslo, tak i emailovou adresu. Tento kontakt pak následně pošlu na server a zároveň stáhnu do lokálního zařízení, kde si i patřičně upravím ukazatel UID. Obrázek 25: Kolize při synchronizaci
38
5.3.6.
Poznámky
Z diagramů případů užití a z předešlého textu si můžeme všimnout, že v naší aplikaci nepůjde
jen
o
synchronizaci kontaktů.
Bude
také
možné
vytvářet a
synchronizovat nejrůznější úkoly a poznámky. U poznámek však na rozdíl od kontaktů nemáme Androidem pevně definovanou strukturu a způsob uložení, a proto si budeme muset vytvořit vlastní databázi, kam budeme poznámky ukládat. Každá poznámka (úkol) bude jednoznačně identifikovaná již dříve zmíněným UUID. Poznámka dále musí mít svůj titulek (název poznámky) a přidat pak můžeme i nějaký další popis, štítky a případně termín, pokud má úkol datum, do kterého by měl být splněn. Znázornění takové jednoduché databáze nám představuje následující diagram tříd (obrázek 26). V případě dalšího rozvoje budeme moci pohodlně přidat další tabulky, například pro multimediální obsah, a asociovat je s poznámkou podobně jako tabulku štítků. Obrázek 26: S chéma databáze pro uložení poznámek
Takto uloženou poznámku opět převedeme na strukturovaný dokument a pomocí navrženého modulu synchronizujeme se serverem. V příkladu uvedeném níže použijeme XML neboli eXtensible Markup Language, což je obecný značkovací jazyk, který byl vyvinut a standardizován konsorciem W3C. Umožňuje snadné vytváření konkrétních značkovacích jazyků pro různé účely a široké spektrum různých typů dat. Tento dokument bude opět velice dobře čitelný jak strojově tak i pro člověka. Níže vidíme příklad takového XML dokumentu.
Z takového zápisu jednoduše poznáme, že do 30. 11. 2011 se máme objednat k zubaři. 39
40
Kapitola 3 6. Implementace V této části se již budeme postupně zabývat implementací všech částí diplomové práce. Nejprve se podíváme na aplikaci MailBrowser, ve které se seznámíme s knihovnou pro manipulaci s IMAPem, čehož využijeme v práci na synchronizačním modulu a při sdílení souborů na server. Dále popíši práci s kontakty v systému Android, jejichž struktura a uložení není úplně jednoduché, a správné pochopení bylo důležité pro další práci. Součástí je i úkolová aplikace, která využívá spolu s kontakty stejný synchronizační modul, který představím v závěru kapitoly.
6.1.
MailBrowser
Podle funkčních požadavků vidíme, že se bude v zásadě jednat o jednoduchou aplikaci, která nám umožní prohledat předem zvolenou složku na daném IMAP účtu. Emaily budeme moci skrz aplikaci označit jako oblíbené (přiřadit flag), nebo jim dát nějaký štítek, což je v podstatě nakopírování zprávy do určité složky na serveru. Důležité je ale vyhledávání, zobrazování a stahování případné přílohy, čímž se tato aplikace stane ideálním doplňkem k funkci sdílení (zálohování) souboru na IMAP, která je rovněž součástí této práce. Fungovat to bude tak, že si na lokálním zařízení vyberu soubor, který chci zálohovat či sdílet (například s týmem spolupracovníků), a pomocí systémového dialogu vyberu, že chci pro sdílení použít naši aplikaci ExtBrainPim. Poté již jen vyberu požadovaný IMAP účet a soubor se uloží jako příloha v emailu do požadované složky. Tento soubor pak kdokoliv s přístupem na stejný účet může vyhledat a v případě potřeby stáhnout.
6.1.1.
JavaMail
Pro práci s emaily a pro komunikaci s IMAP serverem jsem si vybral knihovnu JavaMail, která je poměrně rozšířená, což znamená, že je pro ni k dispozici dobrá dokumentace. Obsahuje všechny potřebné metody pro vyhledávání a manipulaci s emaily či práci se složkami. Pro připojení k serveru pak slouží následující metoda.
41
public void connect(String username, String pass, String server, int port){ Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imap"); props.setProperty("mail.imaps.host", server); props.setProperty("mail.imaps.port", port); props.setProperty("encoding", "UTF-8"); Session session = Session.getInstance(props); try{ store = session.getStore("imaps"); store.connect(server, port, username, pass); } catch(Exception e){ Log.e(TAG, e.toString()); } }
6.1.2.
Vyhledávání
Nejdůležitější úlohou této části aplikace je vyhledávání emailů. Zadaný řetězec se vyhledává jak v těle zprávy a předmětu, tak i ve jméně odesílatele či příjemce. Vždy stačí zadat pouze část hledaného řetězce, ale samozřejmě čím více zadání zpřesním, tím lepší dostanu výsledky. Vyhledávání probíhá na základě zadaného adresáře a takzvaných termů, které představují vyhledávaný vzorek. Jelikož chci zprávy vyhledávat na základě několika kritérií, vytvořím si tzv. OrTerm, který nám, jak už název napovídá, zaručuje, že zprávu nám vrátí jako platnou (odpovídající danému vyhledávacímu vzorku), pokud se vzorek bude rovnat jednomu z pole termů (BodyTerm, SubjectTerm, FromStringTerm, RecipientStringTerm). Konstrukci OrTermu vidíme na následující ukázce.
42
private OrTerm buildTerm(String pattern) { SearchTerm[] searchTerm = new SearchTerm[4]; searchTerm[0] = new BodyTerm(pattern); searchTerm[1] = new SubjectTerm(pattern); searchTerm[2] = new FromStringTerm(pattern); searchTerm[3] = new RecipientStringTerm(Message.RecipientType.TO, pattern); OrTerm orTerm = new OrTerm(searchTerm);
return orTerm; }
Samotné vyhledávání v adresáři pro přijatou poštu (Inbox) pak probíhá pomocí jednoduchého příkazu: Folder inbox = store.getFolder("Inbox"); inbox.open(Folder.READ_ONLY); Message[] messages = inbox.search(orTerm);
Obrázek 27: Ukázka aplikace - MailBrowser
43
Na obrázku 27 můžeme vidět ukázku z aplikace MailBrowser a vyhledané zprávy, které jsme vytvořili synchronizováním kontaktů z našeho zařízení na IMAP. Vlevo je seznam všech nalezených zpráv a vpravo vidíme formát zprávy u synchronizovaného kontaktu spolu s vyvolanou kontextovou nabídkou.
6.2.
Kontakty v Androidu
Od verze Androidu 2.0 se změnilo a zlepšilo API pro kontakty [17]. Často se stane, že máme více účtů (pracovní, domácí apod.), kde se může nacházet kontakt na stejného člověka. Systém nově takové kontakty (stejné nebo podobné jméno a lehce odlišná data) rozpozná a sloučí je do jediného kontaktu. Strukturu kontaktů vidíme na obrázku 28. Obrázek 28: S truktura kontaktů v Androidu
Na nejnižším stupni máme tabulku dat. Tato data jsou nějakého typu (MIMETYPE), což může být například jméno, telefon, e-mail apod. Dále nás zajímá, že tabulka obsahuje položky DATA1 až DATA15, do kterých už ukládáme konkrétní informace. Pokud máme například data typu email, do položky DATA1 uložíme emailovou adresu, ale pokud máme data typu jméno, do položky data1 ukládáme DISPLAY_NAME. Souhrn těchto datových položek nám tvoří takzvaný RawContact, který v této práci budeme následně synchronizovat. RawContact totiž vzniká při vytváření nového kontaktu, který pak vkládáme na určitý účet. Na nejvyšším stupni je pak Contact, který agreguje RawContacty z různých účtů, ať už se jedná o klasické telefonní účty, nebo třeba o účet Facebooku či Skype.
44
6.2.1.
Manipulace s kontakty
Základem této části práce je manipulace s kontakty, to znamená vytváření, čtení, úprava a mazání. Zajímá nás celkový počet kontaktů, a zvlášť si pak zjistíme seznam upravených nebo vytvořených a také smazaných kontaktů. Upravené nebo právě vytvořené kontakty mají příznak DIRTY = 1, smazané kontakty pak mají příznak DELETED = 1. Vyhledání všech kontaktů, které nejsou smazané, pak zajistí následující kód. public Cursor getAllContacts() { int deleted = 0; Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon() .appendQueryParameter(RawContacts.ACCOUNT_NAME,accountName) .appendQueryParameter(RawContacts.ACCOUNT_TYPE, SyncModuleConstants.ACCOUNT_TYPE).build(); Cursor c = ctx.getContentResolver().query(rawContactUri, new String[]{RawContacts._ID, RawContacts.SYNC1}, RawContacts.DELETED
+ "=?", new
String[]{String.valueOf(deleted)}, null); return c; }
Na začátku specifikujeme jméno a typ účtu, ze kterého chceme kontakty brát. Samotný dotaz pak zařídí metoda query(), ve které specifikujeme, že nás z kontaktu zajímá pouze ID a položka SYNC1, do které si ukládáme UUID kontaktu. Nakonec ještě upřesníme, že chceme získat pouze kontakty, které nejsou smazané. Jak už jsem se v průběhu práce zmínil, kontakt je jednoznačně identifikován pomocí UUID. Tento identifikátor však kontakt nezískává automaticky, a proto všechny kontakty s příznakem DIRTY = 1, kontrolujeme, zda mají přiřazené UUID. Pokud ne, vygenerujeme nové a přiřadíme ho právě do sloupce SYNC1, který je určen pro dodatečné informace synchronizačním účtům. Toto zajišťuje následující metoda.
45
private void generateUUID(int rawContactId) { Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); String uuid = String.valueOf(UUID.randomUUID()); ContentValues values = new ContentValues(); values.put(RawContacts.SYNC1, uuid); ctx.getContentResolver().update(rawContactUri, values, null, null); }
6.3.
TaskManager
Další součástí je jednoduchá aplikace pro zaznamenávání úkolů, na které později budeme demonstrovat univerzálnost synchronizačního modulu. V návrhu jsem vycházel z již existujících úkolových aplikací, ze kterých se mi asi nejvíce líbila AstridTasks. Jelikož úkolové aplikace používám, ale dost často se mi zdají zbytečně složité, rozhodl jsem se, že si vytyčím pár základních vlastností, které by úkolová aplikace měla obsahovat, a těch se budu držet při implementaci. Aplikace je tak navržena pro jednoduché a maximálně efektivní využití. Těmito základními vlastnostmi jsou: rychlé zadání úkolu, upozornění na úkol a widget na plochu. Trochu komplikovaná byla v této části tvorba upozorňování na úkol. V Androidu se pro tyto akce využívá tzv. PendingIntent, jenž na rozdíl od Intentů, které například využívám při přechodu z jedné Activity do druhé, může být předán jiné aplikaci, která ho později vykoná. V případě upozorňování se využije systémová třída AlarmManager, které se předá konkrétní pendingIntent i spolu s časem v milisekundách, který zbývá do vyvolání upozornění. Pro vytvoření alarmu využiji následující metodu. public void setAlarm(int alarmId, long ms, String title, AlarmManager alarmManager) { Intent intent = new Intent(ctx, AlarmReceiver.class); intent.putExtra(TasksConstants.TITLE, title); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ms, pendingIntent); }
46
Musíme také myslet na to, že při restartu telefonu se alarm zruší, a proto je třeba vytvořit vlastní třídu rozšiřující systémový BroadcastReceiver, kterou zaregistrujeme v systému, aby
byla
upozorňována
kdykoli
se
uskuteční
boot.
To
uděláme
v
souboru AndroidManifest.xml přidáním zvýrazněného řádku k naší třídě.
Výslednou aplikaci vidíme na obrázku 29. Obrázek 29: Ukázka aplikace - TaskManager
Nalevo vidíme widget se seznamem aktuálních úkolů, na který když klikneme, tak se dostaneme přímo na úvodní stránku úkolové aplikace, kde máme zobrazený ten samý seznam. Úkol buďto můžeme rychle přidat jeho napsáním do políčka dole a kliknutím na tlačítko „+“, nebo pokud klepneme rovnou na zmiňované tlačítko, dostaneme se na obrazovku, kde můžeme zadat už komplexnější úkol.
47
6.4.
Synchronizační modul
Nejdůležitější částí práce je synchronizační modul, který by měl zvládnout synchronizovat jak kontakty, tak i úkoly, poznámky, SMS nebo třeba události. Jeho univerzálnost a použitelnost demonstruji v této práci na synchronizaci kontaktů a úkolů. Do
budoucna by však neměl být problém ho využít v dalších aplikacích. Jak
synchronizační modul funguje, jsem už popsal v předchozí části své práce. Zde představím jeho základní části.
6.4.1.
Synchronizační objekty
Důležitou součástí práce bylo vymyslet univerzální strukturu dat, se kterou pak bude modul operovat a bude mu jedno, zda se jedná o kontakty nebo úkoly. Za tímto účelem jsem navrhl trojici tříd, která, jak jsem později zjistil, odpovídá filozofii zápisu ve formátu JSON,
jenž jsem už představil výše.
Jedná se o SynchronizedData,
SynchronizedArrays a SynchronizedObject. Nejjednodušší, a vespod v hierarchii se nachází třída SynchronizedData, která obsahuje dvojici položek column – value, což vlastně odpovídá základnímu konstruktu ve formátu JSON. Výše v hierarchii máme SynchronizedArrays. Objekt této třídy je určitého typu (type) a udržuje v sobě ArrayList objektů typu SynchronizedData. Nejvýše pak máme SynchronizedObject, který má nějaké jméno (name), jednoznačně je identifikován pomocí uuid a nakonec obsahuje i ArrayList pro binární data a také pro objekty typu SynchronizedArrays. Vše by měl vysvětlovat následující obrázek (30), ze kterého je patrná i hierarchie zmíněných tříd. Jedná se o zjednodušený případ synchronizace kontaktu.
48
Obrázek 30: Hierarchie synchronizačních tříd
Vidíme, že objekt má přiřazeno uuid, jméno a obsahuje soubor. Jméno se použije pro předmět zprávy, uuid jednoznačně identifikuje zprávu na serveru (je umístěno v hlavičce zprávy i v textu zprávy) a soubor bude přiložen jako příloha. U kontaktu jsou vyplněné tři položky (SynchronizedArrays) – jméno, telefonní číslo a kontakt má připojenu také fotografii. Každá položka je pak tvořena souborem dat (např. číslo – 777333555, typ – mobilní telefon atd.). Stejnou strukturu dat pak můžeme vytvořit i pro poznámky a úkoly, události, SMS apod.
Ukáži ještě
jednoduchý
příklad
takto
vytvořeného
objektu pro
událost.
SynchronizedObject je Event, SynchronizedArrays máme Basic a Advanced a jednotlivá data nalezneme v řádcích tabulky.
49
Tabulka 2: S ynchronizační objekt pro událost
Event Name = oslava narozenin, uuid = 778ebbd3-64ab-4026-b034-bf832ea440f7 Basic
Advanced
Title = oslava narozenin
Description = oslava 25. narozenin
From = 17.12.2011, 20:00
Location = Letenské náměstí
To = 18.12.2011, 1:00
Takto připravené objekty pak jednoduše převedeme na textový řetězec, ať už se jedná o XML nebo JSON a nahrajeme jako zprávu na server.
6.4.2.
Synchronizační třída
Samotnou synchronizaci nám pak zajišťuje třída Synchronizator, které předáme vytvořené synchronizační objekty popsané výše, ona je převede na řetězce a jako zprávy vyšle na server. Nežli ale začne cokoli stahovat nebo posílat, musí si ověřit, v jakém stavu jsou kontakty na lokálním zařízení oproti těm, co jsou na serveru. Diagram tohoto algoritmu jsem představil v návrhu modulu, zde ukáži už samotný algoritmus na pseudokódu.
50
function doSynchronization(localUid, serverUid, objToUpload, objToDelete){ if(localUid == serverUid){ if(objToUpload.size > 0) uploadObjects(objToUpload); if(objToDelete.size > 0) deleteObjects(objToDelete); }else if(localUid < serverUid){ if(objToUpload.size > 0 || objToDelete.size > 0){ solveCollisions(objToUpload, objToDelete); } if(objToUpload.size == 0 && objToDelete.size == 0){ downloadChanges(); } } }
Algoritmus vlastně odpovídá diagramu v návrhu. V první podmínce kontroluji, zda proběhly nějaké změny na serveru. Pokud ne, a lokální UID se rovná serverovému, pošlu lokální změny na server (přidání, modifikace či mazání kontaktu). Druhá větev (else if) nám představuje situaci, kdy na serveru došlo ke změnám. Zde se nám kód opět větví. Buďto mám na lokálním zařízení změny, které chci aplikovat na server, a v tom případě musím řešit kolizi, nebo na lokálním zařízení změny nemám a jednoduše tak stáhnu objekty
ze
serveru.
Lehká
kolize
(v
kódu
solveSoftDeleteCollision
nebo
solveSoftChangeCollision) nám nastává v případě, že chci na server vyslat změny, ale dozvím se, že mezitím se jiné změny udály i na serveru, a to ani nemusí jít o změny ve stejné položce. V takovém případě předám lokální objekty zmíněným metodám, které pak porovnávají, zda se jedná o „těžkou“ kolizi stejného objektu (v kódu hardCollision), nebo zda se změny týkají rozdílných položek a v takovém případě proběhne jednoduché nahrání respektive stažení. V případě těžké kolize se pak procházejí a porovnávají všechny položky objektu a je pak na uživateli, aby rozhodl, kterou verzi chce zahrnout do výsledných změn. Nakonec po úspěšné synchronizaci obnovím ukazatel lokání UID tak, aby se rovnal tomu serverovému.
51
6.5.
Funkce share
Vzhledem k výše zmíněným a implementovaným funkcím se pak přímo nabízelo implementovat ještě jednu část. Android nám totiž umožňuje sdílet vybraný soubor. Jak by měla tato část fungovat, už jsem zmínil při představování aplikace MailBrowser, k níž je tato funkce ideálním doplňkem. Naši aplikaci tak musíme zaregistrovat v Androidu, aby ji nabízel v systémovém dialogu pro výběr poskytovatele sdílení. Toto učiníme registrací aktivity nabízející výběr účtu, na který budeme nahrávat.
Z kódu vidíme, že naši aplikaci asociujeme se všemi důležitými typy souborů, se kterými se můžeme na telefonu s Androidem setkat, a jejichž sdílení může být užitečné. Jak vypadá dialog na sdílení, vidíme na obrázku 31.
52
Obrázek 31: Funkce share
53
54
Kapitola 4 7. Testování Testování aplikace bylo zprostředkováno vedoucím práce, a proto v této části shrnu připomínky, které mi k aplikaci chodily. Objeví se zde také několik mých poznatků, které jsem získal při opravách různých chyb, vyskytujících se při testování. Základní dvě věci, na které je dobré při vývoji aplikací myslet, je zvládání změny orientace, a umisťování náročnějších operací na pozadí. V praxi to znamená, že pokud například při vyplňování formuláře otočím telefonem, tak nedojde k smazání již vyplněných polí. Umisťování náročnějších operací na pozadí je vhodné zejména vzhledem k slabšímu výpočetnímu výkonu telefonů, a operace, které na počítači sotva postřehneme, mohou na mobilním telefonu způsobit nepříjemný „zásek“.
7.1.
Společná část
Původní návrh Při vytváření nového účtu nám byl zobrazen dialog, kam jsme zadali kompletně všechny údaje jako je uživatelské jméno, heslo, server, port, synchronizační adresář a jméno synchronizačního účtu. Změna Tato aktivita byla rozdělena na tři různé části. Protože například při vytváření účtu v MailBrowseru nepotřebuji zadat synchronizační adresář nebo název synchronizačního účtu. Jedna aktivita tak byla rozdělena na tři:
společná část (uživatelské jméno, heslo, server, port)
výběr adresáře (využívá TaskManager, funkce Share a synchronizační účet)
pojmenování synchronizačního účtu
55
7.2.
Synchronizace
Původní návrh Dialog, který se původně zobrazil při kolizi, se týkal každého jednotlivého datového prvku (například hodnota telefonního čísla nebo typ tohoto čísla). Na výběr pak bylo, zda chci použít lokální nebo serverovou hodnotu. Změna V dialogu nově zobrazuji celý konfliktní prvek, což znamená, že pokud se například změna týkala typu telefonního čísla, v dialogu vidíme kromě tohoto typu také hodnotu. Po výběru, zda chceme použít lokální či serverovou změnu, máme možnost ručně upravit hodnoty. V dialogu máme též možnost prohlédnout si detail lokálního kolizního kontaktu. Původní návrh Na některé sloupce v tabulce kontaktů jsem se odkazoval pomocí jejich čísla. Změna Každý telefon s Androidem je jiný, a používá jiné názvy sloupců a jiná čísla indexů ve své databázi, proto je třeba s tímto počítat, a číslo požadovaného sloupce si nejprve zjistit, nežli se začnu dotazovat na jeho hodnotu. Původní návrh Zprávy, které se nahrávají na server, původně obsahovaly jako adresu odesílatele
[email protected] (v případě kontaktů) nebo
[email protected] (v případě sdílení souborů). Změna Nově jsou tyto adresy doplněny o výrobce a typ telefonu.
56
7.3.
MailBrowser
Původní návrh Volba adresáře k prohledávání byla umístěna v Preferences. Změna Nově je tato volba umístěna přímo v kontextovém menu. Původní návrh Pokud jsem nezadal vyhledávací vzorek, vyhledávání se nespustilo. Změna Dochází k postupnému načítání posledních zpráv vybraného adresáře. Nový návrh Implementována nová možnost vyhledávání pomocí Flagu (pokud zvoleno, vyhledává jen označené zprávy) Původní návrh Přílohy se původně ukládaly přímo do /sdcard/. Změna V preferences přibyla možnost zvolit cílový adresář pro ukládání příloh. Přidána také možnost použít OpenIntents [18], což znamená, že před uložením budeme dotázáni na cílovou složku. Nový návrh Pokud ukládám přílohu, jejíž název už lokálně existuje, tak nepřepisovat ale přejmenovat na formát "
().<ext>" a inc postupně zvyšovat, dokud se nenajde neexistující název.
57
58
Kapitola 5 8. Závěr Cílem práce bylo navrhnout a implementovat univerzální synchronizační modul pro Android. Funkčnost tohoto prototypu jsem pak demonstroval na aplikaci synchronizující poznámky a kontakty. V úvodu jsem nastínil, proč se vlastně tímto tématem zabývám, a proč mi připadá aktuální. Také jsem zde stručně představil platformu Android, a tím i odůvodnil výběr programovacího jazyka Java. Dále jsem si stanovil cíle práce, a vlastnosti klíčových aplikací jsem představil na funkčních a nefunkčních požadavcích. V analytické části jsem se nejprve zamyslel nad rozdíly mezi klasickými telefony, smartphony
a
počítači,
z čehož nám vyplynuly
konkrétní požadavky
na
návrh
uživatelského rozhraní. Zmínil jsem také základy programování pro Android a poté analyzoval podobné existující aplikace. V návrhu
jsem
nejprve
v diagramech
případů
použití
představil
funkce
poznámkové aplikace, a dále navrhl její uživatelské rozhraní, včetně záměrů, co se týče budoucího vývoje. V druhé části této kapitoly jsem se pak věnoval již samotnému návrhu synchronizačního
modulu.
Princip
jeho
fungování jsem ukázal jak
na obecných
diagramech, tak i na konkrétních příkladech. V implementační části jsem pak představil jednotlivé součásti aplikace a na krátké ukázce kódu nebo obrázku jsem demonstroval jejich klíčové úlohy a vysvětlil, jak tyto části fungují. Testování pak ukázalo problematické části, ale i nové nápady, jež byly dodatečně implementovány. Cestu budoucího vývoje jsem se pokusil naznačit již v návrhové části, kde jsem se snažil navrhnout komplexní kalendářovou a úkolovou aplikaci. V praxi se většina úkolů váže k datu, a propojení s kalendářovou aplikací se proto zdá být jako logické. Dále by pak stálo za zvážení vylepšování samotné úkolové aplikace. Například udělat fotografii, nahrát video, nebo pořídit zvukový záznam by bylo možné přímo pomocí aplikace,
která nám z tohoto
multimediálního obsahu automaticky vytvoří
poznámku či úkol.
59
Určitě by bylo zajímavé propojení úkolů či poznámek nejen s datem, ale i místem. Úkolová aplikace, která nám v čase i místě zobrazí seznam úkolů, by mohla být užitečná a šetřit náš čas. Android 4.0 nám pak představuje nové API, které nám umožní pomocí Calendar Provideru spravovat kalendáře, události nebo i seznam účastníků dané akce. Zajímavé pro tuto práci je však to, že synchronizační adaptéry nám mohou nabídnout synchronizaci různých kalendářových služeb na jednotné místo. Myslím si, že vytyčené cíle práce jsem splnil a vytvořil v praxi použitelné aplikace pro Android, které jsem i na základě testování dále průběžně vylepšoval. Dále věřím, že navržený synchronizační modul bude dobře použitelný v dalším vývoji.
60
9. Použitá literatura [1] Mobil.cz [online]. 12.9.2011 [cit. 2011-12-04]. Tech & Trendy. Dostupné z WWW:
[2] Mobilmania.cz [online]. 30.5.2011 [cit. 2011-12-05]. Mobilní internet roste. Dostupné z WWW:
ma-65>
[3] Ispreview.com [online]. 27.1.2011 [cit. 2011-12-05]. Mobile Internet Penetration. Dostupné z WWW:
2-67-billion-users-world-wide-in-2015.html>
[4] Wikipedie [online].
22.11.2011
[cit.
2011-12-05].
Android.
Dostupné
z
WWW:
[5] Wikipedie [online]. 2.12.2011 [cit. 2011-12-05]. Internet Message Access Protocol. Dostupné z WWW:
[6] ExtBrain [online].
2011
[cit.
2011-12-05].
ExtBrain.
Dostupné
z
WWW:
[7] Wikipedie [online]. 26.11.2011 [cit. 2011-12-05]. Otevřený software. Dostupné z WWW:
[8] Mobilmania.cz [online]. 10.6.2011 [cit. 2011-12-05]. Trh smartphonů povyroste o 55 %, vede Android. Dostupné z WWW:
[9] Wikipedie [online].
1.10.2011
[cit.
2011-12-05].
Java.
61
Dostupné
z
WWW:
[10]
Wikipedie [online].
4.12.2011
[cit.
2011-12-05].
Dalvik.
Dostupné
z
WWW:
[11]
Android Developers [online]. 1.12.2011 [cit. 2011-12-05]. What is Android?. Dostupné z
WWW:
[12]
W3.org [online]. 2011/04/23 [cit. 2011-12-05]. Extensible Markup Language (XML).
Dostupné z WWW:
[13]
Json.org [online].
2011
[cit.
2011-12-05].
JSON.
Dostupné
z
WWW:
[14]
Wikipedie [online]. 13.11.2011 [cit. 2011-12-05]. Operační systém. Dostupné z WWW:
[15]
Android Developers [online]. 1.12.2011 [cit. 2011-12-05]. Application Fundamentals.
Dostupné z WWW:
[16]
Wikipedie [online]. 30.11.2011 [cit. 2011-12-05]. Universally unique identifier. Dostupné z
WWW:
[17]
Android Developers [online]. 2011 [cit. 2011-12-05]. Using the Contacts API. Dostupné z
WWW:
[18]
OpenIntents [online].
2011
[cit.
2011-12-13].
62
OpenIntents.
Dostupné
z
WWW:
10. Uživatelská příručka 10.1.
MailBrowser
10.1.1.
Nastavení
pokud nemáme vytvořený účet, aplikace nás automaticky přepne na jeho tvorbu
při zadávání účtu vyplňujeme uživatelské jméno, heslo, server a port
jestliže máme účet, nebo jsme ho právě vytvořili, automaticky se zobrazí dialog na zvolení prohledávané složky
zvolit počet zobrazených zpráv můžeme pomocí stisknutí tlačítka menu a výběru Preferences
zde také můžeme zvolit adresář pro ukládání příloh
účet nebo složku můžeme změnit odpovídající volbou v kontextovém menu (vyvoláme stisknutím tlačítka menu)
10.1.2.
Hledání
vyhledávat začneme stisknutím tlačítka s lupou
pokud nezadáme text, postupně se budou zobrazovat poslední zprávy z dané složky
pokud zadáme do vyhledávacího pole nějaký řetězec, vyhledají se všechny zprávy tomuto řetězci odpovídající
pokud je vyhledaných zpráv více než zadané zobrazovací maximum, tak další zprávy načteme pomocí zobrazeného tlačítka Next x, kde x je počet zvolených zpráv k načtení
vyhledávat mohu také pouze zprávy označené hvězdičkou (ikona je žlutě vybarvena)
63
10.1.3.
Manipulace
kliknutím na ikonu hvězdičky u zprávy ji označíme jako oblíbenou
kliknutím na zprávu otevřeme daný email
pokud má daný email přílohu, její stažení proběhne pomocí tlačítka Save
pokud stiskneme na telefonu tlačítko menu a zvolíme Labels, můžeme zprávu přesunout do vybrané složky
10.2.
TaskManager
10.2.1.
Tvorba úkolu
aplikaci
spustíme
buďto,
přes
ikonu
v seznamu
programů,
nebo
kliknutím na widget aplikace
napsáním úkolu a stisknutím zeleného tlačítka + přidáme rychle úkol
pokud necháme pole prázdné a stiskneme tlačítko +, přepneme se na tvorbu složitějšího úkolu
úkol uložíme tlačítkem Save, které nás vrátí na seznam úkolů
pokud máme k úkolu nějaký popis (označeno ikonou i), zobrazíme ho kliknutím na úkol
dlouhým stiskem na úkol se nám zobrazí menu, pomocí něhož můžeme úkol editovat nebo smazat
úkol „splníme“ zatržením checkboxu
10.2.2.
Synchronizace
pokud na obrazovce se seznamem úkolů stiskneme tlačítko menu, zobrazí se nám dvě položky – Synchronize a Account
stisknutím Synchronize se spustí synchronizace, pokud máme účet a zvolenou složku
stisknutím Account se dostaneme na obrazovku se seznamem účtů, kde se kliknutím na účet dostaneme k výběru adresáře
z obrazovky Account samozřejmě můžeme vytvořit i účet zcela nový
64
10.3.
Funkce share
10.3.1.
Sdílení souboru
dlouhým stiskem na soubor v našem telefonu se vyvolá menu, kde vybereme Sdílet a vybereme službu ExtBrainPim
zobrazí se nám známý dialog se seznamem již zadaných účtů
jeden vybereme (nebo vytvoříme nový) a zvolíme cílovou složku
kliknutím na název složky nebo zadáním jména a potvrzením OK soubor odešleme
na výsledek nás upozorní zpráva v notifikační oblasti
Synchronizace kontaktů
10.4.
10.4.1.
Tvorba synchronizačního účtu
v telefonu zvolíme Nastavení – Účty a synchronizace – Přidat účet
zvolíme typ účtu ExtBrain
ze známého seznamu vybereme již existující účet nebo vytvoříme nový
ze seznamu složek vybereme tu, kam budeme chtít synchronizovat naše kontakty
na poslední obrazovce zadáme název tohoto synchronizačního účtu
nastavení účtu můžeme kdykoliv změnit (přihlašovací údaje nebo složka)
65
11. Obsah CD Kořenový adresář CD obsahuje:
Adresář se zdrojovými kódy aplikace
DP-hilgelub.pdf – tento soubor
DP-hilgelub.docx – editovatelná verze této práce
ExtBrainPim.apk – instalační balíček aplikace pro Android
66