Android Espresso – první jednoduchý test

Testujete? Já se o to pokouším. Pro komplexnější testování UI prvků aplikace doporučuji nástroj Espresso.

Pokud vytvoříte v Android Studiu nový projekt, máte základ připraven. Android Studio vytvoří základní strukturu a základní testy automaticky. Jedná se o složky:

  • androidTest – do této složky dáváme UI testy. Používáme: Espresso a JUnit
  • test – do teto složky dáváme Unit testy, pro tyto testy používáme: Mockito, Robolectric a JUnit

Naše Espresso testy tedy budeme umísťovat do složky androidTest. Pro první test stačí do souboru build.gradle (ve složce app) přidat závislost:

Můj build.gradle vypadá takto:

Pojďme vytvořit náš první Espresso test. Otestujeme, zda TextView obsahuje text Hello World!

Test spustíme kliknutím pravým tlačítkem na soubor s testem v levé části Android Studia – Project. Nebo z příkazové řádky:

Azure DevOps – private agent pro Android build

Azure DevOps je sklělý nástroj pro vývojáře. Nabízí ZDARMA soukromé git repozitáře, nástroj pro tasky (řízení práce), a build nástroje. To vše “zdarma”. Kompletně jsem na tuto platformu přešel a jsem maximálně spokojený. Android aplikace automaticky po pushi do Gitu otestuji, provedu build a vydám novou vývojovou verzi. Build agent má však omezení na běh max. 10h/měsíc, na malé projekty bohatě dostačuje. Pokud jste náročnější a tento limit vám nestačí, jednoduše nainstalujete na svůj server svého soukromého agenta, který provádí build. Pak jste omezeni pouze výkonem vašeho serveru. Pojďme si zprovoznit soukromého agenta pro build Android aplikace:

Stáhneme a nainstalujete Java SDK

Stáhneme a nainstalujeme Android Studio

Přidání proměnných do Path

Pro build je nutné přidat do path následující proměnné: java, JAVA_HOME, JDK, AndroidSDK
Jak zjistím kde mám nainstalován Android SDK abych ho přidal do Path?
Android Studio -> Menu -> Tools -> SDK Manager -> položka Android SDK Location.
Do Uživatelsky definovaných proměnných v mém případě přidáme Název proměnné: ANDROID_HOME a Hodnota proměnné: C:\Users\Test\AppData\Local\Android\Sdk

do Path stejným způsobem přidáme ještě tyto hodnoty:
java : C:\Program Files\Java\jdk-11.0.2
JAVA_HOME : C:\Program Files\Java\jdk-11.0.2
JDK : C:\Program Files\Java\jdk-11.0.2

Po přidání mi build ještě nefungoval, bylo nutné provést restart zařízení.

Pokus o ruční build

Pro build by v cmd mělo fungovat (spustíme v root android projektu):
gradlew assembleDebug  nebo gradlew assembleRelease

Jak nainstalovat agenta

Nejprve musíme vytvořit token pro autentizaci agenta. Přihlásíme se do TFS a vpravo nahoře klikneme na uživatele -> Security ->Personal access tokens -> New Token. Vytvoříme nový token, kterému nastavíme expiraci (jde na max 1 rok?) a oprávnění. Zobrazí se nám token, který si uschovejte, budeme ho potřebovat pro agenta.

Na URL https://dev.azure.com/{your_organization}/_admin/_AgentPool (v mém případě je {your_organization} venca-x). Zde vidíme seznam agentů a jejich stav. Pro vytvoření nového agenta klikneme na tlačítko Download agent. Vybereme cílovou platformu a nainstalujeme podle postupu. Po nainstalování není nutné spouštět agenta jako administrátor. Instalace probíhá přes Windows PowerShell.

Jak zobrazím mé agenty a jejich dostupnost?

Jděte na adresu:
https://dev.azure.com/{your_organization}/_admin/_AgentPool kde v sekci Default vidíte vaše soukromé agenty a jejich stav. Po kliknutí na Capabilities vidíte všechny vlastnosti daného agenta. Zde je důležité aby byly vlastnosti:
java, JAVA_HOME, JDK, AndroidSDK

Composer – instalujeme fork balíčku

Dnes si ukážeme jak nainstalovat fork balíčku. Proč instalovat fork? Důvodů může být mnoho: nekompatibilita s PHP,
nekompatibilita závislostí balíčku, … Já konkrétně popíši řešení s knihovnou h4kuna/fio, která je závislá na “nette/utils”: “^2.2”, ovšem já používám vývojový “nette/utils”: “^3.0”, proto není možné balíček vůbec nainstalovat.

Na Githubu tedy uděláme fork h4kuna/fio, čímž se knihovna “zkopíruje” pod náš Github účet a můžeme do ni přispívat kódem(bez schválení původního autora). Uděláme tedy commit, který upraví h4kuna/fio aby byl použitelný: https://github.com/venca-x/fio/commit/627218b174f75f452b25c02b3699641865efaa02

Já konkrétně jsem upravil soubor composer.json (ve forknutém balíčku – v master větvi):
“nette/utils”: “^2.2” na “nette/utils”: “^3.0”
a jelikož používám vývojovou verzi Nette 3.0 přidal na konec:
“minimum-stability”: “dev”

