terça-feira, 20 de setembro de 2016

Constraint Layout no Android Studio 2.2

Olá pessoal,

Com o lançamento do Android Studio 2.2, resolvi fazer um vídeo falando um pouquinho sobre o novo gerenciador de layouts do Android: o ConstraintLayout.
O vídeo é um pouquinho longo (25min) e mostra como criar um layout de uma tela do aplicativo do Netflix utilizando o ConstraintLayout no novo editor visual do Android Studio.
Como é algo relativamente novo, qualquer feedback é muito bem vindo.


Esqueci de falar no vídeo que o ConstraintLayout é compatível com o Android 2.3 e superior.

Mais informações:



Bug report:



Errata:

  • No vídeo foi quando falei "Auto run" ao invés de "Instant Run".


Qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

segunda-feira, 5 de setembro de 2016

DevFest Nordeste 2016




Olá povo,

GDG DevFest é uma iniciativa do Google em parceira com os GDGs (Google Developer Groups) de todo o mundo para oferecer grandes eventos para a comunidade de desenvolvedores. A temporada dos DevFests acontece entre 1 de setembro e 30 de novembro, e no Brasil ele acontecerá em diversas regiões do país. No nordeste, o evento já aconteceu em Aracajú (2014), Recife (2015) e esse ano o DevFest Nordeste será realizado em Maceió-AL, nos dias 21 e 22 de outubro no Pratagy Beach Resort e contará com grandes palestrantes de várias partes do Brasil. Serão discutidos temas relacionados as tecnologias web, backend, mobile, UX e muito mais.
Eu participarei do evento com a palestra "Dominando o Data Binding no Android" onde veremos como otimizar a implementar a lógica da interface gráfica do aplicativo de forma mais fácil, rápida e menos sujeita a bugs. Para conferir a programação completa, clique aqui.

Para obter mais informações, consulte o site oficial do evento.
Você não vai perder essa oportunidade de aprender e fazer parte dessa grande comunidade de desenvolvedores, não é?

Nos vemos lá! ;)

4br4ç05,
nglauber

terça-feira, 30 de agosto de 2016

Certificação Android da Udacity

Olá pessoal,

No Google I/O 2016 foi anunciada a primeira certificação para desenvolvedores Android. O nome da prova é Associate Android Developer Exam e é mantida pela Udacity em parceria com o Google. O intuito dessa certificação é tornar mais fácil para empresas encontrar desenvolvedores qualificados, e obviamente, "provar" que o desenvolvedor possui o conhecimento necessário para criar aplicativos seguindo os padrões recomendados.



Por curiosidade, resolvi fazer essa prova para saber o nível de dificuldade e até orientar meus alunos e demais desenvolvedores interessados na certificação. Sendo assim, o objetivo desse post é dar meu feedback sobre essa prova.
A preparação sugerida para a prova é fazer os cursos da Udacity, que em sua maioria tem o material (vídeos) gratuitos. Essa formação também é conhecida como Nanodegree. Esses cursos são:
Apenas os dois primeiros cursos dessa lista são necessários para a prova, então recomendo bastante vocês assistirem. Mas pela minha experiência nessa prova, se você aprendeu Android com o livro do Ricardo Lecheta ou com o "Dominando o Android", fará esse exame sem problema. Creio que esses outros cursos serão abordados nas próximas certificações (que ainda não foram lançadas).

A avaliação é bem diferente das provas de certificação Java (Mobile, Programmer e Web) da Sun/Oracle, pois não é composta de uma série de perguntas de múltipla escolha e com um monte de "pegadinhas". Na certificação Android você recebe um projeto (bem pequeno, com cerca de 12 classes) com algum código já pronto. Então você precisa implementar funcionalidades e corrigir alguns bugs. O prazo para isso é de 48 horas, então reserve um tempo livre para fazer o exame.

Os assuntos utilizados na prova estão em um nível bem básico. São eles: criação de layouts simples, utilização da pasta de recursos, criação de adapter para RecyclerView, definição de menu, ContentProvider usando SQLite, SharedPreferences, trabalhar em background, IntentService, JobScheduler, Notification, AppWidgets e testes com Espresso. Ou seja, a prova é bem abrangente, mas não exige um profundo conhecimento desses assuntos (principalmente sobre testes). Achei interessante eles não cobrirem/pedirem nada sobre fragments.

Uma vez preparado para realizar a prova, basta se registrar e pagar a taxa. O valor é de US$149 mas, segundo a Udacity, até 31 de dezembro de 2016, o valor cobrado será de US$ 99.
Ao começar a prova, será exibida uma lista de requisitos a serem implementados na aplicação. Você terá que: alterar telas existentes, criar uma nova tela, implementar um adapter, alterar um Content Provider, executar um Service, disparar notificações, agendar serviços, corrigir alguns bugs e escrever um teste simples.

