terça-feira, 29 de dezembro de 2015

2015 foi fantástico

Olá povo,

Criei esse blog para disseminar conhecimento, mas também como uma forma de registrar coisas importantes que aconteceram na minha vida profissional. E esse post é basicamente um resumo de mais um ano fantástico na minha vida, repleto de alegrias e realizações. Graças a Deus!
Conheci muita gente e reforcei os laços de amizade com outros, e tudo isso foi possível graças aos vários eventos que participei, das aulas que ministrei e as viagens que eu fiz.

No primeiro mês do ano aconteceu o lançamento do meu livro "Dominando o Android", e eu estava com um medo danado que o pessoal não gostasse... Mas felizmente o livro foi um sucesso (pelo menos para mim :) pois vendeu 2 mil exemplares em 7 meses. Eu não esperava vender nem os primeiros mil (sério!). Meu muito obrigado a todos que adquiriram!
Em março fui para Salvador participar do Linguágil onde falei de produtividade no Android por meio da utilização de bibliotecas. Palestra que explorei bastante durante o ano.
Nesse mesmo mês, começaram as aulas da primeira turma do curso de pós-graduação em mobile da Unibratec, onde ministrei a disciplina de Android.

Em maio, estava em João Pessoa no Androidos. Um evento muito bacana organizado pelos meus colegas Josias e Eduardo (entre outros). Parabéns e muito obrigado pelo convite!

Ainda em maio, tive o orgulho de participar mais uma vez do Google I/O (e eu não escrevi nenhum post!!! pqp) onde tivemos como grande novidade o lançamento do Android M. Sem dúvida o evento mais incrível do mundo. Mas antes, participei do GDG Dev Summit que reuniu o pessoal dos GDGs de todo o mundo!

Em junho, voltei a Salvador para participar do Intel Software Day e tive a honra de receber o convite para participar do programa de Innovators da Intel. Muito obrigado pela confiança Carrara e George! Espero reforçar essa parceria em 2016 falando das diversas ferramentas que a Intel possui para facilitar a vida dos desenvolvedores.

No mês de julho participei do The Developers Conference (ou simplesmente TDC) em São Paulo. Um dos maiores eventos do Brasil voltados para desenvolvedores. Na oportunidade ainda participei de um mini-curso muito legal de Intel Real Sense ministrado pelo meu amigo Felipe Pedroso.

Voltei a São Paulo em agosto para participar do Android Dev Conference. Organizado pela iMasters, foi maior evento sobre desenvolvimento Android da América Latina. Conteúdo de alto nível com uma organização impecável.
O evento seguinte foi o DevFest Nordeste em outubro aqui mesmo em Recife (ou Hellcife) :) Na oportunidade, falei sobre Google Play Services. Uma palestra que pretendo explorar um pouco mais ano que vem. Depois foi a vez do DevFest Sudeste em Belo Horizonte que foi show de bola!

Novembro foi a vez de visitar o Google em Mountain View pela terceira vez :) E continua sendo surreal para mim a cada visita. Quem sabe um dia não vou pra lá todo dia para trabalhar? \o/
No Google, participei do encontro mundial dos GDEs (Google Developer Experts) onde tive a fantástica surpresa de ser chamado ao palco para receber o reconhecimento do Google pelo meu trabalho no livro. Aconteceram alguns codelabs muito interessantes como: Beacons, Project Tango, CastBrilloe Weave.

Também participei do Android Dev Summit no Computer History Museum. Sem dúvida a melhor agenda de Android que eu vi na minha vida. Só os melhores caras do Google palestrando. Foi para fechar 2015 com chave de ouro.

Isso sem contar o lançamento da segunda edição do Dominando o Android. Revisado, ampliado e atualizado! ;)

Que venha 2016! E que ele seja tão bom (ou melhor) que 2015.
Feliz ano novo para todos!!!

4br4ç05,
nglauber

segunda-feira, 14 de dezembro de 2015

Android Support Annotations

Olá povo,

Vou tentar atualizar o blog com mais frequência com posts menores como este. É um assunto relativamente novo, mas pouco utilizado (e conhecido) pelos desenvolvedores (inclusive eu).

Por questões de performance, é recomendado que evitemos a estrutura "enum" em aplicações Android, substituindo-as por um inteiro (int).
Mas aí sempre vem a pergunta: e como restringir os valores? Por exemplo: digamos que a classe Encomenda possui um atributo chamado status que pode receber apenas os valores "aberto", "em trânsito", "cancelado" e "entregue".

Com as anotações do Android podemos definir uma constante do tipo int para cada status e depois informar no atributo que ele só poderá receber um desses valores.

Para utilizar as anotações do Android, adicione a seguinte dependência no build.gradle.
dependencies {
 ...
 compile 'com.android.support:support-annotations:23.+'
}

Agora vejamos o código a seguir:
class Encomenda {
    public static final int STATUS_ABERTO      = 0;
    public static final int STATUS_EM_TRANSITO = 1;
    public static final int STATUS_CANCELADO   = 2;
    public static final int STATUS_ENTREGUE    = 3;
    
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
            STATUS_ABERTO, 
            STATUS_EM_TRANSITO, 
            STATUS_CANCELADO,
            STATUS_ENTREGUE
    })
    public @interface Status {
    }

    @Status
    public int status;
}
A anotação @Retention indica onde a anotação atuará. No nosso caso, indicamos que ela é usada apenas no processo de compilação. Mas poderíamos utiliza-la em runtime. E com a anotação @IntDef estabelecemos os valores que podem ser utilizados pelo elemento que utilizar essa anotação. Por fim, anotamos o atributo "status" o @Status para restringir os valores que podem ser atribuídos a ele.
Desta forma, o código a seguir, daria erro pois 10 não é um valor de status válido:
Encomenda encomenda = new Encomenda();
encomenda.status = 10;
Com essa abordagem, você deixa de utilizar as enums e ainda deixa o seu código robusto evitando valores inválidos.

Mas isso é só o começo! A biblioteca de Android Suppport Annotations permite:
  • Validar se um parâmetro de método pode ser nulo ou não com @Nullable ou @NonNull;
  • Informar com @StringRes que um atributo do tipo int receberá o id de um texto do values/strings.xml;
  • Determinar se um método deve executar na main thread (com @UiThread ou @MainThread) ou em uma thread separada @WorkerThread;
  • Determinar que uma variável/atributo/método receberá o RGB de uma cor utilizando @ColorInt.
  • Informar que uma chamada necessita de uma permissão no AndroidManifest.xml utilizando @RequiresPermission.
E ainda tem muito mais! Mais informações vocês podem encontrar nos links abaixo:

4br4ç05,
nglauber