Tím máme hotovo a můžeme tento forknutý balíček nainstalovat. Ale jak?
Do souboru composer.json v našem projektu přidáme závislost na balíček, který nám předtím předtím nešel nainstalovat (ve vývojové verzi, naši úpravu forknutého balíčku jsme pushli do master větve):
“h4kuna/fio”: “dev-master”
ale pro tento balíček dáme náš zdroj – forknutý repozitář:

Tím máme hotovo. Snad někomu pomůže stejně dobře jako mne 🙂


Android: Cleartext HTTP traffic to downloads.bbc.co.uk not permitted

Od Android 8 (Oreo) je defaultně zakázáno komunikovat po http – je nutné komunikovat po https. Pokud stahujete data ze zdroje, kde nemůžete ovlivnit nasazení https, lze toto pravidlo obejít přidáním níže uvedeného kódu do vaší aplikace.

Vytvoříme soubor: res/xml/network_security_config.xml

Do AndroidManifest.xm přidáme řádek: http://android:networkSecurityConfig=”@xml/network_security_config”

 

Retrofit: synchronní a asynchronní požadavky

Minule jsme si ukázali, jak použít Retrofit v Android studiu. Dnes se podíváme na synchronní a asynchronní požadavky.

Synchronní požadavek

Při synchronním požadavku, je na server odeslán požadavek, aplikace se “zastaví” a čeká, dokud neobdrží odpověď od serveru.

Asynchronní požadavek

Při asynchronním požadavku se používají tzv. callbacky. Na server se odešle požadavek (stejně jako při synchronním požadavku) ale nečeká se na odpověď a kód pokračuje dál. Na odpověď ze serveru čeká callback, který provede požadovanou operaci s odpovědí od serveru. Tento callback se může zavolat kdykoliv (odpověď od serveru trvá různě dlouho).

V kódu je vidět asynchronní volání, které je shodné jako v prvním seznámení s Retrofit, přibylo synchronní volání:

 

 

Android se nepřipojuje k WiFi síti bez internetu

Android od verze KitKat (4.4) se automaticky nepřipojuje k WiFi sítím, u kterých nezjistí dostupnost internetu. Asi to dává smysl, proč by se pojil k síti, která nemá internet? Raději zkusí jinou síť kde internet bude. Ale jak to vyřešit pokud chceme aby s k této síti připojoval? Uděláme malý hack, kterým nasimulujeme servery, na kterých Android zjišťuje, že je na internetu 🙂 Android po připojení zkontroluje URL (je natvrdo zadrátovaná v Androidu a může se měnit v závislosti na verzi Androidu). Pokud dostane zpět požadovanou odpověď, považuje WiFi síť za připojenou k internetu (i když internet nemá) 🙂

Požadavky na danou adresu jsou klasickým GETem a zařízení požaduje odpověď 204 (No content) to je celé. Jenže jak si tyto servery nasimulovat?

Nejjednodušší je v DNS překládat URL (clients3.google.com a connectivitycheck.gstatic.com) na náš server, kde spustíme nginx s touto konfigurací:

 

Android: zpřístupnění nově vytvořeného souboru přes USB v počítači

Řeším zajímavý úkol: vytvoř v Android zařízení soubor, který bude po připojení telefonu k PC vidět v PC a bude možné jej překopírovat z telefonu do PC.

Dejte si pozor, protože od Android 5 musíte jednotlivá oprávnění povolovat na vyžádání, my budeme potřebovat oprávnění pro ukládání na úložiště. Pro jednoduchost vynechám kód nutný pro získání oprávnění zápisu do úložiště.

Do AndroidManifext.xml přidáme oprávnění:

A jdeme na zdrojový kód (nezapomeňte kontrolovat oprávnění zápisu na úložiště – od SDK Android 5!):

Nejdůležitější příkaz je:

Tímto příkazem se soubor zviditelní mezi ostatními soubory a bude možné ho překopírovat do počítače

Debian 9 (stretch) – instalace php 7.1

V poslední verzi Debianu Stretch je defaultně php 7.0, pokud potřebujete novější 7.1, je možné jej bez kompilace zdrojových kódů nainstalovat přes balíčky:

Bower + Grunt + Colorbox

Dnes vám naznačím jak do projektů přidávám knihovny třetích stran  a jak spojuji css a js soubory, které následně minifukuji. Ukážeme se to na pluginu Colorbox který používám pro zobrazení detailu fotek v pop-up okně.

Nainstalujeme Colorbox přes bower:

Grunt task pro Colorbox

Pro zkopírování souborů používám balíček grunt-contrib-copy a pro minifikaci css do jednoho souboru grunt-contrib-cssmin:

Nejdůležitější část souboru Gruntfile.js:

Tím se nakopírují ohrají obrázky obrázky z ./bower_components/jquery-colorbox/example3/images/ do www/css/image, soubor bower_components/jquery-colorbox/example3/colorbox.css se zmnifikuje a připojí k souboru www/css/main.css a soubor bower_components/jquery-colorbox/jquery.colorbox-min.js připojíme k zminifikovanému souboru www/js/compiled.min.js

Do souboru s JS přidáme inicializaci Colorboxu (v mém případě main.js):

Parametr {rel:’gal’} označuje že se jedná o galerii. Pokud bude více odkazů s class=”colorbox” půjde mezi fotkami přepínat a nebude se muset pop-up okno zavírat.

Odkazu s obrázkem přidáme classu colorbox:

A je to 🙂