Modul pro správu informací pro Android - ExtBrain

Transkript

Modul pro správu informací pro Android - ExtBrain
Č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.
<task uuid="84905a48-97b9-4be2-95c1-bfecf032848a">
<basic title="zubar" description="objednat na prohlidku"
date="30.11.2011
" tag="zdravi" />
</task>
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ě.
<receiver android:name=".tasks.alarm.AlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
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.
<activity android:name=".lib.activity.AccountSelectionActivity"
android:label="@string/app_name"
android:icon="@drawable/sp_icon">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category
android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*" />
<data android:mimeType="audio/*" />
<data android:mimeType="video/*" />
<data android:mimeType="text/*" />
<data android:mimeType="application/*" />
</intent-filter>
</activity>
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 "<name> (<inc>).<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:
<http://mobil.idnes.cz/na-svete-se-letos-proda-400-milionu-smartphonu-u-nas-asi-750-000p3w-/mob_tech.aspx?c=A110912_152906_mob_tech_jm>
[2] Mobilmania.cz [online]. 30.5.2011 [cit. 2011-12-05]. Mobilní internet roste. Dostupné z
WWW:
<http://nokiamania.mobilmania.cz/201105303208/mobilni-internet-roste-symbian-
ma-65>
[3] Ispreview.com [online]. 27.1.2011 [cit. 2011-12-05]. Mobile Internet Penetration. Dostupné z
WWW:
<http://www.ispreview.co.uk/story/2011/01/27/mobile-internet-penetration-to-reach-
2-67-billion-users-world-wide-in-2015.html>
[4] Wikipedie [online].
22.11.2011
[cit.
2011-12-05].
Android.
Dostupné
z
WWW:
<http://cs.wikipedia.org/wiki/Android_(opera%C4%8Dn%C3%AD_syst%C3%A9m)>
[5] Wikipedie [online]. 2.12.2011 [cit. 2011-12-05]. Internet Message Access Protocol. Dostupné
z WWW: <http://cs.wikipedia.org/wiki/Internet_Message_Access_Protocol>
[6] ExtBrain [online].
2011
[cit.
2011-12-05].
ExtBrain.
Dostupné
z
WWW:
<http://extbrain.felk.cvut.cz/>
[7] Wikipedie [online]. 26.11.2011 [cit. 2011-12-05]. Otevřený software. Dostupné z WWW:
<http://cs.wikipedia.org/wiki/Open_source_software>
[8] Mobilmania.cz [online]. 10.6.2011 [cit. 2011-12-05]. Trh smartphonů povyroste o 55 %, vede
Android. Dostupné z WWW: <http://www.mobilmania.cz/clanky/trh-smartphonu-povyroste-o55--vede-android/sc-3-a-1316496/default.aspx>
[9] Wikipedie [online].
1.10.2011
[cit.
2011-12-05].
Java.
<http://cs.wikipedia.org/wiki/Java_(programovac%C3%AD_jazyk)>
61
Dostupné
z
WWW:
[10]
Wikipedie [online].
4.12.2011
[cit.
2011-12-05].
Dalvik.
Dostupné
z
WWW:
<http://en.wikipedia.org/wiki/Dalvik_(software)>
[11]
Android Developers [online]. 1.12.2011 [cit. 2011-12-05]. What is Android?. Dostupné z
WWW: <http://developer.android.com/guide/basics/what-is-android.html>
[12]
W3.org [online]. 2011/04/23 [cit. 2011-12-05]. Extensible Markup Language (XML).
Dostupné z WWW: <http://www.w3.org/XML/>
[13]
Json.org [online].
2011
[cit.
2011-12-05].
JSON.
Dostupné
z
WWW:
<http://www.json.org/json-cz.html>
[14]
Wikipedie [online]. 13.11.2011 [cit. 2011-12-05]. Operační systém. Dostupné z WWW:
<http://cs.wikipedia.org/wiki/Opera%C4%8Dn%C3%AD_syst%C3%A9m>
[15]
Android Developers [online]. 1.12.2011 [cit. 2011-12-05]. Application Fundamentals.
Dostupné z WWW: <http://developer.android.com/guide/topics/fundamentals.html>
[16]
Wikipedie [online]. 30.11.2011 [cit. 2011-12-05]. Universally unique identifier. Dostupné z
WWW: <http://en.wikipedia.org/wiki/Universally_unique_identifier >
[17]
Android Developers [online]. 2011 [cit. 2011-12-05]. Using the Contacts API. Dostupné z
WWW: <http://developer.android.com/resources/ar ticles/contacts.html>
[18]
OpenIntents [online].
2011
[cit.
2011-12-13].
<http://www.openintents.org/en/>
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

Podobné dokumenty

Google Android

Google Android pokud jsou komponenty ve zdrojovém kódu, ale nejsou v manifestu – nemohou být spuštěny (výjimkou broadcast receiver)

Více

Technická dokumentace

Technická dokumentace Obor: Web a multimedia 23. kv¥tna 2012

Více

Třída S. - VSP Auto

Třída S. - VSP Auto světlemodrých kvetoucích polí lnu. Když toto rčení vzniklo, jezdilo se ve vozech s jednou koňskou silou. K tomu, aby se i dnes dalo jezdit stejně uvolněně – a přitom rychleji – je zde třída S. Udáv...

Více

Třída CLS.

Třída CLS. Další informace získáte na internetových stránkách www.mercedes-benz.cz

Více