Z´apadoˇcesk´a univerzita v Plzni Fakulta aplikovan´ych vˇed Katedra informatiky a v´ypoˇcetn´ı techniky
Bakal´ aˇ rsk´ a pr´ ace Pr´ ace s kontakty na mobiln´ı platformˇ e Android
Plzeˇn 2014
David Fiedler
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 9. kvˇetna 2014 David Fiedler
Abstract This thesis is concerned with management of different contacts on the Android platform. Currently on the android platform, contact information related to one person are often scattered in many different contacts. The goal of this project is to find a way to locate these contacts and connect them together in the same place. The application has been implemented, allowing you to select the name and photo of the linked contact. On devices with the administration rights the application can work with contacts from Facebook, it can also find more contacts to link in other tested applications. Considering all these factors, this project is making a step forward with this issue compared with other current applications that are available.
Abstrakt Tato pr´ace se zab´ yv´a spr´avou kontakt˚ u na platformˇe Android. Na platformˇe Android b´ yvaj´ı kontaktn´ı informace vztahuj´ıc´ı se k jedn´e osobˇe roztrouˇseny v mnoha kontaktech. C´ılem pr´ace je naj´ıt zp˚ usob, jak tyto kontakty vyhledat a propojit. Zvolen´a aplikace byla realizov´ana, umoˇzn ˇuje vybrat n´azev a fotografii propojen´eho kontaktu. Na zaˇr´ızen´ıch s administr´atorsk´ ymi pr´avy um´ı aplikace pracovat i s kontakty z Facebooku, nav´ıc najde ˇra´dovˇe v´ıce kontakt˚ u k propojen´ı neˇz ostatn´ı testovan´e aplikace. Vˇsechny tyto faktory znamenaj´ı posun vpˇred ve srovn´an´ı s ostatn´ımi dostupn´ ymi aplikacemi zab´ yvaj´ıc´ımi se touto problematikou.
Obsah ´ 1 Uvod 1.1 C´ıle bakal´aˇrsk´e pr´ace . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 C´ıle aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 2
2 Existuj´ıc´ı aplikace pro pr´ aci s kontakty 2.1 Testovan´e aplikace . . . . . . . . . . . 2.1.1 Aplikace Merge+ . . . . . . . . 2.1.2 Contact Optimizer . . . . . . . 2.1.3 Duplicate Contacts Manager . . 2.2 Shrnut´ı existuj´ıc´ıch aplikac´ı . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
3 3 3 5 5 6
3 Pr´ ace s kontakty na platformˇ e Android 3.1 Content Provider . . . . . . . . . . . . . . . . . 3.1.1 Pˇr´ıstup k provideru . . . . . . . . . . . . 3.1.2 Content URI . . . . . . . . . . . . . . . 3.1.3 Z´ısk´an´ı dat z provideru . . . . . . . . . . 3.1.4 Zobrazen´ı v´ ysledk˚ u dotazu . . . . . . . . 3.1.5 Vkl´ad´an´ı, aktualizace a maz´an´ı dat . . . 3.1.6 Kontrakty . . . . . . . . . . . . . . . . . 3.2 Contact Provider . . . . . . . . . . . . . . . . . 3.2.1 Organizace kontakt˚ u . . . . . . . . . . . 3.2.2 Raw contacty . . . . . . . . . . . . . . . 3.2.3 Data . . . . . . . . . . . . . . . . . . . . 3.2.4 Kontakty . . . . . . . . . . . . . . . . . 3.2.5 Opr´avnˇen´ı potˇrebn´a pro pr´aci s kontakty 3.2.6 Propojov´an´ı kontakt˚ u. . . . . . . . . . . 3.3 Nedostatky v ofici´aln´ı dokumentaci . . . . . . . 3.3.1 Pr´ace s kontakty z Facebooku . . . . . . 3.3.2 Zmˇena n´azvu kontaktu . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
7 7 8 8 9 9 10 10 10 11 12 12 14 15 16 17 17 18
4 Struktura aplikace 4.1 Prezentaˇcn´ı vrstva . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Fragmenty . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Vynech´an´ı aktivit z historie . . . . . . . . . . . . . . . . . .
19 19 19 21
. . . . .
. . . . .
. . . . .
. . . . .
OBSAH
4.2
4.3
4.4
OBSAH
4.1.3 Struˇcn´ y popis aktivit . . . . . . . . Aplikaˇcn´ı vrstva . . . . . . . . . . . . . . . 4.2.1 Syst´em vyhled´avac´ıch modul˚ u . . . 4.2.2 Implementovan´e moduly . . . . . . 4.2.3 Parazitn´ı moduly . . . . . . . . . . Datov´a vrstva . . . . . . . . . . . . . . . . 4.3.1 Z´ısk´av´an´ı kontakt˚ u k porovn´an´ı . . 4.3.2 Propojov´an´ı kontakt˚ u. . . . . . . . 4.3.3 Z´ısk´av´an´ı facebookov´ ych kontakt˚ uz Kompatibilita . . . . . . . . . . . . . . . .
5 Testov´ an´ı aplikace 5.1 Porovn´an´ı aplikac´ı . . . . . . 5.2 Porovn´an´ı r˚ uzn´ ych nastaven´ı . 5.2.1 Email module . . . . . 5.2.2 Phone number module 5.2.3 Name module . . . . . 5.2.4 Email/Name module .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . datab´aze . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
22 27 28 29 30 30 30 31 32 35
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
36 36 36 38 38 38 39
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
6 Z´ avˇ er Pˇ r´ılohy A Instalaˇcn´ı pˇr´ıruˇcka . . . . . . . . . B Uˇzivatelsk´a pˇr´ıruˇcka . . . . . . . . C Sloupce tabulky kontakt˚ u . . . . . C.1 Z´akladn´ı . . . . . . . . . . . C.2 Dostupn´e pˇres implicit-join . D Sloupce tabulky raw kontakt˚ u . . . D.1 Z´akladn´ı . . . . . . . . . . . D.2 Dostupn´e pˇres implicit-join . E Sloupce tabulky dat . . . . . . . . . E.1 Z´akladn´ı . . . . . . . . . . . E.2 Dostupn´e pˇres implicit-join .
40
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
45 45 45 49 50 51 52 52 53 54 54 54
´ 1 Uvod T´ematem t´eto pr´ace je vytvoˇrit u ´ˇcinn´ y a spolehliv´ y n´astroj pro spojov´an´ı kontakt˚ u na platformˇe Android, patˇr´ıc´ıch k jedn´e fyzick´e osobˇe. Hlavn´ı c´ıle pr´ace jsou inteligentn´ı vyhled´av´an´ı kontakt˚ u k propojen´ı, propojov´an´ı kontakt˚ u z v´ıce zdroj˚ u, v neposledn´ı ˇradˇe pak rychlost a jednoduchost aplikace. Kontakty na platformˇe Android v mnoh´em pˇripom´ınaj´ı kontakty na star´ ych telefonech bez operaˇcn´ıho syst´emu. Uˇzivatelsk´e rozhran´ı je sice modernˇejˇs´ı, star´a struktura s dlouh´ ym seznamem kontakt˚ u pod sebou ale v kontaktn´ı aplikaci z˚ ustala. Podstatn´ y rozd´ıl, kromˇe technick´e str´anky, kter´a je probr´ana v n´asleduj´ıc´ı kapitole, je to, ˇze se v zaˇr´ızen´ı s operaˇcn´ım syst´emem Android mohou nach´azet nejen kontakty zadan´e uˇzivatelem v zaˇr´ızen´ı (telefonu, tabletu...), ale i z jin´ ych zdroj˚ u. Tˇemito zdroji mohou b´ yt napˇr´ıklad emailov´e u ´ˇcty, ˇci u ´ˇcty na soci´aln´ıch s´ıt´ıch. Zaˇclenˇen´ı kontakt˚ u z v´ıce zdroj˚ u m´a sv´e v´ yhody, uˇzivatel m´a vˇsechny informace na jednom m´ıstˇe, z jednoho seznamu m˚ uˇze volat, ps´at mail, ˇci naj´ıt kontaktn´ı informace na Facebooku. S v´ yhodami pˇrich´az´ı ale i u ´skal´ı rozdroben´ı informac´ı r˚ uzn´e u ´daje o jedn´e osobˇe jsou v seznamu kontakt˚ u na nˇekolika m´ıstech, podle toho, z jak´eho u ´ˇctu byly importov´any. Na starˇs´ıch zaˇr´ızen´ıch vznikali takov´e kontakty jen chybou pˇri zad´an´ı, nebylo jich tedy mnoho. Na zaˇr´ızen´ıch s operaˇcn´ım syst´emem Android, kde uˇzivatel synchronizuje emailov´e u ´ˇcty ˇci u ´ˇcty na soci´aln´ıch s´ıt´ıch se seznamem kontakt˚ u, jde vˇsak poˇcet takov´ ych kontakt˚ u do des´ıtek, jejich hled´an´ı a ruˇcn´ı spojov´an´ı v seznamu kontakt˚ u o nˇekolika stech poloˇzk´ach je pak nelehk´ ym u ´kolem. Platforma Android m´a pro tuto situaci ˇca´steˇcn´e ˇreˇsen´ı. Vˇsechny vytvoˇren´e nebo importovan´e kontakty kontroluje s jiˇz existuj´ıc´ımi, pˇri pˇresn´e nebo t´emˇeˇr pˇresn´e shodˇe pak nab´ız´ı propojen´ı kontakt˚ u. C´ılem moj´ı pr´ace je pˇrekonat tento syst´em sloˇzitˇejˇs´ım a inteligentnˇejˇs´ım, takov´ ym, kter´ y nalezne naprostou vˇetˇsinu kontakt˚ u patˇr´ıc´ıch ke stejn´e osobˇe.
1.1
C´ıle bakal´ aˇ rsk´ e pr´ ace
1. Prozkoumat existuj´ıc´ı aplikace na propojov´an´ı kontakt˚ u na platformˇe Android a zhodnotit jejich pouˇzitelnost 2. Prozkoumat technick´e detaily pr´ace s kontakty na platformˇe Android. 3. Navrhnout a realizovat aplikaci pro propojov´an´ı kontakt˚ u na platformˇe Android. 1
´ Uvod
1.2
C´ıle aplikace
C´ıle aplikace
1. Propojovat kontakty z v´ıce zdroj˚ u. 2. Vyˇsˇs´ı poˇcet nalezen´ ych kontakt˚ u k propojen´ı neˇz konkurenˇcn´ı aplikace. 3. Schopnost pracovat s kontakty ze soci´aln´ıch s´ıt´ı. 4. Snadn´a rozˇsiˇritelnost aplikace - pˇredevˇs´ım o dalˇs´ı zp˚ usoby kontakt˚ u k propojen´ı 5. Jednoduch´e uˇzivatelsk´e rozhran´ı.
2
2 Existuj´ıc´ı aplikace pro pr´aci s kontakty V t´eto kapitole budou struˇcnˇe vyjmenov´any vybran´e existuj´ıc´ı aplikace pro propojov´an´ı kontakt˚ u na platformˇe Android. Nast´ınˇen bude struˇcn´ y v´ yˇcet jejich vlastnost´ı a moˇznost´ı, na konci pak bude zd˚ uvodnˇena potˇreba vytvoˇren´ı dalˇs´ı aplikace. Pˇri v´ yzkumu moˇznost´ı a schopnost´ı ciz´ıch aplikac´ı jsem vych´azel v´ yhradnˇe z ’ vlastn´ı zkuˇsenosti, nebot zdrojov´ y k´od tˇechto aplikac´ı nen´ı zveˇrejnˇen. Proto se mohou ve v´ yˇctu schopnost´ı a moˇznost´ı vyskytnout chyby, hodnocen´ı tedy nelze povaˇzovat za zcela objektivn´ı.
2.1
Testovan´ e aplikace
Testov´any byly celkem tˇri aplikace. Obecnˇe lze ˇr´ıci, ˇze vˇsechny aplikace maj´ı vˇetˇsinou v´ıce funkc´ı neˇz jen hled´an´ı duplicitn´ıch kontakt˚ u. Tak´e filozofie program˚ u je odliˇsn´a od zad´an´ı a c´ıl˚ u moj´ı bakal´aˇrsk´e pr´ace, prim´arn´ım c´ılem b´ yv´a vˇetˇsinou odstranˇen´ı duplicit. C´ılem t´eto pr´ace je naproti tomu vyuˇz´ıt duplicitn´ıch informac´ı ke slouˇcen´ı v´ıce kontakt˚ u do jednoho, duplicitn´ı data neˇreˇs´ı. Tento pˇr´ıstup sice nemus´ı v´est k u ´spoˇre dat ani k urychlen´ı kontaktn´ı aplikace, uˇsetˇr´ı vˇsak ˇcas uˇzivateli, kter´ y se v kontaktech l´epe vyzn´a. Duplicitn´ı u ´daj totiˇz neb´ yv´a jedin´ ym u ´dajem kontaktu, spolu s n´ım se spoj´ı i dalˇs´ı, jiˇz unik´atn´ı data (viz. obr´azek 2.1). Vˇsechny testovan´e aplikace byly staˇzeny z GooglePlay (hlavn´ı centrum a obchod s aplikacemi na platformˇe Android) a jsou zdarma. Aplikace Duplicate contact manager m´a nˇekter´e nadstandardn´ı funkce placen´e, tyto nebyly testov´any.
2.1.1
Aplikace Merge+
Aplikace Merge+ je jednoduch´a aˇz minimalistick´a aplikace pro propojov´an´ı kontakt˚ u. Dle m´eho n´azoru se jedn´a hlavnˇe o promo na aplikaci Contacts+. Hled´an´ı je rychl´e, ale nalezen´ ych v´ ysledk˚ u nen´ı mnoho. Nav´ıc nelze zvolit v´ ychoz´ı fotku ani jm´eno kontaktu. Uˇzivatelsk´e rozhran´ı aplikace m˚ uˇzeme vidˇet na obr´azku 2.2.
3
Existuj´ıc´ı aplikace pro pr´aci s kontakty
Testovan´e aplikace
Obr´azek 2.1: V´ yhody propojov´an´ı kontakt˚ u.
´ (a) Uvodn´ ı obrazovka.
(b) Seznam nalezen´ ych kontakt˚ u patˇr´ıc´ıch k t´eˇze osobˇe.
Obr´azek 2.2: Aplikace Merge+.
4
Existuj´ıc´ı aplikace pro pr´aci s kontakty
´ (a) Uvodn´ ı obrazovka.
Testovan´e aplikace
(b) V´ ybˇer u ´ˇctu k optima- (c) V´ ysledky hled´an´ı pro lizaci/hled´an´ı. kontakty v telefonu (ruˇcnˇe zadan´e uˇzivatelem).
Obr´azek 2.3: Aplikace Contact Optimizer.
2.1.2
Contact Optimizer
Aplikace Contact Optimizer nab´ız´ı mnohem v´ıce funkc´ı neˇz jen hled´an´ı duplicit a propojov´an´ı kontakt˚ u. Pokud se ale pod´ıv´ame jen na tuto funkˇcnost, v´ ysledky nejsou pˇr´ıliˇs dobr´e. Aplikace hled´a duplicity jen v r´amci jednoho u ´ˇctu (jeden emailov´ yu ´ˇcet, kontakty v telefonu..), nav´ıc nab´ız´ı jen smazat jeden z kontakt˚ u. Propojov´an´ı kontakt˚ u prob´ıh´a oddˇelenˇe v jin´e ˇca´sti programu nazvan´e optimalizace. Zde ovˇsem v´ ysledek v˚ ubec nelze zhodnotit, k propojen´ı jsou nab´ızen´e i kontakty jiˇz d´avno propojen´e, cel´a logika tohoto procesu je tak pochybn´a. Nav´ıc pˇri pˇrepnut´ı na jinou aplikaci a zpˇet je nutno opakovat cel´ y proces od zaˇca´tku, nalezen´e v´ ysledky se nikam neuloˇz´ı. Aplikaci m˚ uˇzeme vidˇet na obr´azku 2.3.
2.1.3
Duplicate Contacts Manager
Dalˇs´ı aplikace s mnoha funkcemi zaujme hned zpoˇc´atku patkov´ ym p´ısmem, pro digit´aln´ı techniku tak netypick´ ym. Na rozd´ıl od pˇredchoz´ı aplikace se vˇetˇsina funkc´ı t´ yk´a hled´an´ı duplicitn´ıch kontakt˚ u. V hled´an´ı duplicit ale program zaost´av´a, pˇri pokusu s modulem Duplicite Contacts Detector nalezl jen nˇekolik m´alo shod dle ˇc´ısla. Vzhled aplikace vid´ıme na obr´azku 2.4.
5
Existuj´ıc´ı aplikace pro pr´aci s kontakty
´ (a) Uvodn´ ı obrazovka.
Shrnut´ı existuj´ıc´ıch aplikac´ı
(b) Nalezen´e v´ ysledky pˇri pouˇzit´ı funkce duplicate contact detector.
Obr´azek 2.4: Aplikace Contact Optimizer.
2.2
Shrnut´ı existuj´ıc´ıch aplikac´ı
Z pr˚ uzkumu aplikac´ı jednoznaˇcnˇe vyplynula potˇreba vytvoˇrit novou aplikaci. Poˇcet nalezen´ ych shod byl ve vˇsech tˇrech programech velmi mal´ y. Nen´ı moˇzn´e to ovˇeˇrit, ale v´ ysledky hled´an´ı nasvˇedˇcovali tomu, ˇze se testuje pouze pˇresn´a shoda nalezen´ ych u ´daj˚ u. D´ale v aplikac´ıch nelze zvolit jm´eno nebo fotku propojen´eho kontaktu. Pr´ace s kontakty poch´azej´ıc´ımi ze s´ıtˇe Facebook pak nen´ı moˇzn´a opˇet v ani jednom z program˚ u. Velk´ ym rozd´ılem, jak jiˇz bylo ˇreˇceno v u ´vodu kapitoly, je rozd´ıln´a filozofie, kdy testovan´e programy aˇz na v´ yjimky duplicity maˇzou, o propojen´ı kontakt˚ u se nesnaˇz´ı. Vˇsechny tyto skuteˇcnosti pak, dle m´eho n´azoru, vedou k potˇrebˇe vytvoˇrit novou aplikaci, zamˇeˇrenou pouze na propojov´an´ı kontakt˚ u, kter´a bude m´ıt tyto schopnosti.
6
3 Pr´ace s kontakty na platformˇe Android Na platformˇe Android jsou v datab´azi kontakt˚ u (tedy v datab´azi kde jsou uloˇzeny data kontakt˚ u) uloˇzeny vˇsechny informace nejen o vˇsech m´ıstn´ıch kontaktech (kontakty v telefonu, nesouvisej´ıc´ı s jinou sluˇzbou), ale i u ´daje z profil˚ u na soci´aln´ıch s´ıt´ıch (Facebook) nebo u ´ˇctech r˚ uzn´ ych sluˇzeb (Google). Tyto kontakty jsou vyuˇz´ıv´any kontaktn´ı a vyt´aˇcec´ı aplikac´ı (dialer application) telefonu, ale tak´e dalˇs´ımi aplikacemi jako jsou emailov´ y klient, programy soci´aln´ıch s´ıt´ı, kalend´aˇr, atd. Pomoc´ı kontakt˚ u je v telefonu uloˇzen dokonce i profil uˇzivatele telefonu. Kontakty jsou na platformˇe Android uloˇzen´e v centr´aln´ım u ´loˇziˇsti dat[9], tedy datab´azi ve kter´e jsou uloˇzena syst´emov´a data telefonu. Aplikace k tomuto u ´loˇziˇsti nemohou pˇristupovat pˇr´ımo, d´ıky ˇcemuˇz je u ´loˇziˇstˇe zabezpeˇcen´e proti maz´an´ı ˇci zneuˇzit´ı dat[14]. K pˇr´ıstupu k tˇemto dat˚ um se pouˇz´ıvaj´ı objekty typu ContentResolver na stranˇe klientsk´e aplikace a objekty typu ContentProvider na stranˇe u ´loˇziˇstˇe dat.[15, 14] Objektem typu content resolver (d´ale jen content resolver) naz´ yv´ame instanci tˇr´ıdy odvozen´e od abstraktn´ı tˇr´ıdy ContentResolver. Obdobnˇe objektem typu content provider (d´ale jen content provider) naz´ yv´ame instanci tˇr´ıdy odvozen´e od abstraktn´ı tˇr´ıdy ContentProvider. Content resolver je automaticky (prostˇrednictv´ım metody getContentResolver v instanci aktivity) obsaˇzen v kaˇzd´e aplikaci[1]. Pro pr´aci s daty je vˇsak tˇreba d˚ ukladnˇe prozkoumat pˇr´ısluˇsn´ y content provider.
3.1
Content Provider
Content provider slouˇz´ı k pˇr´ıstupu ke strukturovan´ ym dat˚ um v centr´aln´ım u ´loˇziˇsti dat. Zapouzdˇruje pˇr´ıstup k dat˚ um, k nimˇz nepˇristupujeme pˇr´ımo, ale jen skrz content provider. Nejˇcastˇeji se vyuˇz´ıv´a pˇri meziprocesov´e komunikaci, kdy na stranˇe u ´loˇziˇstˇe dat stoj´ı objekt content provider, na druh´e stranˇe pak objekt content resolver klientsk´e aplikace. Takov´ y zp˚ usob komunikace zajiˇst’uje konzistentn´ı a bezpeˇcn´ y pˇr´ıstup k dat˚ um. Content provider obdrˇz´ı od content resolveru klientsk´e aplikace poˇzadavky, provede poˇzadovanou akci s daty, a navr´at´ı klientovi v´ ysledky. Content provider zpˇr´ıstupˇ nuje data aplikac´ı v podobˇe tabulek, tak jak jsme 7
Pr´ace s kontakty na platformˇe Android
Content Provider
na to zvykl´ı napˇr´ıklad z relaˇcn´ıch datab´az´ı. Jeden ˇra´dek tak reprezentuje instanci objektu, kter´ y datab´aze uchov´av´a, sloupec pak datov´e pole obsahuj´ıc´ı jeden typ dat.
3.1.1
Pˇ r´ıstup k provideru
Jak bylo naps´ano v´ yˇse, aplikace pˇristupuje k provideru skrze content resolver. Tento objekt m´a metody, kter´e volaj´ı ekvivalentn´ı (i stejnˇe pojmenovan´e) metody provideru[14]. Content resolver nab´ız´ı klasick´e ”CRUD”metody (create, retrieve, update, and delete)[14]. Content resolver v klientsk´e aplikaci a content provider v aplikaci vlastn´ıc´ı pˇr´ıstup k dat˚ um automaticky zvl´adaj´ı meziprocesovou komunikaci. Content provider nav´ıc zajiˇst’uje vrstvu abstrakce pro klientskou aplikaci, kv˚ uli n´ıˇz se data jev´ı jako mnoˇzina tabulek v relaˇcn´ı datab´azi[14]. Typick´ y pˇr´ıstup vypad´a tak jak m˚ uˇzeme vidˇet v k´odu 3.1: resolver.query(uri, projection, selection, selectionArgs, sortOrder)
K´od 3.1: Uk´azka metody query ze tˇr´ıdy contentResolver[14]. kde: • uri urˇcuje jm´eno (cestu) tabulky o kterou m´ame z´ajem - podobnˇe jako SQL FROM • projection urˇcuje sloupce kter´e chceme vr´atit - podobnˇe jako SQL col, col,col • selection a sortOrder urˇcuj´ı o kter´e ˇra´dky tabulky m´ame z´ajem - podobnˇe jako SQL WHERE • sortOrder urˇcuje seˇrazen´ı vr´acen´ ych ˇra´dk˚ u tabulky - SQL ORDER BY
3.1.2
Content URI
Content URI je cesta kter´a identifikuje data v provideru. Content URI se skl´ad´a ze symbolick´eho jm´ena provideru (authority) a z n´azvu tabulky (path).
8
Pr´ace s kontakty na platformˇe Android
Content Provider
ContentResolver nejprve porovn´a jm´eno providera v URI se syst´emovou tabulkou provider˚ u, kter´e jsou k dispozici. N´aslednˇe poˇsle zbyl´e argumenty vˇcetnˇe druh´e ˇca´sti URI vybran´emu provideru. ContentProvider pak vyuˇzije druhou ˇca´st URI - jm´eno tabulky k vybr´an´ı spr´avn´e tabulky.
3.1.3
Z´ısk´ an´ı dat z provideru
K z´ısk´an´ı dat z provideru potˇrebujeme splnit dva pˇredpoklady: 1. zajistit si pr´avo pro pˇr´ıstup 2. sestavit spr´avn´ y dotaz
Z´ısk´ an´ı pˇ r´ıstupov´ ych pr´ av Pro pr´aci s daty pomoc´ı provideru je tˇreba, aby klientsk´a aplikace mˇela pˇr´ısluˇsn´a opr´avnˇen´ı. Tato opr´avnˇen´ı nemohou b´ yt z´ısk´ana za bˇehu aplikace, m´ısto toho je tˇreba si je vyˇza´dat v souboru AndroidManifest.xml patˇr´ıc´ımu ke klientsk´e aplikaci. K tomu se pouˇz´ıv´a element <uses-permission>. Pˇresn´e jm´eno povolen´ı z´avis´ı na tom, jak´ y provider pouˇz´ıv´ame a jak´a pr´ava poˇzadujeme. Tato pr´ava jsou pak poˇzadov´ana pˇri instalaci aplikace, jej´ım schv´alen´ım jsou pak potvrzena.
Vytvoˇ ren´ı dotazu Dotaz vytvoˇr´ıme pˇr´ıkazem z u ´vodu kapitoly (K´od 3.1). V´ yraz, kter´ y urˇcuje jak´e ˇra´dky vr´atit, je rozdˇelen do dvou argument˚ u - selection a selectionArgs. Argument selection je kombinac´ı logick´ ych v´ yraz˚ u. n´azv˚ u sloupc˚ u a hodnot. Hodnoty lze nahradit znakem ? v tomto pˇr´ıpadˇe jsou pak doplnˇeny z pole hodnot SelectionArgs. Toto rozdˇelen´ı, aˇckoliv nen´ı vyˇzadov´ano, zvyˇsuje bezpeˇcnost, nebot’ zamezuje pouˇzit´ı injekt´aˇze pˇr´ıkazu (vloˇzen´ı pˇr´ıkaz˚ u do promˇenn´ ych, kter´e maj´ı doplnit data).
3.1.4
Zobrazen´ı v´ ysledk˚ u dotazu
Metoda ContentResolver.query() vrac´ı vˇzdy Cursor (objekt implementuj´ıc´ı rozhran´ı Cursor, d´ale jen kurzor) obsahuj´ıc´ı u ´daje z tabulky urˇcen´e uri, pˇresnˇeji ty sloupce, kter´e jsou specifikovan´e argumentem projection v ˇr´adc´ıch 9
Pr´ace s kontakty na platformˇe Android
Contact Provider
kter´e jsou urˇcen´e argumenty selection a selectionArgs. Kurzor umoˇzn ˇuje ˇcten´ı dat, kter´e obsahuje. Pomoc´ı kurzoru pak m˚ uˇzeme iterovat skrze navr´acen´a data po ˇra´dc´ıch. Nˇekter´e kurzory dokonce reflektuj´ı zmˇeny ve zdrojov´ ych datech, ˇci na nˇe alespoˇ n upozorˇ nuj´ı. Pro zobrazen´ı dat z kurzoru m˚ uˇzeme: 1. zobrazit data pomoc´ı adapt´eru (tˇr´ıda implementuj´ıc´ı rozhran´ı Adapter), do kter´eho pˇred´ame kurzor jako parametr 2. iterovat kurzorem pˇres metodu moveToNext(), data z´ısk´ame pomoc´ı getString(index) a obdobn´ ych metod (getInt(index)...)
3.1.5
Vkl´ ad´ an´ı, aktualizace a maz´ an´ı dat
Pouˇz´ıvaj´ı se opˇet metody content resolveru, konkr´etnˇe: • ContentResolver.insert() • ContentResolver.update() • ContentResolver.delete()
3.1.6
Kontrakty
Kontraktn´ı tˇr´ıda je tˇr´ıda, kter´a definuje konstanty, kter´e pom´ahaj´ı klientsk´ ym aplikac´ım pracovat s URI, jm´eny sloupc˚ u, a dalˇs´ımi funkcemi content provideru. Kontraktn´ı tˇr´ıdy neexistuj´ı ke content provideru automaticky, v´ yvoj´aˇr pˇr´ısluˇsn´eho provideru je mus´ı implementovat. Mnoho provider˚ u z platformy Android m´a svoje kontaktn´ı tˇr´ıdy v bal´ıˇcku android.provider.
3.2
Contact Provider
Content provider pro pr´aci s kontakty je tˇr´ıda ContactProvider (d´ale jen contact provider). Platforma Android umoˇzn ˇuje ukl´adat do zaˇr´ızen´ı mnoho r˚ uzn´ ych kontaktn´ıch informac´ı, nav´ıc z v´ıce zdroj˚ u. Tomu odpov´ıd´a pomˇernˇe sloˇzit´ y n´avrh organizace tˇechto dat, a velmi ˇsirok´a paleta tˇr´ıd a rozhran´ı pro pˇr´ıstup k dat˚ um.
10
Pr´ace s kontakty na platformˇe Android
Contact Provider
Obr´azek 3.1: Struktura kontakt˚ u na platformˇe Android[9]
3.2.1
Organizace kontakt˚ u
Jak m˚ uˇzeme vidˇet na obr´azku 3.1, existuj´ı tˇri typy dat o kontaktech[9]: 1. Kontakty: ˇra´dky reprezentuj´ı r˚ uzn´e osoby na z´akladˇe spojen´ı ˇr´adk˚ u z tabulky RawContacts. Toto jsou kontakty, kter´e se zobrazuj´ı uˇzivateli v seznamu kontakt˚ u v telefonu. 2. Raw kontakty: ˇra´dky obsahuj´ıc´ı souhrn osobn´ıch dat kontaktu vzeˇsl´ ych z jednoho u ´ˇctu (m´ıstn´ı kontakt, google, facebook. . . ). 3. Data: ˇra´dky reprezentuj´ı jeden kontaktn´ı u ´daj (email, telefon´ı ˇc´ıslo..). Ke kaˇzd´emu z tˇechto typ˚ u tabulek pˇristupujeme pomoc´ı jejich kontraktn´ıch tˇr´ıd. Tyto tˇr´ıdy definuj´ı konstanty pro jm´ena tabulek, sloupc˚ u a dalˇs´ı. Obalovac´ı tˇr´ıda pro vˇsechny kontraktn´ı tˇr´ıdy pro pr´aci s kontakty je tˇr´ıda ContactContract. Kromˇe ContactsContract.Contacts, ContactsContract.Data a ContactsContract.RawContacts existuj´ı jeˇstˇe dalˇs´ı kontraktn´ı tˇr´ıdy. Jsou to napˇr´ıklad pomocn´e tabulky, kter´e contact provider pouˇz´ıv´a k ˇr´ızen´ı sv´ ych ˇcinnost´ı nebo k podpoˇre specifick´ ych funkc´ı telefonn´ıch aplikac´ı.
11
Pr´ace s kontakty na platformˇe Android
3.2.2
Contact Provider
Raw contacty
Raw kontakt obsahuje vˇsechna data vztahuj´ıc´ı se k jedn´e osobˇe na jednom u ´ˇctu (´ uˇcet je napˇr
[email protected], nebo m´ıstn´ı kontakt). Toto tvrzen´ı nemus´ı b´ yt pˇresn´e pokud m´a uˇzivatel na u ´ˇctu duplicitn´ı kontakty, pak je na jednom u ´ˇctu v´ıce raw kontakt˚ u pro jednu osobu. Protoˇze contact provider umoˇzn ˇuje pouˇz´ıvat v´ıce u ´ˇct˚ u jako zdroj˚ u kontaktn´ıch dat, m˚ uˇzeme m´ıt v´ıce raw kontakt˚ u vztahuj´ıc´ıch se k jedn´e fyzick´e osobˇe. Tak´e je moˇzn´e kombinovat data z v´ıce u ´ˇct˚ u stejn´eho typu (
[email protected].,
[email protected]), u ´daj z kaˇzd´eho takov´eho u ´ˇctu m´a tak´e sv˚ uj raw kontakt, i kdyˇz jde o stejnou osobu. Vˇetˇsina osobn´ıch dat vˇsak nen´ı uloˇzena v tabulce raw kontakt˚ u. Nach´az´ı se totiˇz v tabulce dat. Kaˇzd´ y ˇr´adek z t´eto tabulky pak obsahuje sloupec Data.RAW CONTACT ID, ve kter´em je uloˇzeno RawContacts. ID, kter´e ukazuje na pˇr´ısluˇsn´ y raw kontakt - tedy na ˇra´dek v tabulce raw kontakt˚ u. D˚ uleˇzit´e sloupce tabulky rawContacts: • ACCOUNT NAME - Jm´eno u ´ˇctu ze kter´eho poch´azej´ı data pro raw kontakt. Napˇr´ıklad emailov´a adresa pro u ´ˇcet na googlu. ´ˇctu, ze kter´eho poch´az´ı data pro raw kontakt. Napˇr´ıklad • ACCOUNT TYPE - Typ u com.google pro google u ´ˇcet. • DELETED - Znaˇcka urˇcuj´ıc´ı, zdali je kontakt platn´ y. Slouˇz´ı k synchronizaci s online sluˇzbami (aby byl kontakt smaz´an i z cloudu). V´ yˇcet vˇsech sloupc˚ u tabulky ContactsContract.RawContacts dostupn´ ych pˇres contact provider je uveden v pˇr´ıloze D.
3.2.3
Data
V tabulce ContactsContract.Data jsou uloˇzen´a v ˇra´dc´ıch jednotliv´a data, kter´a jsou s raw kontaktem spojena pomoc´ı sloupce ID. Takov´e uspoˇra´d´an´ı umoˇzn ˇuje, aby mˇel jeden raw kontakt v´ıce dat stejn´eho typu, tedy napˇr. v´ıce telefonn´ıch ˇc´ısel. V tabulce jsou uloˇzeny vˇsechny typy dat, kter´e by mohly ke kontaktu patˇrit, jako zobrazovan´e jm´eno, telefonn´ı ˇc´ıslo, email, adresa nebo fotografie. Aby nemˇela tabulka ContactsContract.Data pˇr´ıliˇs mnoho sloupc˚ u pro potˇreby r˚ uzn´ ych druh˚ u dat, m´a jen nˇejak´e sloupce pro urˇcen´ y typ z´aznamu, a zbyl´e s generick´ ym jm´enem, tedy pro libovoln´a data. 12
Pr´ace s kontakty na platformˇe Android
Contact Provider
Sloupce s urˇcen´ ym obsahem: y spojuje data s raw kontaktem. • RAW CONTACT ID: Identifik´ator, kter´ • MIMETYPE: Typ dat v ˇra´dku. Pouˇz´ıv´a se MIME type, typy jsou definovan´e v kontraktn´ı tˇr´ıdˇe ContactsContract.CommonDataKinds. • IS PRIMARY: Znaˇc´ı, jestli jsou data v r´amci raw kontaktu prim´arn´ı. M´a to v´ yznam v pˇr´ıpadˇe, ˇze jeden raw kontakt ukazuje na v´ıce instanc´ı stejn´eho typu dat (v´ıce telefonn´ıch ˇc´ısel, mail˚ u. . . ). D´ale je v tabulce 15 sloupc˚ u pro generick´a data pojmenovan´ ych DATA1 aˇz DATA15 a dalˇs´ı 4 generick´e sloupce SYNC1 aˇz SYNC4, kter´e by mˇely b´ yt pouˇzity pouze adapt´ery pro synchronizaci. K tˇemto sloupc˚ um lze vˇzdy pˇristupovat pomoc´ı generick´eho jm´ena, bez ohledu na to, kter´ y datov´ y typ obsahuj´ı. Stejnˇe tak lze ale k pol´ım pˇristupovat pomoc´ı konstant z kontraktn´ıch tˇr´ıd konkr´etn´ıch typ˚ u dat. Sloupec DATA1 je indexov´an. Contacts Provider pouˇz´ıv´a tento sloupec pro data, kter´a b´ yvaj´ı poˇzadov´ana nejˇcastˇeji (pokud se tedy jedn´a o email, obsahuje emailovou adresu). Podle konvence je sloupec DATA15 rezervov´an pro Binary Large Object (BLOB), coˇz jsou napˇr´ıklad n´ahledy fotek. V´ yˇcet vˇsech sloupc˚ u tabulky ContactsContract.Data dostupn´ ych pˇres contact provider je uveden v pˇr´ıloze E. Jak bylo jiˇz zm´ınˇeno v´ yˇse, jm´ena generovan´ ych sloupc˚ u dle typu dat lze naj´ıt v pˇr´ısluˇsn´ ych kontraktn´ıch tˇr´ıd´ach. Tyto kontraktn´ı tˇr´ıdy jsou definov´any ve tˇr´ıdˇe ContactsContract.CommonDataKinds. Konstanty v kontaktn´ıch tˇr´ıd´ach pom´ahaj´ı pˇri identifikaci sloupc˚ u v k´odu. Jak to funguje, pˇribl´ıˇz´ı obr´azek 3.2. Napravo je vidˇet jeden ˇra´dek tabulky Data, tak jak je uloˇzen v datab´azi, nalevo je pak jeho interpretace pomoc´ı konstant ze tˇr´ıdy ContactsContract.CommonDataKinds.Email ˇ ymi datov´ Cast´ ymi typy jsou: • ContactsContract.CommonDataKinds.StructuredName • ContactsContract.CommonDataKinds.Phone • ContactsContract.CommonDataKinds.Email • ContactsContract.CommonDataKinds.Photo • ContactsContract.CommonDataKinds.GroupMembership 13
Pr´ace s kontakty na platformˇe Android
Contact Provider
Obr´azek 3.2: Struktura jednoho ˇra´dku v tabulce data[9]
3.2.4
Kontakty
Kontakt kombinuje vˇsechny raw contacty vˇsech typ˚ u a jmen u ´ˇct˚ u. T´ım zobraz´ı vˇsechna uloˇzen´a data o jedn´e fyzick´e osobˇe. Contacts provider se star´a o vytvoˇren´ı nov´ ych ˇra´dek tabulky kontakt˚ u, a spojov´an´ı raw kontakt˚ u pod jedn´ım ˇr´adkem v tabulce contact. Aplikace ani adapt´ery synchronizace nemohou pˇrid´avat kontakty do tabulky contact, nav´ıc nˇekter´e sloupce tabulky jsou jen ke ˇcten´ı[9] . Contacts Provider vytv´aˇr´ı nov´ y kontakt v pˇr´ıpadˇe, ˇze byl vytvoˇren nov´ y raw kontakt, kter´ y nepatˇr´ı k ˇza´dn´emu z existuj´ıc´ıch kontakt˚ u. Provider vytvoˇr´ı nov´ y kontakt tak´e tehdy, pokud se raw kontakt zmˇen´ı takov´ ym zp˚ usobem, ˇze uˇz nem˚ uˇze b´ yt pˇriˇrazen k souˇcasn´emu kontaktu. Pokud aplikace nebo adapt´er pro synchronizaci vytvoˇr´ı nov´ y raw kontakt, kter´ y lze pˇriˇradit k existuj´ıc´ımu kontaktu, nov´ y kontakt se nevytv´aˇr´ı. Contacts provider pˇripojuje kontakt k raw kontaktu pomoc´ı sloupce ID v tabulce ContactsContract.Contacts, sloupec CONTACT ID v tabulce raw kontakt˚ u ContactsContract.RawContacts obsahuje hodnoty ID, kter´e ukazuj´ı na pˇr´ısluˇsn´ y ˇr´adek tabulky kontakt˚ u. Tabulka kontakt˚ u m´a tak´e sloupec LOOKUP KEY, kter´ y je permanentn´ım odkazem na jeden z´aznam v tabulce kontakt˚ u. To je nutn´e z toho d˚ uvodu, ˇze contact provider m˚ uˇze zmˇenit ID kontaktu na z´akladˇe sluˇcov´an´ı raw kontakt˚ u nebo dalˇs´ıch
14
Pr´ace s kontakty na platformˇe Android
Contact Provider
Obr´azek 3.3: Vz´ajemn´ y vztah kontakt˚ u raw kontakt˚ u a dat[9] zmˇen automaticky. I kdyˇz se to stane, content URI CONTENT LOOKUP URI v yˇz kontakt. Tento kombinaci s LOOKUP KEY kontaktu bude st´ale odkazovat na tent´ sloupec m´a form´atov´an´ı nez´avisl´e na sloupci ID. V´ yˇcet dalˇs´ıch sloupc˚ u tabulky ContactsContract.Contacts dostupn´ ych pˇres contact provider je uveden v pˇr´ıloze C. Na obr´azku 3.3 vid´ıme opˇet vztah vˇsech tˇr´ı tabulek. V telefonu (patˇr´ıc´ımu Emily Dickinsonov´e) se nach´az´ı kontakt Thomas Higginson. Tento kontakt v sobˇe sluˇcuje tˇri raw kontakty, kter´e se vˇsechny vztahuj´ı k osobˇe Thomase Higginsona. Dva poch´az´ı z Emilyn´ ych u ´ˇct˚ u na gmailu, jeden z twitteru. Kaˇzd´ y z tˇechto raw kontakt˚ u pak ukazuje na nˇekolik ˇr´adk˚ u v tabulce data (posledn´ı blok dole). Jeden ze tˇr´ı raw kontakt˚ u tak obsahuje hned tˇri emaily (na tut´eˇz osobu).
3.2.5
Opr´ avnˇ en´ı potˇ rebn´ a pro pr´ aci s kontakty
Aplikace, kter´e chtˇej´ı pouˇz´ıvat contacts provider, mus´ı poˇza´dat pˇri instalaci o n´asleduj´ıc´ı pr´ava: • pro ˇcten´ı kontakt˚ u: android.permission.READ CONTACTS • pro z´apis do tabulky kontakt˚ u: android.permission.WRITE CONTACTS
15
Pr´ace s kontakty na platformˇe Android
Contact Provider
Tato pr´ava je tˇreba uv´est do souboru AndroidManifest.xml (do koˇrenov´eho elementu)
3.2.6
Propojov´ an´ı kontakt˚ u
Propojen´ım kontakt˚ u na platformˇe Android rozum´ıme proces, kdy spoj´ıme dva ˇci v´ıce raw kontakt˚ u pod jeden kontakt. Syst´em Android takto spojuje nebo nab´ız´ı ke spojen´ı kontakty, kter´e povaˇzuje za shodn´e - patˇr´ıc´ı ke stejn´e osobˇe. Kontakty sluˇcuje, pokud plat´ı jedna z n´asleduj´ıc´ıch podm´ınek[22]: 1. Souhlas´ı jm´eno i pˇr´ıjmen´ı. 2. Souhlas´ı jm´eno i pˇr´ıjmen´ı, liˇs´ı se poˇrad´ı jm´ena a pˇr´ıjmen´ı. 3. Pˇr´ıjmen´ı souhlas´ı, kˇrestn´ı jm´eno je zkr´acen´e (je vˇsak d˚ uvod se domn´ıvat ˇze tato funkcionalita je omezen´a jen pro angliˇctinu, nebo nˇekolik hlavn´ıch svˇetov´ ych jazyk˚ u, pro ˇceˇstinu nefunguje). 4. Souhlas´ı pˇr´ıjmen´ı nebo jm´eno, a z´aroveˇ n m´a jeden z kontakt˚ u jen jm´eno nebo pˇr´ıjmen´ı a z´aroveˇ n souhlas´ı telefonn´ı ˇc´ıslo nebo mail. 5. Jeden z kontakt˚ u nem´a jm´eno ani pˇr´ıjmen´ı a souhlas´ı mail nebo telefonn´ı ˇc´ıslo. Pˇr´ısluˇsn´a pole kter´a je tˇreba zmˇenit, abychom kontakty propojili z vlastn´ı aplikace, nejsou bohuˇzel pˇres content provider dostupn´a. Jedin´ ym ˇreˇsen´ım, jak kontakty manu´alnˇe spojit je tabulka AggregationExceptions.
Aggregation Exceptions Aggregation exceptions je tabulka obsahuj´ıc´ı identifik´atory dvojic raw kontakt˚ u, jejichˇz propojov´an´ı nem´a prob´ıhat automaticky. Ke kaˇzd´e dvojici je ve tˇret´ım sloupci tabulky pˇriˇrazena jedna ze tˇr´ı hodnot[11]: • TYPE AUTOMATIC: Propojov´an´ı prob´ıh´a automaticky, ˇr´ıd´ı ho contact provider. • TYPE KEEP SEPARATE: Kontakty se nepropoj´ı, pˇresto ˇze by contact provider nalezl shodu.
16
Pr´ace s kontakty na platformˇe Android
Nedostatky v ofici´aln´ı dokumentaci
• TYPE KEEP TOGETHER: Kontakty se ihned spoj´ı a z˚ ustanou propojen´e, dokud je uˇzivatel nerozpoj´ı (a tento z´aznam se tak smaˇze). Kontraktn´ı tˇr´ıdou pro tuto tabulku je tˇr´ıda AggregationException. Slouˇcen´ı kontakt˚ u v Aplikaci se pak provede napˇr´ıklad tak jak to vid´ıme v k´odu 3.2: ContentValues cv = new ContentValues(); cv.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); cv.put(AggregationExceptions.RAW_CONTACT_ID1, rawKontaktIdKontaku1); cv.put(AggregationExceptions.RAW_CONTACT_ID2, rawKontakIdKontaku2); getContentResolver().update(AggregationExceptions.CONTENT_URI, cv, null, null);
K´od 3.2: Pˇr´ıklad k´odu pro slouˇcen´ı dvou kontakt˚ u [26].
3.3
Nedostatky v ofici´ aln´ı dokumentaci
Pˇrestoˇze je dokumentace platformy Android velice obs´ahl´a a pˇrehledn´a, nˇekter´e podstatn´e aspekty pr´ace s kontakty tam pops´any nejsou. Pr´avˇe tˇemto nezdokumentovan´ ym t´emat˚ um bude vˇenov´ana n´asleduj´ıc´ı ˇca´st bakal´aˇrsk´e pr´ace.
3.3.1
Pr´ ace s kontakty z Facebooku
Pokud pˇri dotazov´an´ı na kontakty pˇres contact provider neuvedeme parametr selection (respektive zavol´ame metodu ContentResolver.query s parametrem selection = null), mˇel by n´am contact provider vr´atit kurzor se vˇsemi kontakty. Ve skuteˇcnosti vˇsak vr´at´ı vˇsechny kontakty s v´ yjimkou kontakt˚ u poch´azej´ıc´ıch z Facebooku[20, 17]. Vlastn´ım pr˚ uzkumem v datab´azi kontakt˚ u jsem dospˇel k z´avˇeru, ˇze je za to zody je u kontakt˚ u z Facebooku nastaven na povˇedn´ y sloupec is restricted, kter´ hodnotu jedna. Tento sloupec je skryt´ y, contact provider jeho obsah neposkytuje, uˇzivatel ani program´ator se tak o existenci takov´eho sloupce v˚ ubec nedozv´ı, dokud se nepod´ıv´a pˇr´ımo do datab´aze kontakt˚ u (kter´a je na bˇeˇzn´em zaˇr´ızen´ı nepˇr´ıstupn´a). D˚ uvod tohoto omezen´ı ani jeho existence nejsou ofici´alnˇe zn´ami, z r˚ uzn´ ych zdroj˚ u[3, 16] lze vˇsak dovodit, ˇze se moˇzn´a jedn´a o neveˇrejnou dohodu mezi spoleˇcnost´ı Google a Facebook. 17
Pr´ace s kontakty na platformˇe Android
Nedostatky v ofici´aln´ı dokumentaci
S kontakty z Facebooku tak nelze na bˇeˇzn´em zaˇr´ızen´ı s operaˇcn´ım syst´emem Android v˚ ubec pracovat. Jedinou moˇznost´ı je kontakty nejprve odemknout v datab´azi. Takov´e ˇreˇsen´ı je vˇsak dostupn´e pouze na zaˇr´ızen´ı, kde m´a uˇzivatel administr´atorsk´a pr´ava (standardnˇe prod´avan´a zaˇr´ızen´ı nemaj´ı administr´atorsk´a pr´ava, pro jejich z´ısk´an´ı je tˇreba nakonfigurovat zaˇr´ızen´ı pomoc´ı PC). Zaj´ımavost´ı d´ale m˚ uˇze b´ yt to, ˇze defaultn´ı kontaktn´ı aplikace telefonu pˇr´ıstup ke kontakt˚ um Facebooku maj´ı (pokud uˇzivatel nastavil synchronizaci se sluˇzbou Facebook). Ze zdrojov´eho k´odu je vˇsak patrn´e, ˇze dotaz prostˇrednictv´ım content resolveru je zcela standardn´ı. Rozpozn´avac´ı mechanismus tak bude pˇr´ımo v provideru, coˇz je logick´e i z hlediska bezpeˇcnosti, nebot’ takov´ y syst´em nelze obej´ıt.
3.3.2
Zmˇ ena n´ azvu kontaktu
Ze specifikace kontraktn´ı tˇr´ıdy pro tabulku kontakt˚ u je zˇrejm´e, ˇze vˇetˇsina pol´ı v t´eto tabulce je pouze ke ˇcten´ı, mˇenit je nelze[12]. To je pˇrek´aˇzkou v pˇr´ıpadˇe ˇze chceme u propojen´ ych kontakt˚ u urˇcit zobrazovanou fotku a n´azev (tedy chtˇeli bychom zmˇenit pole photo id a neme raw contact id). Z dokumentace kontraktn´ı tˇr´ıdy pro tabulku data ale vypl´ yv´a, ˇze by mˇelo b´ yt moˇzn´e prim´arn´ı kontakt pro fotku stejnˇe jako pro n´azev zast´ınit pomoc´ı sloupce is super primary[13]. Tento postup funguje pro kontaktn´ı fotku, pro n´azev je ale hodnota sloupce ignorov´ana. Nelze tak ani t´ımto zp˚ usobem urˇcit, ze kter´eho z kontakt˚ u se vybere zobrazovac´ı jm´eno pro propojen´ y kontakt. Tento probl´em uˇz je navrhnut k ˇreˇsen´ı nejm´enˇe od roku 2010[7], st´ale ale nen´ı vyˇreˇsen.
18
4 Struktura aplikace Vyhotoven´a aplikace d˚ uslednˇe pouˇz´ıv´a tˇr´ıvrstvou architekturu. Byla vybr´ana z d˚ uvodu snadn´e orientace ve zdrojov´em k´odu a snazˇs´ı nahraditelnosti jednotliv´ ych ˇca´st´ı. D´ale toto rozdˇelen´ı znaˇcnˇe usnadˇ nuje platforma Android, kter´a m´a vytvoˇren´e dobr´e z´azem´ı pro prezentaˇcn´ı vrstvu aplikac´ı. Zjednoduˇsen´e rozdˇelen´ı do tˇr´ı vrstev m˚ uˇzeme vidˇet na obr´azku 4.1. Aplikace byla nazv´ana prost´ ym anglick´ ym pˇrekladem Contact Merge. Hlavn´ı ˇ ikonu aplikace vytvoˇrila Veronika Cesalov´a (Chelsea College of Art - Lond´ yn). Defeultn´ı ikona kontaktu poch´az´ı ze str´anek www.iconfinder.com[10], kde je k dispozici voln´emu pouˇzit´ı.
4.1
Prezentaˇ cn´ı vrstva
Prezentaˇcn´ı vrstva je, jak je tomu na platformˇe Android obvykl´e, tvoˇrena tˇr´ıdami odvozen´ ymi od tˇr´ıdy android.app.Activity (d´ale jen aktivita). Kaˇzd´a aktivita zastupuje jeden pohled na aplikaci. Mezi tˇemito pohledy se pohybujeme pomoc´ı tlaˇc´ıtek uˇzivatelsk´eho rozhran´ı (d´ale UI). Aplikace Contact Merge obsahuje ˇsest aktivit. Kaˇzd´a bude kr´atce probr´ana n´ıˇze. Cel´e sch´ema presenˇcn´ı vrstvy z pohledu uˇzivatele se nach´az´ı na obr´azku B.1 v pˇr´ıloh´ach.
4.1.1
Fragmenty
V uˇzivatelsk´em rozhran´ı je na mnoha m´ıstech pouˇzito takzvan´ ych fragment˚ u. Tyto tˇr´ıdy dostupn´e od API 11[18] znaˇcnˇe zjednoduˇsuj´ı moˇznost v budoucnu optimalizovat aplikaci pro zaˇr´ızen´ı s vˇetˇs´ımi displayi, napˇr´ıklad tablety[5]. Dva fragmenty, kter´e jsou na telefonu ve dvou aktivit´ach m˚ uˇzeme d´at na tabletu do jedn´e aktivity vedle sebe, jak je vidˇet na obr´azku 4.2. Takov´e pouˇzit´ı je moˇzn´e napˇr´ıklad u tˇr´ıd ResultListFragment a ResultDetailFragment. Tˇr´ıda ResultListFragment dˇed´ı od speci´aln´ı tˇr´ıdy ListFragment, kter´a je protˇejˇskem tˇr´ıdy ListActivity pro fragmenty[5]. Zat´ım rozhran´ı aplikace pro v´ıce velikost´ı obrazovky optimalizov´ano nen´ı, cesta pro to, aby to tak v budoucnu bylo, je ale d´ıky fragment˚ um pˇripraven´a.
19
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.1: Struktura aplikace Contact Merge.
20
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.2: V´ yhoda pouˇzit´ı fragment˚ u[19]
4.1.2
Vynech´ an´ı aktivit z historie
Bˇeˇzn´e aplikace na platformˇe android maj´ı hierarchickou strukturu. Tlaˇc´ıtko zpˇet pak v takov´e aplikaci vede k nadˇrazen´e aktivitˇe, pˇr´ıpadnˇe zav´ır´a celou aplikaci. V aplikaci Contact Merge je vˇsak pˇr´ıtomna i line´arn´ı struktura, od u ´vodn´ı aktivity pˇres aktivitu hled´an´ı aˇz k aktivitˇe nalezen´ ych v´ ysledk˚ u (viz. obr B.1 v pˇr´ıloh´ach). Pˇri navigaci pomoc´ı tlaˇc´ıtka zpˇet se v takov´em pˇr´ıpadˇe nˇekdy nechceme dostat na pˇredchoz´ı aktivitu. Napˇr´ıklad dostat se z aktivity nalezen´ ych v´ ysledk˚ u k aktivitˇe hled´an´ı ned´av´a ˇza´dn´ y smysl. Tento probl´em se nejl´epe ˇreˇs´ı deklarativn´ı cestou v souboru AndroidManifest.xml, jak je vidˇet v k´odu 4.1 (atribut noHistory).
K´od 4.1: Nastaven´ı aktivity tak, aby byla ignorov´ana pˇri navigaci pomoc´ı tlaˇc´ıtka zpˇet.
21
Struktura aplikace
Prezentaˇcn´ı vrstva
´ Obr´azek 4.3: Uvodn´ ı aktivita aplikace Contact Merge.
4.1.3
Struˇ cn´ y popis aktivit
´ Uvodn´ ı aktivita ´ Uvodn´ ı aktivitu m˚ uˇzeme vidˇet na obr´azku 4.3. Zde m´a uˇzivatel moˇznost vybrat, jak´e zp˚ usoby hled´an´ı chce pouˇz´ıt. Zp˚ usoby jsou rozdˇeleny do modul˚ u, z nichˇz kaˇzd´ y bude porovn´avat jin´ y typ dat, nebo stejn´ y typ, ale z´asadnˇe odliˇsn´ ym zp˚ usobem. V´ıce zaˇskrtnut´ ych modul˚ u znamen´a v´ıce ˇcasu pro bˇeh programu, ale tak´e m˚ uˇze znamenat lepˇs´ı v´ ysledky. Kaˇzd´ y modul se d´a konfigurovat v nastaven´ı modulu, do kter´eho se dostaneme po klepnut´ı na n´azev modulu. Moduly se naˇc´ıtaj´ı do seznamu z aplikaˇcn´ı vrstvy, m˚ uˇzeme tedy pˇridat dalˇs´ı aniˇz bychom zasahovali do UI. Tlaˇc´ıtkem v doln´ı ˇca´sti obrazovky zapoˇcne hled´an´ı dle n´ami navolen´e konfigurace. Tlaˇc´ıtkem unlock facebook contacts pak m˚ uˇzeme na telefontech s administr´atorsk´ ymi pr´avy odemknout kontakty ze s´ıtˇe Facebook (nutnost odemˇcen´ı byla pops´ana v teoretick´e ˇc´asti v kapitole 3.3.1, realizace d´ale v kapitole 4.3.3). V t´eto aktivitˇe se pˇri spuˇstˇen´ı (v metodˇe onCreate) inicializuje ModuleManager a RootManager (jejich funkce pops´ana d´ale). Pˇri startu ak22
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.4: Aktivita nastaven´ı. tivity je tˇreba zjistit, zdali uˇz oba managery neexistuj´ı, pˇri opakovan´e inicializaci by doˇslo k v´ yjimce. Takov´e situace m˚ uˇze nastat napˇr´ıklad pokud uˇzivatel otoˇc´ı telefon a operaˇcn´ı syst´em se pokus´ı zobrazit aktivitu na ˇs´ıˇrku“ [2]. ” Aktivita nastaven´ı modulu Tato aktivita slouˇz´ı pro konfiguraci modulu. Modul by mˇel b´ yt defaultnˇe nakonfigurov´an tak, aby naˇsel co nejv´ıce v´ ysledk˚ u, ale nˇekter´e zp˚ usoby hled´an´ı, kter´e jsou pˇr´ıliˇs n´aroˇcn´e na ˇcas nebo pˇrin´aˇsej´ı faleˇsn´e kandid´aty na spojen´ı (program navrhne spojit kontakty, kter´e nepatˇr´ı k t´eˇze osobˇe), mohou b´ yt implicitnˇe vypnuty. Na obr´azku 4.4 vid´ıme pouze jednu moˇznost s checkboxem, ale aplikace je navrˇzena tak, aby pˇrid´an´ı dalˇs´ıch voleb bylo snadn´e. Vˇsechna nastaven´ı jsou totiˇz uloˇzena v modulech (v aplikaˇcn´ı vrstvˇe). M˚ uˇzeme tak podobnˇe jako u modul˚ u pˇridat dalˇs´ı, aniˇz bychom zasahovali do prezentaˇcn´ı vrstvy.
Aktivita hled´ an´ı kontakt˚ u ke slouˇ cen´ı Tato aktivita zobrazuje po dobu sv´eho bˇehu dialog s informacemi o pr˚ ubˇehu hled´an´ı. Proces hled´an´ı bˇeˇz´ı v samostatn´em vl´aknˇe, tedy nedoch´az´ı k zamrznut´ı UI 23
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.5: Aktivita sluˇcov´an´ı kontakt˚ u: 1) indik´ator celkov´eho postupu; 2) stavov´ y ˇra´dek postupu - zobrazuje jm´eno bˇeˇz´ıc´ıho modulu; 3) indik´ator postupu modulu; 4) stavov´ y ˇra´dek modulu - zobrazuje ˇcinnost kterou modul vykon´av´a; 5) indik´ator postupu pr´avˇe vykon´avan´e ˇcinnosti. v dobˇe v´ ypoˇctu. Pro multithreading je pouˇzit´a metoda/tˇr´ıda asyncTask[4]. Realizace byla inspirov´ana n´avodem na serveru codingforandroid.com.[8]. Uˇzivatelsk´e rozhran´ı aktivity vid´ıme na obr´azku 4.5.
Aktivita v´ ysledk˚ u hled´ an´ı V t´eto aktivitˇe se zobrazuj´ı v´ ysledky hled´an´ı. Celou aktivitu vid´ıme na obr´azku 4.6. Checkbox vlevo urˇcuje, zdali chceme, aby po stisku tlaˇc´ıtka v doln´ı ˇca´sti doˇslo ke spojen´ı kontakt˚ u. V prav´e ˇc´asti jsou pod sebou jm´ena obou kontakt˚ u urˇcen´ ych ke spojen´ı. Pokud by n´am jm´ena k identifikaci nestaˇcila, dostaneme se po kliknut´ı k detail˚ um obou kontakt˚ u.
Aktivita detail kontaktu V t´eto aktivitˇe se zobrazuje detail jednoho kontaktu. Do aktivity se dostaneme po klepnut´ı na ˇra´dek seznamu v´ ysledk˚ u. Celou aktivitu vid´ıme na obr´azku 4.7. Po pouˇzit´ı tlaˇc´ıtka merge contacts se dostaneme na aktivitu individu´aln´ıho propojen´ı 24
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.6: Aktivita v´ ysledk˚ u hled´an´ı. kontakt˚ u, tlaˇc´ıtko discard n´as vr´at´ı zpˇet do seznamu kandid´at˚ u k propojen´ı, z kter´eho bude odstranˇena poloˇzka v jej´ımˇz detailu jsme se nach´azeli.
Aktivita individu´ aln´ıho propojen´ı kontakt˚ u V t´eto aktivitˇe doch´az´ı ke slouˇcen´ı jedn´e dvojice kontakt˚ u. Nejprve vybereme jm´eno a fotku kontaktu, pak klikneme na tlaˇc´ıtko ok. Vlastn´ı sluˇcov´an´ı kontakt˚ u prob´ıh´a v samostatn´em vl´aknˇe, nedoch´az´ı proto ke zpomalen´ı uˇzivatelsk´eho rozhran´ı. Celou aktivitu vid´ıme na obr´azku 4.8.
Aktivita sluˇ cov´ an´ı v´ıce kontakt˚ u Do t´eto aktivity se dostaneme po klepnut´ı na tlaˇc´ıtko merge selected v seznamu nalezen´ ych v´ ysledk˚ u. Zobrazuj´ı se zde vˇsichni kandid´ati k propojen´ı, kter´e jsme zaˇskrtli v aktivitˇe v´ ysledk˚ u. Po kliknut´ı na ˇra´dek v seznamu dojde k rozbalen´ı detail˚ u dvojice kontakt˚ u. Zde m´ame moˇznost zvolit n´azev kontaktu a fotku. Po kliknut´ı na tlaˇc´ıtko start merging dojde ke slouˇcen´ı vˇsech kontakt˚ u v seznamu dle naˇseho nastaven´ı. Cel´a operace prob´ıh´a ve zvl´aˇstn´ım vl´aknˇe, nedoch´az´ı tak ke zpomalov´an´ı UI. Celou aktivitu vid´ıme na obr´azku 4.9. Pro tvorbu rozbalovac´ıho seznamu byl pouˇzit n´avod ze str´anky androidhive.info[27]. 25
Struktura aplikace
Prezentaˇcn´ı vrstva
Obr´azek 4.7: Aktivita detail kontaktu.
Obr´azek 4.8: Aktivita individu´aln´ıho propojen´ı kontakt˚ u.
26
Struktura aplikace
Aplikaˇcn´ı vrstva
Obr´azek 4.9: Aktivita propojov´an´ı v´ıce kontakt˚ u najednou. V obou aktivit´ach je pouˇzit´ y pro v´ ybˇer n´azvu a jm´ena prvek obecnˇe zn´am´ y jako radio button. Um´ıstit do tohoto prvku m´ısto textu obr´azek, jak bylo potˇreba u v´ ybˇeru fotografie se uk´azalo jako n´aroˇcn´ y u ´kol. Nakonec byl probl´em vyˇreˇsen pomoc´ı nastaven´ı vlastnosti drawableRight tˇr´ıdy radioButton[28]. Dalˇs´ım probl´emem byla skuteˇcnost, ˇze obr´azky kontakt˚ u jsou v zaˇr´ızen´ı uloˇzeny ve velmi mal´ ych rozmˇerech. K jejich zvˇetˇsen´ı byla pouˇzita metoda nalezen´a na str´ance StackOverflov[25].
4.2
Aplikaˇ cn´ı vrstva
Aplikaˇcn´ı vrstva se skl´ad´a ze tˇr´ıdy ModulManager, kter´a ˇr´ıd´ı cel´ y proces hled´an´ı kontakt˚ u, a jednotliv´ ych modul˚ u, kter´e hled´an´ı prov´adˇej´ı. D´ale jsou zde vl´akna ˇreˇs´ıc´ı asynchronn´ı procesy hled´an´ı a sluˇcov´an´ı kontakt˚ u. Manaˇzer modul˚ u je zodpovˇedn´ y za to, v jak´em poˇrad´ı jsou moduly vol´any, a tak´e napˇr´ıklad za to, ˇze bˇeˇz´ı jen ty moduly, kter´e uˇzivatel zaˇskrtl v u ´vodn´ı aktivitˇe. Tˇr´ıda je implementov´ana jako singleton, aby nebylo tˇreba pˇred´avat odkaz na instanci napˇr´ıˇc aplikac´ı. Jednotliv´e moduly pak prov´adˇej´ı hled´an´ı, pˇri kter´em ˇcerpaj´ı u ´daje z datov´e vrstvy, a n´aslednˇe do n´ı ukl´adaj´ı nalezen´e kandid´aty na spojen´ı. 27
Struktura aplikace
Aplikaˇcn´ı vrstva
Obr´azek 4.10: Moduly hled´an´ı - Diagram tˇr´ıd
4.2.1
Syst´ em vyhled´ avac´ıch modul˚ u
Syst´em vyhled´avac´ıch modul˚ u byl ˇreˇsen s d˚ urazem na snadnou rozˇsiˇritelnost. Maximum moˇzn´eho k´odu se nach´az´ı v nadˇrazen´ ych abstraktn´ıch tˇr´ıd´ach - pro vytvoˇren´ı nov´eho tak nen´ı tˇreba mnoho ˇcasu. Strukturu modul˚ u m˚ uˇzeme vidˇet na obr´azku 4.10. Z´akladn´ı tˇr´ıdou je tˇr´ıda SearchModule. Tato tˇr´ıda definuje z´akladn´ı vlastnosti kter´e mus´ı m´ıt kaˇzd´ y vyhled´avac´ı modul, stejnˇe tak nab´ız´ı univerz´aln´ı ˇreˇsen´ı tam, kde je jasn´e, ˇze ani v budoucnu nebude tˇreba ˇreˇsit vˇeci jinak. Tˇr´ıda SearchModule tak funguje nejen jako mateˇrsk´a tˇr´ıda nab´ızej´ıc´ı z´azem´ı pro svoje potomky, ale tak´e jako rozhran´ı mezi moduly a tˇr´ıdou ModulesManager (spr´avce modul˚ u). Kaˇzd´ y budouc´ı modul mus´ı tuto tˇr´ıdu oddˇedit, bud’ pˇr´ımo, nebo prostˇrednictv´ım jin´e tˇr´ıdy. Tˇr´ıda SearchModule ˇreˇs´ı zejm´ena: • Zdali je modul zapnut nebo vypnut - dle nastaven´ı uˇzivatel v UI. • Nastaven´ı modul˚ u - takt´eˇz dle nastaven´ı uˇzivatel v UI. • Pomoc´ı abstraktn´ıch metod urˇcuje z´akladn´ı metody potˇrebn´e pro kaˇzd´ y modul, od inicializace po urˇcen´ı kontaktu k propojen´ı. • Zde se nach´az´ı metoda run(), kterou vol´a ModulesManager pokud je modul zapnut´ y, tato metoda je tak branou mezi spr´avcem modul˚ u a modulem. Dalˇs´ı d˚ uleˇzitou tˇr´ıdou je tˇr´ıda SimpleSearchModule. Tato tˇr´ıda oddˇedˇen´a 28
Struktura aplikace
Aplikaˇcn´ı vrstva
od tˇr´ıdy SearchModule pˇrin´aˇs´ı z´azem´ı pro jednoduch´e moduly. Struktura bˇehu takov´ ychto jednoduch´ ych modul˚ u je: 1. Naˇc´ıst potˇrebn´a data z datab´aze. 2. Uloˇzit data do datov´ ych struktur vhodn´ ych pro efektivn´ı porovn´av´an´ı. 3. Porovnat vˇsechna data a uloˇzit nalezen´e kandid´aty k propojen´ı do seznamu. Bˇeˇzn´ y modul pro hled´an´ı kontakt˚ u k propojen´ı pak tˇr´ıdu SimpleSearchModule zdˇed´ı. Program´ator nov´eho modulu tak mus´ı doplnit pouze: 1. enum SearchSettings seznam moˇzn´ ych nastaven´ı modulu. 2. metodu getDisplayNameId() kter´a vrac´ı id ˇretˇezce kter´ y obsahuje jm´eno modulu. (ˇretˇezce jsou deklarov´any v XML a odkazov´any pomoc´ı id, takov´ y postup je na platformˇe Android standardem) 3. metodu createSearchOptions() kter´a vytvoˇr´ı seznam moˇzn´ ych nastaven´ı modulu. 4. metodu fillDataFromCursorLine(Cursor cursor) kter´a pˇrevede jeden ˇra´dek dat z datab´aze na data vhodn´a k porovn´av´an´ı. 5. metodu getProjection() kter´a urˇcuje jak´a data (sloupce) z datab´aze poˇzadujeme. 6. metodu getSelection() kter´a omezuje data z pˇredchoz´ı metody podle zadan´ ych krit´eri´ı. 7. metodu dataAreAggregationCandidates(Data dataObject1, Data dataObject2) kter´a urˇcuje zdali patˇr´ı data ke stejn´emu kontaktu.
4.2.2
Implementovan´ e moduly
V programu jsou vytvoˇreny vyhled´avac´ı moduly. Prvn´ım modulem je telefonn´ı modul (PhoneNumberModule). Tento modul porovn´av´a telefonn´ı ˇc´ısla kontakt˚ u. Nejprve uloˇz´ı do tˇr´ıdy PhoneNumber ˇc´ıslo bez mezin´arodn´ı pˇredvolby, n´aslednˇe ˇc´ısla porovn´av´a. Urˇcov´an´ı pˇredvolby u ˇc´ısel se uk´azalo jako sloˇzit´ y u ´kol, nebot’ pˇredvolba m˚ uˇze v r˚ uzn´ ych st´atech sest´avat z jednoho aˇz tˇr´ı ˇc´ısel[23], nen´ı proto jednoduch´e pˇredvolbu od ˇc´ısla oddˇelit. Druh´ ym modulem je emailov´ y modul (EmailModule), kter´ y porovn´av´a emailov´e adresy uˇzivatel˚ u. Pˇri defaultn´ım nastaven´ı modul oddˇeluje dom´enovou ˇc´ast. 29
Struktura aplikace
Datov´a vrstva
D´ale modul oddˇeluje ˇca´sti emailov´e adresy pomoc´ı teˇcek a dalˇs´ıch znak˚ u. Tyto ˇc´asti adresy pak mezi sebou porovn´av´a, pˇriˇcemˇz v nastaven´ı lze urˇcit kolik shodn´ ych ˇca´st´ı je potˇreba, ˇci zda z´aleˇz´ı na jejich poˇrad´ı. Dalˇs´ım modulem je modul porovn´avaj´ıc´ı n´azvy kontakt˚ u (NameModule). Tento modul je v mnoh´em podobn´ y jako modul pˇredchoz´ı, porovn´av´a spolu ˇc´asti n´azvu (oddˇelen´e mezerou) dle nastaven´ı uˇzivatele.
4.2.3
Parazitn´ı moduly
Pˇri navrhov´an´ı posledn´ıho modulu, kter´ y mˇel porovn´avat jm´ena s emailov´ ymi adresami vyvstala d˚ uleˇzit´a ot´azka: Pokud pracuje modul se stejn´ ymi daty jako jin´ y modul, m´a data znovu naˇc´ıtat z datab´aze? Odpovˇed’ nebyla jednoduch´a. Uˇzivatel totiˇz m˚ uˇze libovoln´ y modul deaktivovat, na data z nˇej tak nelze spol´ehat. Nakonec bylo ˇreˇsen´ı nalezeno formou parazitn´ıch modul˚ u. Tyto moduly vyuˇzij´ı data z jiˇz probˇehl´ ych modul˚ u. pokud byly potˇrebn´e moduly deaktivov´any, zavol´a parazitn´ı modul metodu parasiteRun() (nach´az´ı se ve tˇr´ıdˇe simpleSearchModule), kter´a spust´ı naˇcten´ı dat v dan´em modulu, ale nepokraˇcuje hled´an´ım kontakt˚ u k propojen´ı jako metoda run() t´ehoˇz modulu. Jedin´ ym parazitn´ım modulem v programu je modul pro porovn´av´an´ı email˚ u s n´azvy kontaktu (EmaiNameModule). Tento modul porovn´av´a ˇc´asti emailov´e adresy s ˇc´asti n´azvu kontaktu. Takov´ y pˇr´ıstup je velk´ ym posunem vpˇred, nebot’ porovn´av´an´ı r˚ uzn´ ych dat kontaktu je nˇeco, co nenab´ız´ı ani vestavˇen´e ˇreˇsen´ı platformy Android, ani testovan´e konkurenˇcn´ı aplikace.
4.3
Datov´ a vrstva
Centrem datov´e vrstvy je tˇr´ıda dataManager. Tato tˇr´ıda uchov´av´a seznam nalezen´ ych kandid´at˚ u na spojen´ı. Nav´ıc obsahuje vlastn´ı content provider a slouˇz´ı tak pro komunikaci s centr´aln´ım u ´loˇziˇstˇem dat v telefonu. Pro tuto komunikaci obsahuje mnoho metod, kter´e odstiˇ nuj´ı aplikaˇcn´ı vrstvu od contact provideru. Pomoc´ı tˇechto metod z´ısk´avaj´ı vyhled´avac´ı moduly data potˇrebn´a pro bˇeh aplikace.
4.3.1
Z´ısk´ av´ an´ı kontakt˚ u k porovn´ an´ı
Tato ˇca´st aplikace vyˇzadovala velice dlouhou anal´ yzu. Nejprve byl zvaˇzov´an zp˚ usob z´ısk´an´ı vˇsech kontaktn´ıch informac´ı z db pomoc´ı tzv. entit[22] (datov´a struktura 30
Struktura aplikace
Datov´a vrstva
obsahuj´ıc´ı data o kontaktu v podobˇe v jak´e jsou potˇreba v aplikac´ıch, tedy vˇsechna data o jednom kontaktu na jednom m´ıstˇe), a n´asledn´e pr´aci nad tˇemito daty. Data by se tak nahr´ala do pamˇeti na zaˇca´tku procesu hled´an´ı, v dobˇe pr´ace vyhled´avac´ıch modul˚ u uˇz by pak nebylo tˇreba pˇristupovat do datab´aze. Toto ˇreˇsen´ı nab´ızelo pˇrehledn´e oddˇelen´ı proces˚ u pr´ace s datab´az´ı a vyhled´av´an´ı, naproti tomu ale znamen´a vˇetˇs´ı z´atˇeˇz na datab´azi, nebot’ by byla z´ısk´av´ana i zcela nepotˇrebn´a data. Druhou zvaˇzovanou variantou byla moˇznost z´ısk´avat jen potˇrebn´a data, ale opˇet hned na zaˇc´atku procesu hled´an´ı, pˇred bˇehem vyhled´avac´ıch modul˚ u. Tato varianta byla takt´eˇz zavrˇzena. Kritick´ ym probl´emem se totiˇz stal v´ yˇcet potˇrebn´ ych dat. V pˇr´ıpadˇe ˇze by byl v budoucnu vytvoˇren vyhled´avac´ı modul potˇrebuj´ıc´ı nov´e typ dat, bylo by nutn´e zasahovat v´ yraznˇe i do datov´e vrstvy. Proto byla i tato varianta zavrˇzena. Nakonec byl zvolen takov´ y zp˚ usob, kdy kaˇzd´ y modul z´ısk´av´a data aˇz na zaˇc´atku svoj´ı pr´ace, s´am si urˇc´ı kter´a data potˇrebuje. Zp˚ usob se uk´azal jako velmi u ´ˇcinn´ y, f´aze z´ısk´av´an´ı dat z datab´aze nen´ı nejpomalejˇs´ı ˇca´st´ı pr´ace modulu, tak jak by se od datab´azov´ ych operac´ı oˇcek´avalo, je v´ yraznˇe rychlejˇs´ı neˇz n´asledn´e srovn´av´an´ı dat, obvykle se ani nezobraz´ı ve stavov´em ˇr´adku modulu (obr. 4.5 ˇc. 4). D˚ uvodem je to, ˇze vyhled´avac´ı modul obvykle potˇrebuje jen jeden ˇci dva sloupce z tabulky data, coˇz je jen nepatrn´ y zlomek z informac´ı kter´e vrac´ı entita. Z´ahy se uk´azalo i jedno u ´skal´ı tohoto postupu, nˇekolik modul˚ u totiˇz m˚ uˇze pracovat se stejn´ ymi daty, tato data by pak byla z´ısk´av´ana z datab´aze a uchov´av´ana v´ıcekr´at. Tento probl´em ale ˇreˇs´ı zaveden´ı parazitn´ıch modul˚ u popsan´ ych v kapitole 4.2.
4.3.2
Propojov´ an´ı kontakt˚ u
Propojov´an´ı kontakt˚ u prob´ıh´a pomoc´ı pˇrid´av´an´ı ˇra´dek do tabulky u kter´e chceme propojit a s agg exceptions s identifik´atory raw kontakt˚ typem TYPE KEEP TOGETHER - obdobnˇe jak to bylo uk´az´ano v kapitole 3.2.6. Po tom co jsou raw kontakty v aplikaci Contact Merge propojen´e, spust´ı se daleko n´aroˇcnˇejˇs´ı proces. Je totiˇz tˇreba v datab´azi zohlednit volbu zobrazovac´ıho jm´ena a fotky kterou provedl uˇzivatel. Program nejdˇr´ıve otestuje jestli se volba uˇzivatele neshoduje s volbou provideru. Pokud se volba shoduje, nen´ı tˇreba dˇelat nic. Pokud se neshoduje, program volbu provideru zast´ın´ı svoj´ı volbou (zmˇenit/pˇrepsat ji nelze, jak bylo vysvˇetleno v kapitole 3.3.2) Pro zast´ınˇen´ı jm´ena je pouˇzita technika zn´am´a z dokumentace[13] a popsan´a 31
Struktura aplikace
Datov´a vrstva
Obr´azek 4.11: Srovn´an´ı postup˚ u pˇri nastaven´ı jm´ena a fotky. V lev´e ˇca´sti je zn´azornˇen postup pro nastaven´ı fotky, v prav´e pro nastaven´ı jm´ena. kapitole 3.3.2. V t´eˇze kapitole je ale zm´ınˇeno ˇze obdobn´ y postup nelze pouˇz´ıt pro urˇcen´ı n´azvu kontaktu. Po mnoh´ ych ne´ uspˇeˇsn´ ych pokusech a dlouh´em zvaˇzov´an´ı bylo nalezeno ˇca´steˇcn´e ˇreˇsen´ı. T´ım je vloˇzen´ı nov´eho jm´ena do dat raw kontaktu (star´e jm´eno nemaˇzeme), kter´ y byl vybr´an contact providerem a nastaven´ı tohoto jm´ena jako prim´arn´ıho. Rozd´ılem je d´ale to, ˇze u nov´eho z´aznamu nastavujeme pouze sloupec IS PRIMARY, nebot’ to ve kter´em raw kontaktu se bude hledat prim´arn´ı jm´eno uˇz za n´as urˇcil provider pomoc´ı sloupce NAME RAW CONTACT ID. Srovn´an´ı nastaven´ı jm´ena a fotky kontaktu je vidˇet na obr´azku 4.11. T´ımto postupem je doc´ıleno ˇza´dan´eho v´ ysledku, kontakt se nyn´ı zobrazuje v seznamu kontakt˚ u pod vybran´ ym jm´enem. Pot´ıˇze nast´avaj´ı pokud uˇzivatel zaˇr´ızen´ı kontakt ruˇcnˇe rozdˇel´ı prostˇrednictv´ım seznamu kontakt˚ u. V takov´em pˇr´ıpadˇe budou m´ıt oba oddˇelen´e kontakty stejn´e jm´eno. Cel´a procedura zahrnuje nˇekolik operac´ı modifikuj´ıc´ıch datab´azi. Proveden´ı kaˇzd´eho dotazu zvl´aˇst’ by bylo pomal´e. Proto byla zvolena metoda, pˇri kter´e se dotazy stˇra´daj´ı do d´avky, kter´a je spuˇstˇena pro vˇsechny sluˇcovan´e kontakty najednou[24]. Pro uchov´av´an´ı pˇr´ıkaz˚ u pro datab´azi se pouˇz´ıv´a tˇr´ıda ContentProviderOperation, seznam operac´ı je pak pˇred´an metodˇe ContentResolver.applyBatch.
4.3.3
Z´ısk´ av´ an´ı facebookov´ ych kontakt˚ u z datab´ aze
Jak jiˇz bylo ˇreˇceno v kapitole 3.3.1, z´ısk´an´ı kontakt˚ u ze s´ıtˇe Facebook na standardn´ım zaˇr´ızen´ı bez administr´atorsk´ ych pr´av nen´ı moˇzn´e. Pokud vˇsak uˇzivatel odemkl sv˚ uj telefon a uˇz´ıv´a ho tedy jako administr´ator, z´ısk´an´ı kontakt˚ u moˇzn´e je. 32
Struktura aplikace
Datov´a vrstva
ˇ sen´ım V prohl´ıˇzen´ı kontakt˚ u z Facebooku n´am br´an´ı pˇr´ımo contact provider. Reˇ je tedy provider nˇejak´ ym zp˚ usobem obej´ıt. V t´eto ˇca´sti bude pops´ana technika odemˇcen´ı facebookov´ych kontakt˚ u pouˇzit´a v t´eto aplikaci, jako i moˇzn´e alternativn´ı techniky.
Root na Androidu Operaˇcn´ı syst´em Android je z bezpeˇcnostn´ıch d˚ uvod˚ u k bˇeˇzn´emu uˇzivateli a aplikac´ım kter´e spouˇst´ı velmi restriktivn´ı. Nav´ıc nem´a uˇzivatel, na rozd´ıl od operaˇcn´ıch syst´em˚ u kter´e zn´ame ze stoln´ıch poˇc´ıtaˇc˚ u, zˇr´ızen´ y administr´atorsk´ yu ´ˇcet. Nˇekter´e u ´kony, kter´e zn´ame ze svˇeta Windows ˇci Linuxu, jsou tak pro bˇeˇzn´eho vlastn´ıka zaˇr´ızen´ı s OS Android zapovˇezena. Pˇr´ıkazy potˇrebn´e k zpˇr´ıstupnˇen´ı facebookov´ ych kontakt˚ u tak, jak je to pops´ano d´ale, bohuˇzel patˇr´ı do t´eto mnoˇziny zapovˇezen´ ych u ´kon˚ u. Proto je tˇreba prov´est takzvan´ y root zaˇr´ızen´ı, po kter´em z´ısk´a uˇzivatel telefonu administr´atorsk´ y pˇr´ıstup k zaˇr´ızen´ı, kter´ y aktivuje prostˇrednictv´ım pˇr´ıkazu su (podobnˇe jako sudo na Linuxu) pˇredch´azej´ıc´ım u ´kon, ke kter´emu je tˇreba administr´atorsk´ ych pr´av. Zp˚ usob proveden´ı rootu se liˇs´ı podle typu zaˇr´ızen´ı, nav´ıc se jedn´a o odbornou problematiku net´ ykaj´ıc´ı se t´ematu t´eto pr´ace, proto zde nebude prob´ır´an. D˚ uleˇzit´e je, ˇze root lze prov´est t´emˇeˇr na kaˇzd´em zaˇr´ızen´ı, nav´ıc aplikac´ı kter´e ho vyˇzaduj´ı je mnoho (bez rootu nebude na androidu plnˇe fungovat ani bˇeˇzn´ y souborov´ y manager typu Total Commander, nejdou odinstalovat nˇekter´e aplikace...).
Technika pouˇ zit´ a v aplikaci Contact Merge Aplikace Contact Merge pouˇz´ıv´a k pˇr´ıstupu ke kontakt˚ um z Facebooku techniku odemyk´an´ı kontakt˚ u. Nejprve pouˇzijeme pˇr´ıkaz pomoc´ı nˇehoˇz celou datab´azi pˇresuneme do nezabezpeˇcen´eho u ´loˇziˇstˇe, napˇr´ıklad na SD kartu. Pˇred pˇresunem je jeˇstˇe potˇreba vypnout contact provider, nebot’ budeme upravovat jeho datab´azi mimo nˇej, obejdeme ho. Po pˇresunu pak mus´ıme zmˇenit pr´ava k souboru datab´aze, aby s n´ım mohla pracovat naˇse aplikace. K´od pˇr´ıkaz˚ u je vidˇet v k´odu 4.2. pm disable com.android.providers.contacts cp /data/data/com.android.providers.contacts/databases/contacts2.db /data/data/fido.contacts.merge/contacts2.db cd /data/data/fido.contacts.merge/ user=‘ls -ld ../fido.contacts.merge | awk ’{print $3}’‘ chown $user:$user contacts2.db
K´od 4.2: Pˇr´ıkaz pro zkop´ırov´an´ı datab´aze n kartu SD.
33
Struktura aplikace
Datov´a vrstva
N´aslednˇe m˚ uˇzeme manipulovat pˇr´ımo se souborem datab´aze, nebot’ ho nechr´an´ı ani omezen´ı na pˇr´ıstup do sloˇzek ciz´ıch aplikac´ı, ani pˇr´ıstupov´a pr´ava soubor˚ u. Datab´azi tedy uprav´ıme pomoc´ı SQL dotazu zadan´eho na nejniˇzˇs´ı u ´rovni - dotazu u kter´eho se nekontroluje spr´avnost, opr´avnˇen´ı, referenˇcn´ı integrita apod.. Takov´ y dotaz m˚ uˇzeme zadat pomoc´ı raw query[29]. Pro odemˇcen´ı kontakt˚ u staˇc´ı jednoduch´ y dotaz, jako v k´odu 4.3. UPDATE raw_contacts SET is_restricted = 0 ’)
K´od 4.3: Dotaz na datab´azi kontakt˚ u pro odemˇcen´ı kontakt˚ u z Facebooku. Po vykon´an´ı potˇrebn´eho SQL dotazu pˇresuneme datab´azi zpˇet na m´ısto. Opˇet je tˇreba zmˇenit vlastn´ıka souboru, tentokr´at zpˇet na provider. Nav´ıc nesm´ıme zapnout provider zapnout. Nav´ıc je tˇreba vymazat soubor datab´aze a ˇzurn´alu ze sloˇzky naˇs´ı aplikace. Vˇse je vidˇet v k´odu 4.4. cp -f /data/data/fido.contacts.merge/contacts2.db /data/data/com.android.providers.contacts/databases/contacts2.db cd /data/data/com.android.providers.contacts/ user=‘ls -ld databases | awk ’{print $3}’‘ chown $user:$user databases/contacts2.db cd /data/data/fido.contacts.merge/ rm contacts2.db rm contacts2.db-journal pm enable com.android.providers.contacts
K´od 4.4: Pˇr´ıkaz pro zkop´ırov´an´ı datab´aze zpˇet do adres´aˇre contact provideru.
Jak jiˇz bylo ˇreˇceno, odemyk´an´ı kontakt˚ u funguje jen na zaˇr´ızen´ı kde m´a uˇzivatel pr´ava administr´atora. Pˇred vykreslen´ım UI se aplikace Contact Merge pˇresvˇedˇc´ı, jestli m´a uˇzivatel zaˇr´ızen´ı administr´atorsk´a pr´ava (zdali jde o rootnut´e“ zaˇr´ızen´ı). ” Pokud pr´ava nem´a, tlaˇc´ıtko k odemknut´ı kontakt˚ u se v˚ ubec nezobraz´ı. K tomuto testu a k samotn´emu spuˇstˇen´ı v´ yˇse uveden´ ych pˇr´ıkaz˚ u byl vyuˇzit k´od z´ıskan´ y ze str´anky StackOverflow[21].
Dalˇ s´ı moˇ znosti Jednou z dalˇs´ıch moˇznost´ı jak se dostat ke kontakt˚ um z Facebooku je SQL injekt´aˇz. Jedn´a se o techniku, kdy jsou provideru jako souˇca´st bˇeˇzn´ ych SQL dotaz˚ u podstrˇceny dotazy, kter´e jinak provider nepovoluje. Tuto techniku jsem do detailu nezkoumal, nebot’ by takov´a pr´ace nebyla programovˇe ˇcist´a, pouˇzit´ı takov´e techniky by mohlo m´ıt nepˇr´ıjemn´e pr´avn´ı d˚ usledky, a v neposledn´ı ˇradˇe by takov´a 34
Struktura aplikace
Kompatibilita
aplikace byla t´emˇeˇr jistˇe staˇzena z obchodu Play. Dalˇs´ı zvaˇzovanou variantou bylo pouˇzit´ı programu sqlite3. Jedn´a se o konzolov´ y program, kter´ y vykon´a SQL dotaz na datab´azi, v´ ystupem programu jsou pak navr´acen´a data. Pokud pˇred samotn´ y program nap´ıˇseme v konzoli pˇr´ıkaz su, vykon´ame pˇr´ıkaz s administr´atorsk´ ymi pr´avy, d´ıky tomu m˚ uˇzeme pracovat i s datab´az´ı jin´eho programu. Tato varianta byla nakonec zavrˇzena, program sqlite3 by musel b´ yt souˇc´ast´ı distribuce programu Contact Merge, nebot’ jiˇz nen´ı souˇca´st´ı vˇsech distribuc´ı Android. Pˇr´ıklad pˇr´ıkazu kter´ y odemkne kontakty z platformy facebook m˚ uˇzeme vidˇet v k´odu 4.5. "su sqlite3 /data/data/com.android.providers.contacts/databases/contacts2.db \"UPDATE raw_contacts SET is_restricted = 0\""
K´od 4.5: Pˇr´ıkaz pro odemˇcen´ı facebookov´ ych kontakt˚ u programem sqlite3[6].
4.4
Kompatibilita
Aplikace by mˇela b´ yt kompatibiln´ı s jak´ ymkoliv zaˇr´ızen´ım s operaˇcn´ım syst´emem ´ eˇsn´e testov´an´ı probˇehlo na Android od verze 3.0 - Honeycomb (API level 11). Uspˇ mobiln´ıch telefonech Sony Xperia V, Sony Xperia L, Samsung GT-S762, Samsung Galaxy S3, d´ale pak na tabletech Prestigio 5580C duo a Samsung Tab 3.
35
5 Testov´an´ı aplikace V posledn´ı kapitole pˇred z´avˇerem se zamˇeˇr´ıme na testov´an´ı aplikac´ı. Nejprve srovn´ame aplikaci Contact Merge s aplikacemi pˇredstaven´ ymi v kapitole 2.1. N´aslednˇe pak srovn´ame nalezen´e v´ ysledky s r˚ uzn´ ym nastaven´ım programu na telefonu Sony Xperia V.
5.1
Porovn´ an´ı aplikac´ı
N´ıˇze uveden´e tabulka nab´ız´ı srovn´an´ı funkc´ı a schopnost´ı aplikace Contact Merge s dalˇs´ımi testovan´ ymi aplikacemi. Nutno poznamenat ˇze funkce v tabulce byly vybr´any podle zad´an´ı bakal´aˇrsk´e pr´ace, proto se zde velk´a ˇc´ast funkc´ı ostatn´ıch testovan´ ych aplikac´ı v˚ ubec nenach´az´ı. D´ale je nutno ˇr´ıci, jak uˇz bylo naznaˇceno v u ´vodu, ˇze se testovan´e aplikace k probl´emu kontakt˚ u stav´ı jinak neˇz aplikace Contact Merge. Z testov´an´ı tedy nevyplynul z´avˇer, ˇze ostatn´ı aplikace jsou horˇs´ı neˇz aplikace Contact Merge, ale sp´ıˇse to, ˇze nebyla nalezena ˇza´dn´a aplikace, jej´ıˇz u ´ˇcel a filozofie pr´ace by odpov´ıdali aplikaci Contact Merge. Vˇsechny aplikace byly testov´any s defaultn´ım nastaven´ım. Testovac´ım zaˇr´ızen´ım byl telefon Sony Xperia V. Celkov´ y poˇcet kontakt˚ u v telefonu byl 887. Srovn´an´ı aplikac´ı vid´ıme v tabulce 5.1. Z tabulky je vidˇet ˇze v poˇctu nalezen´ ych v´ ysledk˚ u aplikace Contact Merge s pˇrehledem vede. Nav´ıc selh´avaj´ı ostatn´ı aplikace i v dalˇs´ıch testovan´ ych krit´eri´ıch, neumˇej´ı pracovat s facebookov´ ymi kontakty, neumˇej´ı pracovat s kontakty z v´ıce zdroj˚ u, nen´ı u nich ani moˇznost vybrat fotku ˇci n´azev v´ ysledn´eho kontaktu. Celkovˇe lze s jistotou ˇr´ıci ˇze aplikace Contact Merge zv´ıtˇezila ve vˇsech testovan´ ych krit´eri´ıch.
5.2
Porovn´ an´ı r˚ uzn´ ych nastaven´ı
V n´asleduj´ıc´ıch sekc´ıch jsou vyps´any v´ ysledky modul˚ u s r˚ uzn´ ym nastaven´ım. Celkovˇe se jako nej´ uˇcinnˇejˇs´ı uk´azal modul pro srovn´av´an´ı jmen, srovn´av´an´ı telefonn´ıch ˇc´ısel pak bylo u ´ˇcinn´e nejm´enˇe. Moduly pro srovn´an´ı jmen a srovn´av´an´ı jmen s emailov´ ymi adresami uk´azaly prudk´ y n´ar˚ ust poˇctu v´ ysledk˚ u, pokud srovn´avaly r˚ uznˇe dlouh´a jm´ena/maily. S t´ımto nastaven´ım se ale tak´e objevily faleˇsn´e n´alezy - v pˇr´ıpadˇe prvn´ıho jmenovan´eho jedna polovina, v druh´em pˇr´ıpadˇe jedna tˇretina faleˇsn´ ych n´alez˚ u. 36
Testov´an´ı aplikace
Porovn´an´ı r˚ uzn´ych nastaven´ı
anal´ yza2
Facebook3
sluˇcuje kontakty z v´ıce u ´ˇct˚ u
ano
ano
ano
ano
ano
ne
ne
ne
ne
Contact op- nelze urˇcit4 timizer
ano6
ne
ne
ne
ne
Duplicate Contacts Manager
ano6
nelze zjistit5
ne
ne
nelze zjistit5
N´ azev
poˇcet n´ alez˚ u
propojuje kontakty1
v´ ybˇer jm´ena fotky
Contact Merge
15
ano
Merge +
6
2
a
1. Pokud ne, tak pouze maˇze duplicitn´ı kontakty. 2. Pracuje s kontakty ze s´ıtˇe Facebook - nutno root zaˇr´ızen´ı. 3. Urˇcuje, zda byly shodn´e kontakty nalezen´e dle anal´ yzy, nebo pˇresn´e shody datab´azov´eho pole (jm´eno, tel. ˇc´ıslo...). Tento u ´daj je tˇreba br´at s rezervou, byl urˇcen na z´akladˇe nalezen´ ych v´ ysledk˚ u. Pokud se u ´daje u vˇsech nalezen´ ych v´ ysledk˚ u pˇresnˇe shodovaly, je zvolena hodnota ne. 4. N´ alez˚ u bylo v´ıce neˇz 40, ale z pˇeti testovan´ ych n´alez˚ u byly vˇsechny v telefonu jiˇz propojeny. 5. nelze zjistit, nebot’ zdarma je pouze detekce duplicit, funkce propojov´an´ı kontakt˚ u je placen´ a. 6. ano, ale vˇetˇsina funkc´ı aplikace smˇeˇruje k maz´an´ı duplicit, nikoliv k jejich propojov´an´ı.
Tabulka 5.1: Srovn´an´ı dostupn´ ych aplikac´ı s aplikac´ı Contact Merge v oblastech zad´an´ı pr´ace.
37
Testov´an´ı aplikace
Porovn´an´ı r˚ uzn´ych nastaven´ı
Defaultn´ı nastaven´ım je vˇzdy zv´ yraznˇeno tuˇcnˇe. Testovan´ ym telefonem byl opˇet Sony Xperia V s 887 kontakty.
5.2.1
Email module
Email module m´a jen pr˚ umˇern´e v´ ysledky. Je to pˇredevˇs´ım proto, ˇze byl implementov´an jako prvn´ı, nebyly proto vytvoˇreny ˇza´dn´e moˇznosti hlubˇs´ı anal´ yzy. Na druhou stranu ale nˇekolik shod naˇsel, nav´ıc se nevyskytly ˇz´adn´e faleˇsn´e n´alezy. Nastaven´ı: • vˇse vypnuto - 3 n´alezy • zapnuta moˇ znost include similar emails (testuje adresy bez dom´ eny) - 5 n´ alez˚ u.
5.2.2
Phone number module
Phone number module mnoho n´alez˚ u nem´a. Je to proto, ˇze ˇc´ısla kontakt˚ u porovn´av´a uˇz operaˇcn´ı syst´em Android, kontakty se stejn´ ymi ˇc´ısly se tak slouˇc´ı automaticky. Nastaven´ı: • vˇse vypnuto - 1 n´alez • test number without country calling code (testov´ an´ı bez pˇ redvolby ˇ c´ısla) - 2 n´ alezy
5.2.3
Name module
Nejvˇetˇs´ı poˇcet n´alez˚ u m´a modul pro srovn´av´an´ı jmen. Devˇet n´alez˚ u s defaultn´ım nastaven´ım je sluˇsn´ y v´ ysledek. S rozˇs´ıˇren´ ym nastaven´ım najde modul jeˇstˇe daleko vˇetˇs´ı mnoˇzstv´ı v´ ysledk˚ u, v´ıce neˇz polovina n´alez˚ u je ale faleˇsn´ ych, v´ ysledky takov´eho hled´an´ı proto mus´ıme peˇclivˇe proj´ıt. Nastaven´ı: • vˇ se vypnuto - 9 n´ alez˚ u 38
Testov´an´ı aplikace
Porovn´an´ı r˚ uzn´ych nastaven´ı
• ignore name order (z´amˇena poˇrad´ı jm´eno pˇr´ıjmen´ı) - 9 n´alez˚ u • compare names with different length (porovn´av´an´ı r˚ uznˇe dlouh´ ych jmen, napˇr. jedno a dvouslovn´ ych) - 71 n´alez˚ u (z toho 37 faleˇsn´ ych n´alez˚ u)
5.2.4
Email/Name module
V´ ysledky modulu pro srovn´an´ı jmen s defautn´ım nastaven´ım nejsou oslniv´e. Pˇri spuˇstˇen´ı s rozˇs´ıˇren´ ym nastaven´ım ale nalezl pˇres dvacet v´ ysledk˚ u, z nichˇz pouh´a tˇretina byly faleˇsn´e n´alezy. Nastaven´ı: • vˇ se vypnuto - 3 n´ alezy • ignore name order (z´amˇena poˇrad´ı ˇca´st´ı mailu/jm´ena) - 3 n´alezy • compare names with different length (porovn´av´an´ı r˚ uznˇe dlouh´ ych mail˚ u/jmen) - 22 n´alez˚ u (z toho 7 faleˇsn´ ych n´alez˚ u)
39
6 Z´avˇer Tato pr´ace se zab´ yv´a problematikou pr´ace s kontakty na platformˇe Android. Na tomto nejrozˇs´ıˇrenˇejˇs´ım operaˇcn´ım syst´emu na mobiln´ıch zaˇr´ızen´ıch je vˇetˇsinou uloˇzeno mnoho kontakt˚ u nejen zadan´ ych uˇzivatelem pˇr´ımo do telefonu, ale tak´e ˇ synchronizovan´ ych z r˚ uzn´ ych s´ıt´ı a sluˇzeb. Casto je pak v telefonu uloˇzeno v´ıce kontakt˚ u patˇr´ıc´ıch ke stejn´e osobˇe. C´ılem pr´ace bylo takov´e kontakty naj´ıt a propojit. Prvn´ım u ´kolem t´eto pr´ace bylo naj´ıt a zhodnotit existuj´ıc´ı aplikace s podobn´ ym zamˇeˇren´ım jako tato pr´ace na platformˇe Android. Byly vybr´any a zhodnoceny tˇri aplikace, z nichˇz ani jedna nesplˇ novala c´ıle, kter´e si klade tato pr´ace. Nalezen´ ych duplicit bylo m´alo, nˇekter´e aplikace se snaˇzily takov´ ych kontakt˚ u zbavit, nikoliv je propojit, v ˇza´dn´e aplikaci pak nebylo moˇzn´e pracovat s kontakty ze s´ıtˇe Facebook. Zhodnocen´ı aplikac´ı tedy potvrdilo d˚ uleˇzitost vytvoˇren´ı vlastn´ı aplikace, nebot’ jejich v´ ysledky zaost´avaly za c´ıli pr´ace. V dalˇs´ı ˇca´sti pr´ace se podaˇrilo analyzovat pr´aci s kontakty na platformˇe Android. Vˇetˇsina t´eto problematiky je pokryt´a v ofici´aln´ı dokumentaci, k nˇekter´ ym ale bylo nutn´e hledat informace jinde a vyskytla se i takov´a t´emata, u kter´ ych bylo nutn´e naj´ıt odpovˇedi na ot´azky vlastn´ım v´ yzkumem. K takov´ ym oblastem patˇrila pˇredevˇs´ım pr´ace s facebookov´ ymi kontakty nebo zmˇena n´azvu a fotky kontaktu. Aplikace dle zad´an´ı pr´ace byla navrˇzena a realizov´ana, c´ıle pr´ace se podaˇrilo splnit. Pr´ace s kontakty ze s´ıtˇe Facebook je sice omezen´a - funguje jen na zaˇr´ızen´ıch s administr´atorsk´ ym pˇr´ıstupem, tato situace je vˇsak zp˚ usobena z´amˇern´ ym zablokov´an´ım tˇechto kontakt˚ u proti pˇr´ıstupu aplikac´ı. Je tak velk´ ym u ´spˇechem, ˇze se podaˇrilo s tˇemito kontakty pracovat alespoˇ n na zaˇr´ızen´ıch s administr´atorsk´ ym pˇr´ıstupem. Velk´ ym pˇr´ınosem aplikace je tak´e moˇznost urˇcit n´azev a fotku v´ ysledn´eho kontaktu. Vyhled´avac´ı ˇc´ast aplikace byla realizov´ana pomoc´ı vyhled´avac´ıch modul˚ u. Tyto moduly byly navrˇzeny pro snadnou rozˇsiˇritelnost, nen´ı tak probl´em vytvoˇrit moduly dalˇs´ı. D´ıky Parazitn´ım modul˚ um je pak moˇzn´e vyuˇz´ıt data z jiˇz existuj´ıc´ıch modul˚ u a implementovat novˇe jen porovn´av´an´ı kontaktn´ıch dat. Nakonec byla aplikace otestov´ana, byla provedena testovac´ı hled´an´ı kontakt˚ uk propojen´ı s r˚ uzn´ ymi moduly a r˚ uzn´ ym nastaven´ım modul˚ u. Testy uk´azaly uˇziteˇcnost aplikace, i pˇri defaultn´ım nastaven´ı, kde se nevyskytuj´ı faleˇsn´e n´alezy, bylo nalezeno v´ıce neˇz deset dvojic kontakt˚ u k propojen´ı. Celkovˇe se zad´an´ı pr´ace podaˇrilo splnit, a to jak v teoretick´e tak praktick´e rovinˇe. Praktickou ˇca´st - aplikaci je moˇzn´e v budoucnu rozˇs´ıˇrit o dalˇs´ı moduly 40
Z´avˇer
a zv´ yˇsit tak u ´ˇcinnost hled´an´ı. Z teoretick´e ˇca´sti je pak moˇzn´e ˇcerpat pˇri dalˇs´ıch projektech zab´ yvaj´ıc´ıch se prac´ı s kontakty na platformˇe Android. Celkovˇe je tak, dle m´eho n´azoru moje pr´ace pˇr´ınosem v teoretick´e i praktick´e rovinˇe.
41
Bibliografie [1] Google Inc., Open Handset Alliance. Activity [online]. url: http://developer. android.com/reference/android/app/Activity.html [cit. 2014-04-02] . [2] Allen, Grant. Beginning Android 4. New York: Apress, 2012. Kap. Handling Rotation. 582 s. isbn: 978-1-4302-3984-0. [3]
[email protected]. Restricted contacts limit external Android app integration [online]. 28. srp. 2010. url: http : / / code . google . com / p / android/issues/detail?id=5176 [cit. 2013-12-26] . [4] Google Inc., Open Handset Alliance. AsyncTask [online]. url: http : / / developer.android.com/reference/android/os/AsyncTask. html [cit. 2013-12-08] . [5] Aydin, Murat. Android 4: New features for Application Development. Birmingham: Packt Publishing, 2012. Kap. Fragments. 149 s. isbn: 978-1-84951952-6. [6] Biber. Open sqlite-database of another app on Android with root-access [online]. 23. dub. 2012. url: http://stackoverflow.com/questions/16142844/ open-sqlite-database-of-another-app-on-android-withroot-access [cit. 2014-01-17] . [7] Boyle, Chris. ContactsProvider: Aggregated contact’s display name should ´n. 2010. url: http://code. respect IS SUPER PRIMARY [online]. 9. u google.com/p/android/issues/detail?id=6545 [cit. 2014-03-15] . [8] Cervilla, Jose. Basic AsyncTask with a progress bar widget [online]. 16. ˇcerv. 2011. url: http://www.codingforandroid.com/2011/06/basicasynctask-with-progress-bar.html [cit. 2013-12-08] . [9] Google Inc., Open Handset Alliance. Contacts Provider [online]. url: http: //developer.android.com/guide/topics/providers/contactsprovider.html [cit. 2013-11-12] . [10] DesignerzBase. Contacts3 icon [online]. url: https://www.iconfinder. com/icons/216476/contacts3_icon#size=128 [cit. 2014-05-07] .
42
BIBLIOGRAFIE
BIBLIOGRAFIE
[11] Google Inc., Open Handset Alliance. ContactsContract.AggregationExceptions [online]. url: http : / / developer . android . com / reference / android / provider / ContactsContract . AggregationExceptions . html [cit. 2013-12-22] . [12] Google Inc., Open Handset Alliance. ContactsContract.Contacts [online]. url: http://developer.android.com/reference/android/provider/ ContactsContract.Contacts.html [cit. 2014-02-22] . [13] Google Inc., Open Handset Alliance. ContactsContract.data [online]. url: http://developer.android.com/reference/android/provider/ ContactsContract.Data.html [cit. 2014-03-08] . [14] Google Inc., Open Handset Alliance. Content Provider Basics [online]. url: http://developer.android.com/guide/topics/providers/ content-provider-basics.html [cit. 2013-11-05] . [15] Google Inc., Open Handset Alliance. Content Providers [online]. url: http: //developer.android.com/guide/topics/providers/contentproviders.html [cit. 2013-11-05] . [16] dplotnikov. How access restricted contacts in third party app [online]. 26. bˇrez. 2010. url: https : / / groups . google . com / forum / # ! topic / android-developers/u2TdwbBUpBI [cit. 2013-12-26] . [17] dplotnikov. How to get a contact’s facebook id or url from native contacts / content resolver? [online]. 22. pros. 2010. url: https://groups. google.com/forum/#!topic/android-developers/lREN16Hh4LQ [cit. 2013-12-28] . [18] Google Inc., Open Handset Alliance. Fragment [online]. url: http : / / developer.android.com/reference/android/app/Fragment. html [cit. 2013-11-10] . [19] Google Inc., Open Handset Alliance. Fragments [online]. url: http : / / developer.android.com/guide/components/fragments.html [cit. 2013-11-10] . [20] I., Roger. Cannot find Facebook contacts in RawContacts [online]. 28. kvˇet. 2011. url: http : / / stackoverflow . com / questions / 6038290 / cannot-find-facebook-contacts-in-rawcontacts [cit. 2013-12-28] . [21] Kevin. Determine if running on a rooted device [online]. 11. lis. 2011. url: http://stackoverflow.com/questions/1101380/determineif-running-on-a-rooted-device [cit. 2014-03-16] . [22] Komatineni, Satya – MacLean, Dave. Pro Android 4: Android 4 platform SDK techniques for developing smartphone and tablet apps. 4th edition. New York: Apress, 2012. Kap. Exploring the Contacts API. 991 s. isbn: 978-14302-3930-7.
43
BIBLIOGRAFIE
BIBLIOGRAFIE
[23] List of ITU-T recommendation E.164 assigned country codes. Tech. zpr. 991. International telecomunication union, 2011. url: http://www.itu.int/ dms_pub/itu-t/opb/sp/T-SP-E.164D-11-2011-PDF-E.pdf. [24] Manitoba. Android - Update a contact [online]. 29. bˇrez. 2012. url: http: //stackoverflow.com/questions/9907751/android-updatea-contact [cit. 2014-03-29] . [25] . Resize Drawable in Android [online]. 2. u ´n. 2014. url: http://stackoverflow. com/questions/7021578/resize-drawable-in-android [cit. 2014-05-06] . [26] Samuel. How do you get contacts to aggregate properly when programmatically adding them? [online]. 23. u ´n. 2012. url: http://stackoverflow. com / questions / 9419305 / how - do - you - get - contacts - to aggregate- properly- when- programmatically- adding- them [cit. 2013-12-22] . [27] Tamada, Ravi. Android Expandable List View Tutorial [online]. 27. ˇcvc 2013. url: http://www.androidhive.info/2013/07/android-expandablelist-view-tutorial/ [cit. 2014-02-05] . [28] Varun. How to programatically set drawableLeft on Android button? [online]. 21. pros. 2010. url: http://stackoverflow.com/questions/4502605/ how - to - programatically - set - drawableleft - on - android button [cit. 2014-05-06] . [29] Vogel, Lars. Android SQLite database and content provider - Tutorial [online]. Ver. 4.9. 19. srp. 2013. url: http://www.vogella.com/tutorials/ AndroidSQLite/article.html [cit. 2014-03-02] .
44
Pˇ r´ılohy A
Instalaˇ cn´ı pˇ r´ıruˇ cka
Zde se nach´az´ı struˇcn´ y postup instalace aplikace pomoc´ı instalaˇcn´ıho bal´ıˇcku (souboru .apk). Body oznaˇcen´e hvˇezdiˇckou nastanou jen v nˇekter´ ych pˇr´ıpadech ˇci konfigurac´ıch telefonu 1. Odinstalujte pˇredchoz´ı verze aplikace.* 2. Nahrajte instalaˇcn´ı bal´ıˇcek do nechr´anˇen´e ˇc´asti souborov´eho syst´emu na zaˇr´ızen´ı Android - napˇr. na kartu SD. 3. Poklepnˇete na instalaˇcn´ı bal´ıˇcek. 4. Pokud se zobraz´ı menu dostupn´ ych aplikac´ı, zvolte N´astroj k instalaci bal´ıˇck˚ u, jak je uk´az´ano na obr´azku A.1a.* 5. Pokud se zobraz´ı informace ˇze instalace je zablokov´ana protoˇze je jej´ı zdroj nezn´am´ y, je nutn´e povolit instalaci z nezn´am´ ych zdroj˚ u. Zvolte Nastaven´ı (obr´azek A.2a), d´ale sekci zabezpeˇcen´ı A.2b) zde pak zaˇskrtnˇete moˇznost Nezn´am´e zdroje (obr´azek A.2c). Cel´ y postup je vidˇet na obr´azku A.2.* 6. Odsouhlaste seznam pr´av kter´a aplikace vyˇzaduje zvolen´ım tlaˇc´ıtka instalovat - obr´azek A.1b.
B
Uˇ zivatelsk´ a pˇ r´ıruˇ cka
Cel´e sch´ema aplikace z pohledu uˇzivatele vid´ıme na obr´azku B.1. Nejprve spust´ıme aplikaci poklep´an´ım na jej´ı ikonu v menu. Objev´ı se n´am u ´vodn´ı aktivita (obr´azek 4.3). Zde je moˇzn´e aktivovat/deaktivovat vyhled´avac´ı moduly klepnut´ım na checkbox napravo vedle modulu (obr´azek B.2a ˇc´ıslo 1), po klepnut´ı na modul (viz obr´azek B.2a ˇc´ıslo 2) mimo checkbox se dostaneme do nastaven´ı modulu (viz. d´ale). Na zaˇr´ızen´ıch s administr´atorsk´ ymi pr´avy je nav´ıc moˇzn´e odemknout kontakty ze s´ıtˇe facebook klepnut´ım n tlaˇc´ıtko Unlock Facebook contacts (viz. obr´azek B.2a ˇc´ıslo 3). Stejn´ ym tlaˇc´ıtkem je moˇzn´e n´aslednˇe kontakty zamknout zpˇet. V aktivitˇe nastaven´ı modulu m˚ uˇzeme klepnut´ım na checkbox aktivovat/deaktivovat pˇr´ısluˇsn´e nastaven´ı (obr´azek B.2b). Po nastaven´ı vˇsech modul˚ u a jejich 45
Pˇr´ılohy
Uˇzivatelsk´a pˇr´ıruˇcka
(a) V´ ybˇer n´ astroje pro instalaci bal´ıˇck˚ u
(b) Schv´alen´ı opr´avnˇen´ı
Obr´azek A.1: N´avod na instalaci
(a) Dialog zablokov´ an´ı instalace
(b) Sekce zabezpeˇcen´ı
(c) Moˇznost instalovat aplikace nezn´am´ ych zdroj˚ u
Obr´azek A.2: Instalace aplikac´ı z nezn´am´ ych zdroj˚ u
46
Pˇr´ılohy
Uˇzivatelsk´a pˇr´ıruˇcka
Obr´azek B.1: Sch´ema fungov´an´ı aplikace z pohledu uˇzivatele aktivov´an´ı dle naˇsich pˇredstav pokraˇcujeme kliknut´ım na tlaˇc´ıtko Find merge candidates (obr´azek B.2a ˇc´ıslo 4). N´aslednˇe se zobraz´ı dialog z indik´atorem stavu hled´an´ı, kter´ y jiˇz zn´ame z obr´azku 4.5. Po skonˇcen´ı hled´an´ı se zobraz´ı aktivita v´ ysledk˚ u (obr´azek 4.6). Zde vid´ıme dvojice kontakt˚ u, u kter´ ych program zhodnotil, ˇze patˇr´ı ke stejn´e osobˇe. Zb´ yv´a kontakty spojit. Pro spojen´ı kontakt˚ u m´a uˇzivatel dvˇe moˇznosti. Prvn´ı moˇznost´ı je individu´aln´ı propojen´ı kontakt˚ u. Nejprve pˇrejdeme na aktivitu detailu kandid´at˚ u ke spojen´ı(viz. obr´azek 4.7), a to tak ˇze klepneme na ˇra´dek v seznamu na kter´em jsou jm´ena kontakt˚ u kter´e chceme spojit (obr´azek B.3a ˇc´ıslo 1). Pokud kontakty nepatˇr´ı k sobˇe, m˚ uˇzeme pouˇz´ıt tlaˇc´ıtko discard (obr´azek B.3b ˇc´ıslo 1), kter´e n´as vr´at´ı zpˇet na seznam v´ ysledk˚ u, ze kter´eho bude prohl´ıˇzen´a dvojice kontakt˚ u vyˇrazena. Pokud k sobˇe kontakty patˇr´ı, klepneme na tlaˇc´ıtko Aggregate contacts (obr´azek B.3b ˇc´ıslo 2). Zobraz´ı se dialog s v´ ybˇerem jm´ena (obr´azek 4.8). Zde pomoc´ı radio button˚ u vybereme n´azev a fotku kontaktu (obr´azek B.4a ˇc´ıslo 1). n´aslednˇe stiskneme tlaˇc´ıtko Merge Selected (obr´azek B.4a ˇc´ıslo 2), ˇc´ımˇz dojde ke slouˇcen´ı kontakt˚ u, a my se vr´at´ıme do aktivity v´ ysledk˚ u. Druh´a moˇznost je slouˇcit kontakty hromadnˇe. Nejprve zaˇskrtneme kontakty, kter´e chceme slouˇcit pomoc´ı checkbox˚ u v aktivitˇe v´ ysledk˚ u (obr´azek B.3a ˇc´ıslo 2). Pak klepneme na tlaˇc´ıtko Merge selected (obr´azek B.3a ˇc´ıslo 3). T´ım se dostaneme do aktivity slouˇcen´ı v´ıce kontakt˚ u (obr´azek 4.9). Zobraz´ı se n´am seznam vybran´ ych dvojic kontakt˚ u k propojen´ı. Pokud chceme rozhodnout, jakou fotku a n´azev bude m´ıt v´ ysledn´ y kontakt, rozbal´ıme poloˇzku seznamu pomoc´ı poklep´an´ı. V rozbalen´e dvojici kontakt˚ u vybereme jm´eno a fotku kontaktu, obdobnˇe jako v pˇr´ıpadˇe individu´aln´ıho propojen´ı kontakt˚ u (obr´azek B.4b ˇc´ıslo 1). Po klepnut´ı na tlaˇc´ıtko merge dojde ke slouˇcen´ı vˇsech kontakt˚ u ze seznamu a k n´avratu do aktivity v´ ysledk˚ u (obr´azek B.4b ˇc´ıslo 2).
47
Pˇr´ılohy
Uˇzivatelsk´a pˇr´ıruˇcka
(a) u ´vodn´ı aktivita
(b) aktivita nastaven´ı
Obr´azek B.2: Pˇr´ıruˇcka - u ´vodn´ı aktivita a aktivita nastaven´ı.
(a) aktivita v´ ysledk˚ u
(b) aktivita detailu
Obr´azek B.3: Pˇr´ıruˇcka - aktivita v´ ysledk˚ u a aktivita detailu.
48
Pˇr´ılohy
Sloupce tabulky kontakt˚ u
(a) aktivita sluˇcov´ an´ı
individu´aln´ıho (b) aktivita hromadn´eho sluˇcov´an´ı
Obr´azek B.4: Pˇr´ıruˇcka - aktivita individu´aln´ıho a aktivita hromadn´eho sluˇcov´an´ı. Program je moˇzn´e v kter´ekoliv f´azi bezpeˇcnˇe opustit, v nejhorˇs´ım pˇr´ıpadˇe ztrat´ıme nalezen´e v´ ysledky, kter´e m˚ uˇzeme ovˇsem snadno opˇet vyhledat.
C
Sloupce tabulky kontakt˚ u
* Hodnota konstanty v kontraktn´ı tˇr´ıdˇe = skuteˇcn´e jm´eno tabulky.
49
Pˇr´ılohy
C.1 Typ long
Sloupce tabulky kontakt˚ u
Z´ akladn´ı
Jm´eno ID
hodnota*
v´ yznam
id
identifik´ator ˇr´adku
String LOOKUP KEY
lookup
long
name raw contact id
NAME RAW CONTACT ID
kl´ıˇc slouˇz´ıc´ı k nalezen´ı kontaktu, pokud se jeho id zmˇen´ı v d˚ usledku slouˇcen´ı kontakt˚ u, nebo synchronizace kl´ıˇc k raw kontaktu kter´ y poskytuje n´ azev kontaktu
String DISPLAY NAME PRIMARY
display name
long
PHOTO ID
photo id
long
PHOTO URI
photo uri
Odkaz na fotku slouˇz´ıc´ı ke zobrazen´ı
long
PHOTO THUMBNAIL URI
photo thumb uri
Odkaz na n´ahled fotky slouˇz´ıc´ı ke zobrazen´ı
int
IN VISIBLE GROUP
in visible group
Indikuje zdali m´a b´ yt kontak zobrazen. ”1”pokud m´a kontakt alespoˇ n jeden viditeln´ y raw kontakt, jinak ”0”.
int
HAS PHONE NUMBER
has phone number
Indikuje zdali m´a kontakt telefon´ı ˇc´ıslo. ”1”pokud ano, jinak ”0”
int
TIMES CONTACTED
times contacted
Kolikr´at byl kontak pouˇzit.
long
LAST TIME CONTACTED
last time contacted
Datum a ˇcas posledn´ıho pouˇzit´ı kontaktu.
int
STARRED
starred
Indikuje zdali se jedn´a o obl´ıben´ y kontakt: ’1’ znaˇc´ı obl´ıben´ y kontakt, jinak ’0’.
String CUSTOM RINGTONE
custom ringtone
Odkaz na melodii specifickou pro kontakt.
int
SEND TO VOICEMAIL
send to voicemail
Indikuje, zdali m´a kontakt pˇri vol´ an´ı okamˇzitˇe spadnout do hlasov´e schr´anky’1’ pro ano, jinak ’0’.
int
CONTACT PRESENCE
contact presence
Status pro IM.
contact status
Status pro IM.
String CONTACT STATUS
zobrazen´e jm´eno kontaktu. Je to prim´ arn´ı jm´eno raw kontaktu, na kter´ y ukazuje NAME RAW CONTACT ID kl´ıˇc k ˇr´adku v tabulce ContactsContract.Data kde je uloˇzena fotka kontaktu.
ˇ v milisekund´ach od posledn´ı zmˇeny statusu pro Cas IM String CONTACT STATUS RES PACKAGE contact status res package Bal´ıˇcek poskytuj´ıc´ı zdroje pro status IM: popiska a ikona long CONTACT STATUS LABEL contact status label IDd popisku statusu pro IM long
CONTACT STATUS TIMESTAMP
contact status ts
long
CONTACT STATUS ICON
contact status icon
50
ID ikony statusu pro IM.
Pˇr´ılohy
C.2 Typ
Sloupce tabulky kontakt˚ u
Dostupn´ e pˇ res implicit-join
Jm´eno
hodnota*
v´ yznam
String DISPLAY NAME ALTERNATIVE display name alt
Alternativn´ı z´apis zobrazovan´eho jm´ena
String DISPLAY NAME SOURCE
display name source
Typ dat pouˇzit´ y jako zobrazovan´e jm´eno
String PHONETIC NAME
phonetic name
V´ yslovnost jm´ena pomoc´ı fonetick´e abecedy specifikovan´e ve sloupci PHONETIC NAME STYLE.
String PHONETIC NAME STYLE
phonetic name style
String SORT KEY ALTERNATIVE
sort key alt
String SORT KEY PRIMARY
sort key
fonetick´a abeceda pomoc´ı n´ıˇz je zak´odov´ ano PHONETIC NAME. kl´ıˇc ˇrazen´ı dle sloupce DISPLAY NAME ALTERNATIVE. kl´ıˇc k ˇrazen´ı dle zobrazovan´eho jm´ena
String CONTACT CHAT CAPABILITY
contact chat capability Schopnosti kontaktu v souvislosti s IM
String IS USER PROFILE
is user profile
Znaˇc´ı jestli je tento kontakt uˇzivatelsk´ ym profilem
String PHOTO FILE ID
photo file id
identifik´ator souboru fotky v pln´e velikosti
51
Pˇr´ılohy
D D.1 Typ long
Sloupce tabulky raw kontakt˚ u
Sloupce tabulky raw kontakt˚ u Z´ akladn´ı
Jm´eno ID
hodnota* id
v´ yznam vlastn´ı kl´ıˇc raw kontaktu
long
CONTACT ID
contact id
kl´ıˇc ukazuj´ıc´ı na tabulku ContactsContract.Contacts - ukazuje na kontakt pod kter´ y raw kontakt patˇr´ı.
int
AGGREGATION MODE
aggregation mode
Pomoc´ı konstant nastavuje automatick´e sluˇcov´an´ı kontakt˚ u.
int
DELETED
deleted
znaˇc´ı zdali je kontakt urˇcen k vymaz´an´ı ”0”pokud ne, ”1”pokud ano.
int
TIMES CONTACTED
times contacted
Poˇcet pouˇzit´ı kontaktu.
long
ˇ LAST TIME CONTACTED last time contacted Casov´ a zn´amka posledn´ıho pouˇzit´ı kontaktu
int
STARRED
starred
Urˇcuje zdali patˇr´ı raw kontakt mezi obl´ıben´e - ’1’ pokud ano, jinak ’0’ Speci´aln´ı vyzv´anˇen´ı pro raw kontakt.
String CUSTOM RINGTONE
custom ringtone
int
send to voicemail
Urˇcuje, zdali spadne volaj´ıc´ı raw kontakt rovnou do hlasov´e schr´ anky (’1’) nebo ne (’0’).
String ACCOUNT NAME
account name
Jm´eno u ´ˇctu ze kter´eho raw kontakt poch´az´ı (napˇr´ıklat gmail pro u ´ˇcet na googlu)
String ACCOUNT TYPE
account type
Typ u ´ˇctu ze kter´eho poch´az´ı raw kontakt (pro u ´ˇcet na googlu com.google)
String DATA SET
data set
Vyuˇz´ıv´a se pro identifikaci rw kontakt˚ u patˇr´ıc´ıch ke stejn´emu u ´ˇctu, ale k r˚ uzn´ ym adapt´er˚ um pro synchronizaci.
String SOURCE ID
sourceid
int
VERSION
version
identifik´ator vzhledem k uˇzivatelsk´emu u ´ˇctu. Vytv´aˇr´ı se na stranˇe servru. znaˇc´ı kolikr´at byl kontakt zmˇenˇen
int
DIRTY
dirty
SEND TO VOICEMAIL
String SYNC1
sync1
znaˇc´ı ˇze VERSION se zmˇenila, a kontakt je tˇreba synchronizovat se serverem. Generick´e sloupce pro potˇreby sync adapt´er˚ u.
String SYNC2
sync2
Generick´e sloupce pro potˇreby sync adapt´er˚ u.
String SYNC3
sync3
Generick´e sloupce pro potˇreby sync adapt´er˚ u.
String SYNC4
sync4
Generick´e sloupce pro potˇreby sync adapt´er˚ u.
52
Pˇr´ılohy
D.2 Typ
Sloupce tabulky raw kontakt˚ u
Dostupn´ e pˇ res implicit-join
Jm´eno
hodnota*
v´ yznam
String DISPLAY NAME ALTERNATIVE
display name alt
Alternativn´ı z´apis zobrazovan´eho jm´ena
String DISPLAY NAME PRIMARY
display name
Zobrazovan´e jm´eno kontaktu
String DISPLAY NAME SOURCE
display name source
Typ dat pouˇzit´ y jako zobrazovan´e jm´eno
String PHONETIC NAME
phonetic name
V´ yslovnost jm´ena pomoc´ı fonetick´e abecedy specifikovan´e ve sloupci PHONETIC NAME STYLE.
String PHONETIC NAME STYLE
phonetic name style
String SORT KEY ALTERNATIVE
sort key alt
String SORT KEY PRIMARY
sort key
fonetick´a abeceda pomoc´ı n´ıˇz je zak´odov´ ano PHONETIC NAME. kl´ıˇc ˇrazen´ı dle sloupce DISPLAY NAME ALTERNATIVE. kl´ıˇc k ˇrazen´ı dle zobrazovan´eho jm´ena
String RAW CONTACT IS USER PROFILE raw contact is user profile Oznaˇcuje jestli je tento raw kontakt souˇc´ ast´ı uˇzivatelsk´eho profilu.
53
Pˇr´ılohy
E E.1 Typ String
Sloupce tabulky dat
Sloupce tabulky dat Z´ akladn´ı
Jm´eno
hodnota*
ID
id
v´ yznam identifik´ator ˇr´adku
String MIMETYPE
mimetype
MIME typ z´aznamu
String RAW CONTACT ID
raw contact id
Kl´ıˇc k raw kontaktu ke kter´emu data patˇr´ı.
String IS PRIMARY
is primary
String DATA VERSION
data version
verze z´aznamu.
String DATA1
data1
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA2
data2
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA3
data3
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA4
data4
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA5
data5
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA6
data6
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA7
data7
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA8
data8
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA9
data9
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA10
data10
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA11
data11
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA12
data12
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA13
data13
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA14
data14
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String DATA15
data15
Generick´ y sloupec, jeho obsah z´aleˇz´ı na MIMETYPE dat.
String SYNC1
data sync1
Generick´ y sloupec pro sync adapt´ery.
String SYNC2
data sync3
Generick´ y sloupec pro sync adapt´ery.
String SYNC3
data sync2
Generick´ y sloupec pro sync adapt´ery.
String SYNC4
data sync4
Generick´ y sloupec pro sync adapt´ery.
Urˇcuje, zdali je tento z´aznam prim´arn´ım z´aznamem tohoto druhu v raw kontaktu. String IS SUPER PRIMARY is super primary Urˇcuje, zdali je tento z´aznam prim´arn´ım z´aznamem tohoto druhu v kontaktu - tedy ve vˇsech spojen´ ych raw kontaktech.
E.2
Dostupn´ e pˇ res implicit-join
54
Pˇr´ılohy
Typ
Sloupce tabulky dat
Jm´eno
hodnota*
v´ yznam
String DISPLAY NAME ALTERNATIVE
display name alt
Alternativn´ı z´apis zobrazovan´eho jm´ena
String DISPLAY NAME PRIMARY
display name
Zobrazovan´e jm´eno kontaktu
String DISPLAY NAME SOURCE
display name source
Typ dat pouˇzit´ y jako zobrazovan´e jm´eno
String PHONETIC NAME
phonetic name
V´ yslovnost jm´ena pomoc´ı fonetick´e abecedy specifikovan´e ve sloupci PHONETIC NAME STYLE.
String PHONETIC NAME STYLE
phonetic name style
String SORT KEY ALTERNATIVE
sort key alt
String SORT KEY PRIMARY
sort key
fonetick´a abeceda pomoc´ı n´ıˇz je zak´odov´ ano PHONETIC NAME. kl´ıˇc ˇrazen´ı dle sloupce DISPLAY NAME ALTERNATIVE. kl´ıˇc k ˇrazen´ı dle zobrazovan´eho jm´ena
String CUSTOM RINGTONE
custom ringtone
Odkaz na melodii specifickou pro kontakt.
String LAST TIME CONTACTED
last time contacted
Datum a ˇcas posledn´ıho pouˇzit´ı kontaktu.
String SEND TO VOICEMAIL
send to voicemail
Indikuje, zdali m´a kontakt pˇri vol´an´ı okamˇzitˇe spadnout do hlasov´e schr´anky’1’ pro ano, jinak ’0’.
String STARRED
starred
Indikuje zdali se jedn´a o obl´ıben´ y kontakt: ’1’ znaˇc´ı obl´ıben´ y kontakt, jinak ’0’.
String TIMES CONTACTED
times contacted
Kolikr´at byl kontak pouˇzit.
String CONTACT CHAT CAPABILITY
contact chat capability
Schopnosti kontaktu v souvislosti s IM
String CONTACT PRESENCE
contact presence
Status pro IM.
String CONTACT STATUS
contact status
Status pro IM.
String CONTACT STATUS ICON
contact status icon
ID ikony statusu pro IM.
String CONTACT STATUS LABEL
contact status label
IDd popisku statusu pro IM
String CONTACT STATUS RES PACKAGE contact status res package Bal´ıˇcek poskytuj´ıc´ı zdroje pro status IM: popiska a ikona ˇ v milisekund´ach od posledn´ı zmˇeny statusu pro String CONTACT STATUS TIMESTAMP contact status ts Cas IM int HAS PHONE NUMBER has phone number Indikuje zdali m´a kontakt telefon´ı ˇc´ıslo. ”1”pokud ano, jinak ”0” int
IN VISIBLE GROUP
in visible group
Indikuje zdali m´a b´ yt kontak zobrazen. ”1”pokud m´ a kontakt alespoˇ n jeden viditeln´ y raw kontakt, jinak ”0”. kliˇc slouˇz´ıc´ı k nalezen´ı kontaktu, pokud se jeho id zmˇen´ı v d˚ usledku slouˇcen´ı kontakt˚ u, nebo synchronizace identifik´ator souboru fotky v pln´e velikosti
String LOOKUP KEY
lookup
String PHOTO FILE ID
photo file id
long
PHOTO ID
photo id
long
PHOTO THUMBNAIL URI
photo thumb uri
kl´ıˇc k ˇr´adku v tabulce ContactsContract.Data kde je uloˇzena fotka kontaktu. Odkaz na n´ahled fotky slouˇz´ıc´ı ke zobrazen´ı
long
PHOTO URI
photo uri
Odkaz na fotku slouˇz´ıc´ı ke zobrazen´ı
55
Pˇr´ılohy
long
Sloupce tabulky dat
CONTACT ID
contact id
kl´ıˇc ukazuj´ıc´ı na tabulku ContactsContract.Contacts - ukazuje na kontakt pod kter´ y raw kontakt patˇr´ı.
String DATA SET
data set
Vyuˇz´ıv´a se pro identifikaci rw kontakt˚ u patˇr´ıc´ıch ke stejn´emu u ´ˇctu, ale k r˚ uzn´ ym adapt´er˚ um pro synchronizaci. String RAW CONTACT IS USER PROFILE raw contact is user profile Oznaˇcuje jestli je tento raw kontakt souˇc´ ast´ı uˇzivatelsk´eho profilu. String CHAT CAPABILITY
chat capability
Schopnosti kontaktu (audio, video. . . )
String PRESENCE
mode
Posledn´ı u ´roveˇ n pˇr´ıtomnosti kontaktu
String STATUS
status
Posledn´ı aktualizace statusu
String STATUS ICON
status icon
id na ikonu statusu
String STATUS LABEL
status label
id textu statusu
String STATUS RES PACKAGE
status res package
zdroj pro ikonu a text statusu
String STATUS TIMESTAMP
status ts
ˇcas posledn´ı zmˇeny statusu
String ACCOUNT NAME
account name
Jm´eno u ´ˇctu ze kter´eho raw kontakt poch´ az´ı (napˇr´ıklat gmail pro u ´ˇcet na googlu)
String ACCOUNT TYPE
account type
Typ u ´ˇctu ze kter´eho poch´az´ı raw kontakt (pro u ´ˇcet na googlu com.google)
int
dirty
znaˇc´ı ˇze VERSION se zmnˇenila, a kontakt je tˇreba synchronizovat se servrem.
String SOURCE ID
sourceid
int
version
identifik´ator vzhledem k uˇzivatelsk´emu u ´ˇctu. Vytv´ aˇr´ı se na stranˇe servru. znaˇc´ı kolikr´at byl kontakt zmˇenˇen
DIRTY
VERSION
String GROUP SOURCE ID
group sourceid
56
sourceid skupiny ke kter´e patˇr´ı tento ˇclen. Mus´ı b´ yt specifikov´ano, nebo mus´ı b´ yt specifikov´ ano GROUP ROW ID.