Foi utilizado o Android Studio 2.3.3 para este projeto. O projeto foi testado durante a fase de desenvolvimento com a versão 6.0 do android, num dispositivo físico (Moto G3)
Para construir o APK será necessário instalar no Android Studio algumas ferramentas da SDK. Para isto faça o seguinte:
- Abra o projeto no Android Studio
- Selecione Tools -> Android -> SDK Manager
- Clique na aba SDK Tools
- Marque as opções LLDB, CMake e NDK
- Clique em Apply e depois em OK
- Quando a instalação completar, clique em Finish e depois em OK
Os testes estão em java.com.bruno.desafiomuxi (androidTest). Para executar um teste basta clicar no mesmo com o botão direito e então clicar em Run 'nome do teste...'
Neste projeto foi utilizado o framework Volley da Google para a a requisição web do arquivo .json. O mesmo framework teria sido utilizado para a requisição dos arquivos de imagem, porém a própria Google colocou o módulo de requisição de imagens como obsoleto e não recomenda utilizá-lo, portanto para requisição de imagens foi utilizada a biblioteca Picasso. Estas duas bibliotecas têm a vantagem de serem simples e já oferecem cache para as suas requisições.
Para a serialização do arquivo .json foi utilizada a biblioteca Gson.
Para os testes foi utilizada a biblioteca JUnit, pois tem alta integração com o SDK do android, e para auxiliar na instrumentação de alguns testes foi utilizada a biblioteca Espresso
O projeto foi organizado em 4 pacotes
- Core: É o pacote que contém as Activities
- Currency: É o pacote que contém a classe responsável pelos câmbios entres moedas
- WebRequest: É o pacote que contém o framework de comunicação com a API
- Currency-converter: É a bibliteca com código nativo para conversão assíncrona entre valores monetários
As Activities do projeto têm suporte à mudança de orientação das telas sem perder estado. Na MainAcitivity como tem layout único, bastou adicionar no manifest android:configChanges="orientation|screenSize". A FruitDetailsActivity tem layout diferente para cada orientação, e portanto a persistência de estado foi implementada no próprio código.
No módulo da biblioteca nativa para conversão assíncrona de moeda, foi utilizado um recurso disponível no C++ a partir da padronização C++11 para criar threads, pois como é um recurso embutido na linguagem, reduz problemas com dependências de bibliotecas externas.