• Nebyly nalezeny žádné výsledky

Kapitola 5

Realizace

5.1 Oprávnění

Každá Android aplikace, která vyžaduje přístup k nějakému zdroji dat, musí tuto skutečnost deklarovat v souboru AndroidManifest.xml. Pokud žádá o citlivé oprávnění (jako je například přístup k lokaci), tak jeho udělení musí od verze 6.0 potvrdit uživatel zařízení.

Jádro vyžaduje pouze přístup internetu, což odpovídá oprávnění s názvem android.permission.INTERNET. V tomto případě je uděleno automaticky.

5.2 Knihovny a frameworky

Během realizace byla použita sada knihoven a frameworků třetích stran s cílem zrychlit vývoj aplikace. Následující sada knihoven je vyžadována pro korektní chod jádra aplikace.

Timber Velmi kompaktní knihovna, která zajišťuje zasílání zpráv do logu, kterému se říká logcat. Hlavní výhodou je, že umožňuje vypnutí logování v pro-dukční aplikaci. Zároveň lze různě upravovat chování – například v testovací verzi lze nastavit, aby chybové hlášky způsobily rovnou pád aplikace. V pro-dukci pak může být chyba kompletně ignorována nebo odeslána vývojáři.

Dagger Framework zajišťující vkládání závislostí (dependency injection).

V jádře se používá pro instantizaci sady proměnných v různých třídách. Kon-krétním příkladem může být pěticeConnectortříd z kapitoly 4.7.2. Vytváření instance třídy má v režii kompletně dagger, aplikace vytváří pouze modul, kde definuje, jak mají být vytvořeny zdrojové objekty.

5. Realizace

Ukázka kódu 5.1 obsahuje vytvoření třídyPublicConnector. Anotace@Inject konstruktoru třídyCredentialsRespositorypak zajistí, že objekt bude moci dagger přímo vytvořit.

@Module(subcomponents = ViewModelSubComponent.class) public class AppModule {

@Singleton

@Provides

PublicConnector providePublicConnector(PublicApi api, TaskManager manager) {

return new PublicConnectorImpl(api, manager);

} }

@Singleton

public class CredentialsRepository extends

BaseRepository<Void, Credentials> { private PublicConnector mConnector;

@Inject

public CredentialsRepository(PublicConnector connector) { mConnector = connector;

init();

} }

Kód 5.1: Využití knihovny dagger při inicializaci tříd

Android Architecture Components Tato trojice knihoven a jejich vyu-žití je popsáno v dřívější sekci 4.3.

ButterKnife S využitím anotací tato knihovna zajistí vyplnění referencí na příslušné objekty, které spoluvytvářejí UI aplikace. Odstraňuje tak nutnost manuálního hledání s použitím metodyfindViewById(int).

Gson Knihovna zajišťující převod vstupu z JSON formátu do objektu a na-zpět. Jádro ji využívá pro zpracování dat ze serveru a push zpráv.

OkHttp3 Robustní knihovna zajišťující komunikaci s vnějším světem, kon-krétně našim serverem. Řeší nastavení zabezpečení, ověření správnosti certi-42

5.2. Knihovny a frameworky fikátů. Umožňuje taktéž upravovat všechny odchozí požadavky pomocí návr-hového vzoru interceptor. V aplikaci tuto funkcionalitu využíváme pro vlo-žení hlaviček, které jsou popsány v sekci 4.7.1. Identifikátor zařízení vkládá DeviceIdInterceptor z ukázky kódu 5.2.

@Singleton