Concluído o projeto, você terá que enviá-lo em um arquivo zip (apague as pastas build e app/build), escanear um documento seu (eu usei minha CNH) e enviá-lo em formato PDF. Feito isso, será feita uma avaliação (tanto automática, quanto por pessoas) do seu projeto e você receberá o resultado para saber se seu projeto cumpre o que foi requisitado ou se precisa de modificações. Se ele cumprir todas as especificações, você irá para a fase de entrevista onde você poderá explicar como você implementou seu projeto. Pelo que sei, por enquanto a entrevista é apenas em inglês, mas parece que a Udacity já está trabalhando para fazê-la também em português. Sendo aprovado na entrevista, você receberá sua certificação. Segundo a Udacity, espera-se que todo esse processo dure no máximo 45 dias.

Ainda estou aguardando o resultado da avaliação e consequentemente a entrevista. Assim que for andando o processo, vou atualizando o post aqui.

Enfim, achei o nível da prova bem bacana para uma certificação de entrada. E acho que qualquer dev com 1 ano (ou até menos) de experiência consegue fazer.

[ATUALIZAÇÃO 27/09/2016]
Recebi um email da Udacity para “verificar minha identidade”. Basicamente eles pedem para que você envie uma foto da sua identidade/carteira de motorista/passaporte. Pode ser tirada com a webcam do computador ou escaneada. Enviei a foto do passaporte para não ter o risco de problema com “documento brasileiro”. Após enviar a foto do documento, eles pedem uma foto sua. Tirei ambas com a webcam e enviei. Minutos depois, recebi um email informando que minha identificação tinha sido confirmada com sucesso. Agora creio que a próxima etapa será a entrevista

4br4ç05,
nglauber

terça-feira, 12 de julho de 2016

Minhas Aulas de Android no YouTube

Olá pessoal,

Quando estava preparando minhas aulas de iOS (isso mesmo, já ministrei aulas de iOS ;) procurei por uma boa referência atualizada sobre o assunto e achei as aulas da Universidade de Stanford disponíveis no iTunes. Ótimas por sinal.
Seguindo esse exemplo, resolvi também gravar minhas aulas de Android na Unibratec e disponibiliza-las no YouTube. A gravação não tem nenhuma edição, é apenas meu desktop com o áudio no microfone embutido do computador. São 19 vídeos com mais de 20h de conteúdo.
As aulas mostram desde os conceitos mais básicos, com a construção de pequenos aplicativos de exemplo, até o desenvolvimento de um projeto simples, mas que possui: uma UI diferenciada para smartphones e tablets; acesso a um servidor web para realizar a leitura de um arquivo JSON; utilização de algumas bibliotecas famosas do Android como Butter Knife, Otto, OkHttp, etc.; e persistência de dados no banco de dados SQLite.


Espero que gostem!

4br4ç05,
nglauber

segunda-feira, 20 de junho de 2016

Androidos 2016

Olá pessoal,

No próximo dia 02 de julho, na Unipê em João Pessoa - PB, participarei pelo segundo ano consecutivo do Androidos! Um dos melhores eventos do Nordeste voltados para desenvolvedores Android e abordará temas muito legais do desenvolvimento de aplicações Android tais como: arquitetura, programação reativa, serviços de cloud, e muito mais.
Este ano, o Androidos contará com a participação de três Google Developer Experts em Android do Brasil: Marcelo Quinta (de Goiás), Ubiratan Soares (de São Paulo) e eu ;) Isso sem falar na ilustre participação do Josias Paes (Unipê) e do Gustavo Soares (IFPB).


Farei duas participações durante o evento: a primeira com uma palestra sobre Data Binding e log em seguida participarei de um Fireside chat, onde o público poderá fazer perguntas e tirar suas próprias dúvidas sobre Android.

Se você é desenvolvedor Android, não poder perder essa oportunidade. Mais informações no site do evento. Nos vemos lá!

[EDITADO 08/07/2016]
Slides da minha palestra.


O código-fonte do projeto mostrado nos slides está no meu GitHub.
https://github.com/nglauber/playground/tree/master/android/LivrosFirebase

4br4ç05,
nglauber

sexta-feira, 17 de junho de 2016

Firebase com Android

Olá povo,

Estava com vontade de escrever uns posts sobre Firebase aqui para o blog, mas achei que eles ficariam muito grandes. Então resolvi gravar alguns vídeos, com praticamente nenhuma edição, exceto alguns cortes que eu fiz pela demora na compilação/execução da aplicação.

É uma série com quatro vídeos onde abordo três dos principais serviços do Firebase: autenticação (Auth), armazenamento de arquivos (Storage) e o banco de dados em tempo real (RealTime database).