public class DeviceIdInterceptor implements Interceptor {

@Override

public Response intercept(@NonNull Chain chain) { if (mDeviceId != null) {

Request request = chain.request();

Request.Builder builder = request.newBuilder();

builder.addHeader(HEADER_DEVICE_ID, mDeviceId);

Kód 5.2: Návrhový vzor „interceptor“ v OkHttp3

Retrofit2 Nadstavba nad OkHttp3. Obsahuje sadu anotací, které lze použít pro vydefinování rozhraní volání na server. Přijaté odpovědi umí deserializovat do objektů s využitím knihoven třetích stran – u nás Gson.

5.2.1 Android support

Následující sada knihoven náleží do většího balíku. Součástí názvu starších z nich je i verze minimální systému, která byla podporována v době jejich prvního vydání. Dnes pro všechny platí minimální verze SDK 14 [28].

support-v4 Support knihovny poskytují zpětnou kompatibilitu sady funk-cionalit. Z knihovny support-v4 jsou v aplikaci využívány primárně UI kom-ponenty, například základní stavební kámen aplikace – Fragment, který byl uveden až s SDK 13. Kdysi byl díky ní dostupný takřka na všech verzích Androidu.

appcompat-v7 Účel knihovny appcomat je podobný jako u support-v4.

Mezi dvě nejpoužívanější třídy patříAppCompatActivityneboToolbar. Druhá ze zmíněných byla uvedena s SDK verze 21.

5. Realizace

recyclerview-v7 Komponenta RecyclerView nahrazuje starší ListView.

Jedná se o kontejner, který podporuje posouvání obsahu – tzv. scrolling.

Oproti svému předchůdci je značně rozšiřitelnější a podporuje jednoduchou detekci gest na svých dětech.

design Design knihovna obsahuje sadu UI prvků, které vycházejí z material designu – seznam všech dostupných komponent a jejich možnosti využití jsou dostupné na oficiálním webu material.io1.

constraint-layout Constraint layout je jeden z nejnovějších layoutů. Sjed-nocuje mnoho funkcí ostatních layoutů, které jsou aktuálně dostupné a přibli-žuje vytváření UI více k iOS. Je využit jako kořenový prvek na přihlašovací obrazovce.

annotations Knihovna, která poskytuje sadu anotací. Využívají se napříč celým kódem a část z nich je popsána v sekci 4.1.3.

5.3 Asynchronní operace

Při práci s větším množstvím dat, databází, soubory nebo zdroji mimo úlo-žiště zařízení je třeba využívat vlastní vlákno či proces. V případě internetu je dokonce toto pravidlo vynucováno systémem a jeho porušení vyvolá výjimku, která způsobí pád aplikace. Díky využití knihovny Room dochází k podob-nému chování i v případě práce s databází.

Samotný systém Android vývojářům dává spoustu možností, jak řešit práci mimo hlavní vlákno. Využít lze například tradiční Java přístup – spustit si vlastní vlákno (Thread) a předat mu práci skrze rozhraníRunnable. Dále lze použít systémové třídy – napříkladIntentService,Loader,AsyncTasknebo si založit vlastníHandlerThreada řídit si tak životní cyklus vlastního vlákna.

V aplikaci Daywork využíváme právě potomka třídyAsyncTaska rozšířili jsme jej o funkcionalitu, která nám usnadňuje práci s chybami API. Zároveň vznikla pomocná třídaTaskManager, která řeší spouštění jednotlivých asynchronních požadavků.

Všechny požadavky mají v prvé řadě svůj identifikátor, který je využit při rozhodování, jestli má být požadavek zpracován ihned, později nebo nikdy.

TaskManager dokáže spouštět požadavky se stejným identifikátorem třemi způsoby:

• paralelně – ke spuštění dojde vždy a ihned, pokud je volné vlákno,

1https://material.io/components/android/catalog/

44

5.4. Nasazení

• sériově – jestliže aktuálně běží požadavek se stejným identifikátorem, počká se na jeho dokončení, a následně se spustí další ve frontě,

• unikátně – pokud je požadavek s daným id již spuštěn, tak je nově příchozí zahozen.

Unikátní exekuce je v jádře hojně využívána a řeší častý use-case, kdy uživatel několikrát klepne na tlačítko pro odeslání dotazu na server. Normálně by se požadavek vykonal několikrát, v tomto případě dojde k odeslání dotazu pouze jednou.

5.4 Nasazení

Díky modularitě aplikace je jádro jednoduše oddělitelné od dalších částí, které jsou paralelně vyvíjeny. Jádro komunikuje s Daywork serverem, který je na-psán ve smalltalku. Pro příjem push zpráv je nutná závislost na další aplikaci v zařízení, která se jmenuje Google Play Services. Ta zajišťuje komunikaci s Firebase serverem a příjem zpráv, které mu posílá webový server.

«device»