A ideia aqui foi criar um cadastro de livros do zero, onde o usuário deve realizar o login utilizando sua conta do Google para acessar a aplicação. O cadastro permite digitar o título do livro, o autor, e fazer o upload da capara do livro, obtida tirando uma foto com a câmera do aparelho. Para persistir as informações utilizamos o banco de dados do firebase, e para armazenar as imagens das capas do livro usamos o serviço de storage. O resultado ficou como abaixo:

     

Como vocês podem/vão notar, não me preocupei muito com a UI. Mas isso é uma melhoria que posso fazer nos próximos vídeos. Se vocês gostarem, posso evoluir esse aplicativo e/ou mostrando mais recursos do Firebase (como o analytics, crash report, login com facebook, etc).
Então, deixem seus comentários e espero que gostem! ;)



[EDITADO 08/07/2016]
O código desse exemplo (melhorado) encontra-se no meu GitHub:
https://github.com/nglauber/playground/tree/master/android/LivrosFirebase

4br4ç05,
nglauber

segunda-feira, 13 de junho de 2016

Chrome Custom Tabs para Android

Olá povo,

Mais um post rápido :) Quando precisamos abrir uma URL dentro de uma aplicação Android normalmente utilizamos uma Intent como a seguir:
Intent it = new Intent(Intent.ACTION_VIEW, 
                       Uri.parse("http://www.nglauber.com.br"));
startActivity(it);
O problema de usar essa abordagem é que exige o carregamento de outro aplicativo (o que é pesado computacionalmente falando) e fará com que o usuário deixe seu aplicativo, o que não é bom. Outro ponto negativo é que uma vez que você não tem acesso ao outro aplicativo (o browser nesse caso), você não consegue fazer nenhuma customização.

Uma outra abordagem é utilizar o componente WebView.
WebView webView = (WebView)findViewById(R.id.webView);
webView.loadUrl("http://www.nglauber.com.br");
webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        view.loadUrl(url);
        return false; 
    }
});
Nesse caso você possui um controle maior, uma vez que tudo é feito dentro do seu aplicativo. Entretanto, você terá que fazer vários controles para a navegação (como eu fiz aqui tratando o redirecionamento de página). Um problema aqui é que o WebView não compartilha a sessão do browser.

Chrome Custom Tabs junta os pontos positivos de ambas as abordagens, pois permite o controle da experiência web dentro do seu aplicativo. Com essa API podemos: definir transições customizadas; personalizar título; adicionar ações personalizadas; fazer um pré-carregamento da página para agilizar o carregamento; entre outros.
Como pode-se imaginar, esse recurso só funcionará se o usuário possuir o Chrome instalado no aparelho. Caso contrário, será disparada a Intent que mostramos no início do post.
 Para usar o Chrome Custom Tabs, a primeira coisa a fazer é adicionar a dependência no build.gradle.
dependencies {
    ...
    compile 'com.android.support:customtabs:23.3.0'
}
Então é só chamar a aba como a seguir:
String url = "http://www.nglauber.com.br";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();

// Definindo a cor da toolbar (opcional)
builder.setToolbarColor(ActivityCompat.getColor(this, R.color.colorPrimary));

// Adicionando uma ação/menu (opcional)
Bitmap icon = BitmapFactory.decodeResource(
        getResources(), android.R.drawable.ic_menu_agenda);
PendingIntent pit = PendingIntent.getActivity(
        this, 0, new Intent(this, MainActivity.class), 0);

// Ação
builder.setActionButton(icon, "Ação", pit, true);
// Menu
builder.addMenuItem("Menu", pit);

// Definindo animações (opcional)
builder.setStartAnimations(this, 
        R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(this, 
        R.anim.slide_in_left, R.anim.slide_out_right);

// Abrindo a "aba"
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

Como podemos observar, é bastante simples criar as custom tabs do Chrome. Criamos uma instância da classe CustomTabsIntent.Builder e com ela criamos podemos customizar a aba da maneira que desejarmos. Primeiro definimos a cor do título usando o método setToolbarColor(int). Em seguida instancimamos um Bitmap e uma PendingIntent que podem ser utilizadas para adicionar uma ação ou uma opção de menu na barra de título. A ação é adicionada por meio do método setActionButton(Bitmap,String,PendingIntent,boolean) e o menu por meio do método addMenuItem(String,PendingIntent).
As animações foram definidas utilizando o método setStartAnimations e setExitAnimations. Essas animações foram definidas como a seguir:
// res/anim/slide_in_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

// res/anim/slide_in_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

// res/anim/slide_out_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

// res/anim/slide_out_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>
Por fim, criamos uma instância da classe CustomTabsIntent e com o método launchUrl(Activity, Uri) abrimos essa nova aba.
Abaixo podemos ver a aplicação em execução.

Mais detalhes aqui:
https://developer.chrome.com/multidevice/android/customtabs

4br4ç05,
nglauber