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

domingo, 25 de outubro de 2015

DevFest Sudeste 2015


Olá povo,

No dia 24 de outubro de 2015 participei do GDG DevFest Sudeste. Eu participei do evento apresentando uma palestra sobre desenvolvimento para Android Wear.
Mas sem sobra de dúvida, a melhor parte do evento é rever os amigos e conhecer gente nova e falar de tecnologia com o pessoal :)
Gostaria de agradecer o convite parabenizar todos os organizadores e participantes do evento.



4br4ç05,
nglauber

sexta-feira, 25 de setembro de 2015

DevFest Nordeste 2015



Olá povo,

O 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. Esse ano, a temporada de DevFests acontecerá entre 1 de setembro e 30 de novembro.
Aqui no Brasil, teremos pelo menos um DevFest em cada região do país. E o DevFest Nordeste 2015 será realizado em Recife, no dia 17 de outubro no Recife Antigo e contará com grandes palestrantes de várias partes do Brasil. Serão três trilhas onde serão discutidas tecnologias web, mobile e muito mais.
Eu participarei do evento com a palestra "Google Play Services Rocks!!!" onde vamos ver como adicionar funcionalidades fantásticas ao seu aplicativo utilizando as APIs do Google.

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

Nos vemos lá! ;)

[EDITADO 17/10/2015]


4br4ç05,
nglauber

segunda-feira, 27 de julho de 2015

Android Conference 2015

Olá pessoal,

No dia 29 de agosto acontecerá em São Paulo o Android Dev Conference 2015 organizado pelo iMasters em parceria com o GDG São Paulo. Este é um dos principais eventos do Brasil sobre desenvolvimento Android e reunirá cerca de 800 desenvolvedores. O objetivo é abordar temas avançados sobre Android de modo a disseminar esse conhecimento com comunidade de desenvolvedores de modo a aumentar a produtividade e melhorar a qualidade das aplicações desenvolvidas.

Eu participarei do evento juntamente com grandes palestrantes do Brasil que trabalham nas maiores empresas do país. As inscrições estão abertas! Não perca mais essa oportunidade de aprender e aumentar o networking ;)

Nos vemos lá!

[EDITADO 31/08/2015]
Slides da apresentação.


[EDITADO 29/12/2015]


4br4ç05,
nglauber

segunda-feira, 13 de julho de 2015

FreeTec 2015

Olá povo,

A Unibratec está promovendo o FREETEC 2015 com palestras e mini-cursos gratuitos. Eu vou estar lá no próximo dia 30/07 para ministrar um codelab de Android (4 horas). Infelizmente as vagas já esgotaram para esse mini-curso :( Mas tem um monte de coisa boa lá! Dá uma conferida na programação completa e inscreva-se já ;)

[Editado 31/07/2015]
O código fonte que fizemos em sala pode ser baixado aqui!


4br4ç05,
nglauber

The Developers Conference

Olá pessoal,

A movimentação aqui no blog esse ano está um pouco devagar, principalmente por conta de trabalho, estudos e por uma mudança de endereço que me deixou num corre-corre danado. Então só está dando tempo pra avisar por onde vou estar falando de Android Brasil à fora.

Entre os dias 21 e 25 de julho participarei do TDC (The Developer's Conference) na Universidade Anhembi Morumbi em São Paulo. Um dos maiores eventos do Brasil voltado para desenvolvedores. São mais de 40 trilhas, com 9 horas de conteúdo em cada uma.
No primeiro dia falarei sobre como acelerar a produtividade no desenvolvimento de aplicações Android utilizando bibliotecas que não estão no Android SDK. E nos dias 23 e 24 participarei do Hands-on Lab de Real Sense ministrado pelo meu amigo Felipe Pedroso.

4br4ç05,
nglauber

quinta-feira, 4 de junho de 2015

Intel Software Day 2015


Olá povo,

Nos dias 12 e 13 de junho acontecerá em Salvador o Intel Software Day, um evento sobre tecnologia, inovação e muito desenvolvimento de software, que tem como objetivo levar o que existe de mais novo ao ecossistema de tecnologia brasileiro através de trilhas técnicas e workshops sobre temas como Android, Internet das Coisas, HPC, RealSense e Windows.

Vou participar do evento falando de "Produtividade com Android Libs". Onde vou apresentar a principais bibliotecas utilizadas no desenvolvimento de aplicativos Android.

Também estarão lá meu amigos Tiago Barros (CESAR), Ubiratan Soares (GDE Android), Ricardo Lecheta, e muitas outras feras!

[EDITADO 12/06/2015]




4br4ç05,
nglauber

segunda-feira, 13 de abril de 2015

Explorando libs famosas: Butter Knife

Olá povo,

Nesse post vou falar de mais uma lib famosa entre os desenvolvedores Android.

Butter Knife (http://jakewharton.github.io/butterknife/)
Com ela, você não precisa mais utilizar o bom e velho findViewByid(int) e nem o setOnClickListener ou setOnItemClickListener.
Adicione a dependência no seu build.gradle.
dependencies {
    ...
    compile 'com.jakewharton:butterknife:6.0.0'
}
Depois é só utilizar na sua activity.
public class MainActivity extends ActionBarActivity {

    @InjectView(R.id.edtTexto)
    EditText editText;

    @InjectView(R.id.txtManteiga)
    TextView txtManteiga;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
    }

    @OnClick(R.id.btnFaca)
    public void meuClick(View v){
        txtManteiga.setText(editText.getText());
    }
}
Partindo do presuposto que temos um EditText, um TextView e um Button, com os respectivos IDs definidos como edtTexto, txtManteiga e btnFaca. O código anterior utiliza a anotação @InjectView para inicializar os componentes após a chamada ButterKnife.inject(this).
Um outro detalhe aqui é o evento de click que podemos definir com a anotação @OnClick.

Podemos utilizar o @Inject não apenas em Activities, mas em qualquer lugar passando a View como parâmetro.
View view = inflater.inflate(
    R.layout.meu_layout, container, false);
ButterKnife.inject(this, view);
O código anterior, poderia estar, por exemplo em um Fragment ou no construtor de um ViewHolder de um adapter.
É importante resetar a injeção das views em Fragments, e isso deve ser feito preferencialmente no onDestroyView().
@Override 
public void onDestroyView() {
  super.onDestroyView();
  ButterKnife.reset(this);
}
Também é possível associar evento de click em itens de uma ListView.
@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {
  // TODO ...
}
Qualquer dúvida, deixem seus comentários.

4br4ç05,
nglauber

segunda-feira, 30 de março de 2015

Explorando libs famosas: Otto

Olá povo,

Acho que todos que me conhecem sabem que eu não sou muito fã de usar libs de terceiros. Principalmente porque na grande maioria das vezes, é mais fácil você entender apenas o código que é puramente Android, do que ter que lembrar ou saber como uma lib realiza determinado comportamento.
Mas como muita gente gosta, resolvi fazer uma série de posts com algumas bibliotecas Android mais famosas no mercado. E pra começar, vamos falar do Otto.

Otto (http://square.github.io/otto/)
Permite registrar e disparar eventos de/para qualquer parte da aplicação. Adicione a dependência a seguir.
dependencies {
  compile 'com.squareup:otto:1.3.6'
}
A primeira coisa a fazer é instanciar um objeto da classe Bus. Um bom local para fazer isso é na classe que herda de Application (lugar perfeito iniciar os singletons).
import android.app.Application;
import com.squareup.otto.Bus;

public class ExplorandoLibsApp extends Application {

  private Bus bus;

  @Override
  public void onCreate() {
    super.onCreate();
    bus = new Bus();
  }

  public Bus getBus() {
    return bus;
  }
}
Não esqueça de declarar essa classe no AndroidManifest.xml.
 
<application
  ...
  android:name=".ExplorandoLibsApp">
Qualquer classe pode ser enviada como evento...
public class UmaClasseQualquer {

  private String mTexto;

  UmaClasseQualquer(String texto) {
    mTexto = texto;
  }

  public String getTexto() {
    return mTexto;
  }
}
E todo método que assinar um evento será notificado. Para assinar um evento, use a anotação @Subscribe. E para disparar o evento utilize o método post(evento) do objeto Bus.
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;

public class MainActivity extends ActionBarActivity {

    private Bus mBus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      mBus = ((ExplorandoLibsApp)getApplication())
             .getBus();
      mBus.register(this);
    }

    public void dispararEventoOtto(View v){
      mBus.post(new UmaClasseQualquer("Mensagem"));
    }

    @Subscribe
    public void chegouEvento(UmaClasseQualquer event) {
      Toast.makeText(this, event.getTexto(), 
        Toast.LENGTH_SHORT).show();
    }
}
Obtemos a instância do Bus no onCreate() e informamos que essa classe ouvirá eventos do Bus por meio do método register. O método dispararEventoOtto() é invocado ao clicar em um botão, e nele disparamos o evento chamando o método post(). Quando isso ocorre o método chegouEvento() é invocado.

Outra biblioteca que realiza o mesmo trabalho é o EventBus.

Podemos realizar comportamento similar utilizando as classes BroadcastReceiver e LocalBroadcastManager.

4br4ç05,
nglauber

terça-feira, 17 de março de 2015

Xiaomi MI4

Olá povo,

Eu testei durante duas semanas o MI4, telefone da chinesa Xiaomi e nesse post vou descrever minha opinião sobre esse aparelho.

As especificações são bem generosas a começar pelo seu tamanho. As dimensões do smartphone são 68.5/8.9/139.2mm. O MI4 vem com um processador Snapdragon Quad-Core de 2.5GHz, 3GB de RAM, armazenamento de 16GB a 64GB e uma bateria de 3080mAh. A tela é gigante de 5" (sem botões na tela) e com uma resolução de 1920x1080 (441ppi) traz uma boa nitidez. As câmeras traseira e frontal de 13MP e 8MP respectivamente são bem interessantes e fabricadas pela Sony.

O MI4 vem com o Android 4.4 MIUI, uma customização do Android padrão, similar ao que temos nos aparelhos da Samsung (que usa o TouchWiz). É notório o objetivo da ROM em copiar o visual e alguns comportamentos do iOS. O que é mais perceptível pelo o usuário que já esteja acostumado com o Android é a ausência do menu de aplicativos, dessa forma, todos os aplicativos ficam na home screen como acontece no iOS (o que eu particularmente não gosto). Entretanto, os widgets do Android como relógio, Gmail, etc., podem ser adicionados à homescreen normalmente.

Um ponto positivo (pelo menos para mim que tenho um Nexus 5) foi a bateria. O MI4 aguentou mais de 24 horas com todos os recursos ligados: Wi-Fi, 4G e Bluetooth (uso no Android Wear). Mas infelizmente você não pode trocar (como em alguns aparelhos da Samsung).

A câmera frontal tem um recurso interessante: detecção de face e sugestão de idade. Tá... eu tô acabadinho mesmo :(

A tela gigante (ainda mais sem os botões lógicos, substituídos pelos botões físicos) traz o problema de alcançar as opções da tela com o "dedão". O MIUI resolve isso com um recurso bem interessante (similar ao do iOS) que é reduzir a área de toque, bastando para isso deslizar da esquerda pra direita na área dos botões físicos.


Uma coisa que me deixou muito decepcionado foram as notificações. Esse recurso do Android que eu sou fã de carteirinha foi "capado" no MIUI. Elas não expandem e não mostram as ações associadas (como o excluir/arquivar do Gmail), então eu só tenho a opção de clicar na notificação ou dispensa-la.

Testei também a Xiaomi Wristband, uma pulseira que calcula a quantidade de passos percorridos durante o dia, vibra ao disparar alarmes e funciona como "smart unlock", ou seja, enquanto você estiver com a pulseira, não precisa digitar o padrão de desbloqueio. Outro recurso bacana da pulseira é monitorar o seu sono! Ao usá-la enquanto dorme, ela monitora quanto tempo você dormiu em sono leve, profundo e quando acordou. Segundo o fabricante, a bateria da pulseira dura 30 dias, e enquanto usei, realmente não precisei carregar.
O aplicativo chamado MiFit sincroniza os dados com a pulseira e exibe um relatório diário do seus passos. Uma pena que ele não foi traduzido para português.
Outro ponto negativo do aparelho são os aplicativo de contatos/telefone. Eles aparentam ser bem mal-acabados. Principalmente se comparados aos do Android nativo.
Você pode personalizar o sistema por meio de temas que podem ser baixados gratuitamente.

Um ponto negativo ao meu ver foi a ausência do Google Now na home screen. Tentei usar comandos de voz pelo aparelho e pelo Android Wear e não consegui.

E você o que achou? Possui um MI4? Mande suas dúvidas ou sugestões! ;)

4br4ç05,
nglauber

quinta-feira, 5 de março de 2015

Dominando o Android: Atualização 3

Olá povo,

Seguem mais algumas sugestões de melhorias enviadas pelos leitores do livro.

Capítulo 2
Página 61. Ao clicar no botão de aplicativos recentes, os métodos onPause e onStop são chamados. E não apenas o onPause como falei no texto! A documentação é bem clara sobre isso... Burrice minha :(

Capítulo 4
Página 116. Ficaria mais claro se eu tivesse colocado "os parâmetros before e after dizem o tamanho anterior e atual da String digitada". Pois quando o usuário digita um caractere, a variável after possui o valor 1, e quando ele apaga o valor é 0. Entretanto, se ele copiar um texto qualquer (de 12 caracteres, por exemplo) de um outro lugar do sistema e tentar colar nessa caixa de texto, after terá o valor 12. O mesmo acontece se ele selecionar 5 caracteres da caixa de texto (dando um clique longo e marcando o texto) e recortar, então o valor da variável before será 5.

Capítulo 5
Página 164. Na parte que diz: "Crie o arquivo meu.html dentro da pasta app/src/assets do projeto". O local correto é  app/src/main/assets.

Página 182. Na parte que diz: "Primeiro obtivemos as propriedades personalizadas (...) passando como parâmetro o R.styleable.JogoDaVelha, que definimos no strings.xml.", o correto é o arquivo styles.xml.

Capítulo 6
Página 226. O namespace do XML do arquivo de menu é xmlns:app="http://schemas.android.com/apk/res-auto" ao invés de
xmlns:app="http://schemas.android.com/apk/res/android".

Na mesma página, no primeiro parágrafo, ao invés de startActionMode, lê-se startSupportActionMode.

Página 232. A propriedade android:orientation é desnecessária no FrameLayout.

Página 241. Faltou o import da classe android.support.v7.widget.Toolbar. Cuidado para não usar android.widget.Toolbar.

Muito obrigado mais uma vez ao pessoal que está reportando os erros!  Vocês não sabem o quanto estão me ajudando.
A medida que forem encontradas mais erratas, vou colocando aqui.

4br4ç05,
nglauber

domingo, 22 de fevereiro de 2015

Androidos 2015

Olá povo,

Nos dias 8 e 9 de maio estarei na UNIPE em João Pessoa participando do Androidos 2015, um evento totalmente voltado para a plataforma Android. Terei a satisfação de participar falando sobre as novidades do Android Lollipop e sobre Android Wear.
Quem também estará lá é o grande Ricardo Lecheta.


Mais informações, acessem a página do evento no Facebook!

Vejo vocês lá!

[EDITADO 21/07/2015]
Putz! Compartilhei os slides pelas redes sociais e esqueci de colocar aqui...


4br4ç05,
nglauber

sábado, 21 de fevereiro de 2015

LinguÁgil


Olá povo,

Entre os dias 11 e 14 de março acontecerá em Salvador o LinguÁgil, um evento voltado ao desenvolvimento ágil que contará com diversas palestras e mini-cursos sobre técnicas e tecnologias para acelerar o desenvolvimento de software.
Eu participarei do evento com a palestra "Acelerando o desenvolvimento com Android Libs" onde vamos discutir as bibliotecas mais famosas do mercado, seus prós e contras.
As inscrições estão abertas e a programação completa está disponível no site do evento.

Nos vemos lá!

4br4ç05,
nglauber

sexta-feira, 30 de janeiro de 2015

Dominando o Android: Atualização 2

Olá povo,

Em atenção as pessoas que compraram meu livro, estou reportando os erros que o pessoal está encontrando. Sendo assim, segue abaixo mais algumas atualizações sobre o livro. Quem quiser acompanhar e reportar erratas pode participar do grupo de discussão sobre o livro.

Capítulo 1

Página 43. A pasta values-v11-mcc724-mnc31 informada não funcionaria pois teria que ser respeitada a ordem de avaliação dos recursos. O nome correto seria values-mcc724-mnc31-v11.
Obrigado Douglas Drumond!

Página 46. A propriedade densityDpi da classe Configuration só está disponível na API Level 17 (Android 4.2). E as propriedades screenHeightDp e screenWidthDp na API Level 13 (Android 3.2). Uma alternativa para obter esses valores é utilizar a classe DisplayMetrics.
Obrigado Tatiani Lima!

Capítulo 4

Página 113: No lugar de setEditorActionListener(OnEditorActionListener), usar setOnEditorActionListener(OnEditorActionListener).
Valeu Jorge Felipe (por essa e outras).

Página 134. Na seção "Cabeçalho e Rodapé", no lugar de setListAdapter(Adapter) lê-se listView.setAdapter(Adapter).

Página 136: Na seção "EmptyView", quando fui fazer esse exemplo, ele era inicialmente com uma ListActivity.
public class MainActivity extends ListActivity {
  ...
  public void onCreate(Bundle savedInstanceState){
    setContentView(R.layout.activity_main);
    listView = getListView();
    ...
  }
  ...
}
Com isso, o exemplo funciona corretamente, porque internamente a classe ListActivity define a propriedade emptyView da ListView. Entretanto, no Lollipop, por padrão, a  ListActivity não exibe a ActionBar (barra de título da parte superior), então resolvi herdar de ActionBarActivity. E com isso, esqueci de adicionar a seguinte linha:
listView.setEmptyView(findViewById(android.R.id.empty));

Essa correção já está disponível no GitHub.
Obrigado Vitor Albuquerque!

Capítulo 5

Página 155: No segundo parágrafo, no lugar de android:text, seria android:textColor.

Página 159: Remover propriedade android:background dos botões, uma vez que ela foi definida no arquivos values/styles.xml.

Capítulo 6

Página 195: No único parágrafo, no lugar de equipe, seria hotel.

Geral

Em vários exemplos estou utilizando o valor fill_parent ao invés do match_parent. Entretanto o segundo é o recomendado desde a API Level 8 (Android 2.2). Mas se você observar, o valor das constantes internamente é o mesmo. Então na prática, não faz diferença nenhuma, ele só foi renomeado. Mas, por precaução, utilize match_parent.

--

Bem pessoal! Por enquanto é isso. Desculpem o transtorno, mas é que não houve revisão técnica pois encareceria o livro. Essa incubência ficou para vocês e eu agradeço bastante essa colaboração.

À medida que forem achando alguma coisa, por gentileza reportem no grupo. Vai ajudar a mim e a outros leitores.

4br4ç05,
nglauber

segunda-feira, 26 de janeiro de 2015

Aplicação do blog no GitHub

Olá povo,

Na última terça-feira (20/01) disponibilizei a versão 1.4 do aplicativo do blog no Google Play. Ele sofreu algumas mudanças internas e foi visualmente modificado para seguir alguns (poucos) padrões do Material Design. Ele é compatível com smatphones e tablets Android rodando o Gingerbread (2.3) ou superior.




Mas sem sombra de dúvida, a grande novidade é que o código-fonte está disponível no GitHub!!!
Então, tá esperando o quê? Baixa logo o código e começa a dar uma fuçada no que eu fiz :)

Achou um bug? Tem alguma coisa que você não gostou no aplicativo? Tem alguma melhoria a ser feita? Modifica e faz um push request pra mim! Vamos compartilhar conhecimento :)

4br4ç05,
nglauber

quarta-feira, 21 de janeiro de 2015

Dominando o Android com 20% de desconto!!!

Olá povo,

O meu livro "Dominando o Android" estava até ontem (20/01/2015) com desconto de 25% no site da Novatec. Mas se você perdeu essa oportunidade, não se preocupe!

Adquira o livro com desconto de 20% utilizando o código "GLAUBER"!

Vê se não perde essa chance hein!

4br4ç05,
nglauber

terça-feira, 13 de janeiro de 2015

Dominando o Android - Atualização 1 - Capítulo 14

Olá pessoal,

Acho que com o livro as atualizações aqui do blog ficarão mais frequentes. Pelo menos é o que eu espero. Vou fazer o possível para colocar as correções/atualizações aqui através de mini-posts falando rapidamente sobre a mudança e o por quê.

Para quem não sabe, o código-fonte dos exemplos do livro estão disponíveis no meu gitHub (https://github.com/nglauber/dominando_android). E lá vocês vão ver dois branchs master e master_updates. O código que estiver com algum bug, eu vou corrigir e colocar no branch master e o que for atualização ficará no branch master_updates.
Também criei um grupo de discussão (http://groups.google.com.br/d/forum/livro-dominando-o-android) que todos podem se inscrever.

Recebi hoje uma avaliação do livro que informava que o mesmo "tinha uma falha grave" e "estava desatualizado" porque eu não estou utilizando API do Google Play Services 6.5. E que uma classe (a LocationClient) que eu usava no exemplo não existia.

Não sei se todos sabem, mas o processo de finalização de um livro requer algumas etapas que demandam tempo: revisão ortográfica, diagramação, checar figuras, referências, tempo de impressão na gráfica, etc.  A versão 6.5 do Google Play Services foi anunciada no dia 17/11/2014, mas só foi disponibilizada para os desenvolvedores dia 08/12/2014. Época que o livro já estava com a editora em processo de finalização e impressão. Sendo assim, não pude atualizar o capítulo 14 (Mapas e Localização) a tempo. Sendo assim, peço desculpas pelo meu livro ter ficado desatualizado, por conta de alguns dias... :(
Mas quero reiterar que o código apresentado no livro funciona perfeitamente do jeito que ele se encontra.

--

Pedido de desculpas feito, vamos ao que mudou! As alterações feitas em relação ao exemplo do livro estão nesse commit aqui no branch master_updates, uma vez que é uma atualização da nova API e não uma correção de um erro do livro.

Conforme o comentário do leitor, a classe com.google.android.gms.location.LocationClient não existe mais. Mas seus métodos foram distribuídos em outras classes.
  • Na classe GeofenceReceiver, os eventos de Geofence podem ser tratados com a classe GeofencingEvent.
  • Na classe MainActivity, muito do que era feito com a LocationClient passou a ser responsabilidade da GoogleApiClient, inclusive os eventos de conexão (ConnectionCallbacks e OnConnectionFailedListener).
  • Ainda na MainActivity para obter a localização atual passamos a utilizar a classe LocationServices.FusedLocationApi. Bem como para requisitar atualizações sobre mudança na localização.
  • E finalmente, para adicionar um Geofence, usamos a classe LocationServices.GeofencingApi.
Isso é um resumo pessoal. Quem quiser mais informações sobre essa nova API, recomendo esses links:



Qualquer dúvida, sugestão ou crítica serão muito bem-vindas.

4br4ç05,
nglauber

sexta-feira, 9 de janeiro de 2015

Entrevista para o blog da Novatec

Oi povo,

Segue abaixo a entrevista que dei para o blog da novatec.

Nelson contou um pouco de sua história profissional e o trabalho com tecnologias móveis. Confira a entrevista e conheça um pouco mais sobre o autor:
Como foi seu início na computação?
Comecei em 2000 fazendo cursos isolados de Delphi e ASP. Em seguida, fiz alguns sistemas comerciais para algumas empresas em Caruaru onde nasci. Em 2002, me mudei para Recife para fazer o curso técnico de desenvolvimento de software no Ibratec (atual Unibratec) e felizmente uma semana após me mudar, consegui um emprego na área. Inicialmente trabalhei com ASP alguns meses, depois 3 anos com Delphi. Em 2006 entrei no CESAR para trabalhar com jogos para celulares Java ME, e em 2009 iniciei os estudos com Android por causa do projeto em que estava trabalhando. Desde então, estou ligado a tecnologias móveis, inclusive meu mestrado foi dedicado a esse tema.
Por que decidiu escrever sobre o Android?
Quando iniciei meus estudos sobre Android em 2009, tive dificuldade em achar material disponível na Internet, pois o Android ainda estava começando. Então decidi compartilhar com outros desenvolvedores o que estava aprendendo escrevendo posts para o meu blog e publicando artigos para revistas especializadas. Outro fator motivador foram aulas de Android que ministro nos cursos de graduação e pós-graduação. Muitos alunos me fazem questionamentos durante as aulas e que na maioria das vezes está disponível no blog ou em algum artigo que eu tinha escrito. Então resolvi juntar esses conteúdos, atualizá-los e transformá-los em um livro. E com isso, ajudar aos meus alunos e quem quer aprender Android de uma maneira geral.
Autor Nelson Glauber
Que benefícios e responsabilidades o título de primeiro Developer Expert de Android da América Latina te trouxe? Como isso afetou sua vida profissional?
Para mim, o maior benefício é o reconhecimento do trabalho por parte do próprio Google. Esse programa além de reconhecer o profissional pelo seu conhecimento, valoriza o trabalho de divulgação da plataforma na qual ele foi nomeado. Mas graças a esse título, tive o prazer de participar do Google I/O (conferência mundial dos desenvolvedores Google) em San Francisco e conhecer HQ da Google em Mountain View.
Outra coisa fantástica é a quantidade de desenvolvedores que conheci durante os eventos que participei. Pessoas de toda parte do Brasil e do mundo envolvidas com tecnologias Google e que trabalham no próprio Google. Inclusive o prefácio do livro foi escrito por dois Googlers daqui do Brasil.
A responsabilidade é basicamente continuar o trabalho com o Android, ministrando aulas, palestras, escrevendo artigos, compartilhando código, etc. O problema é que um GDE precisa ter muito mais cuidado com o que ele diz ou escreve, pois passa a ter um peso bem maior.
Nelson Glauber
Qual o principal conselho que você dá para quem quer entrar no mercado de desenvolvimento mobile?
Desenvolver aplicações para dispositivos móveis é muito divertido, mas sem sombra de dúvida, desafiador. Então a primeira coisa é gostar da área, depois é se dedicar aos estudos. Caso não possua experiência em programação ainda, deve primeiro consolidar os conceitos básicos de computação e programação, para depois dedicar-se à programação mobile. E posso garantir que o resultado de tanto esforço é bem gratificante, pois ver o fruto do seu trabalho na palma da sua mão e sendo utilizado por pessoas do mundo todo é muito bacana.
Acredita que é uma área que ainda tem muito a crescer?
Sem dúvida! A venda de smartphones cresce ano após ano e cada vez mais queremos mais serviços nos nossos telefones. Consequentemente a demanda por pessoas especializadas no assunto aumenta. E é importante ressaltar que mobile não se restringe mais a smartphones e tablets, agora temos os dispositivos vestíveis como os relógios inteligentes com Android Wear que abordo em dois capítulos do livro.
Autor Nelson Glauber - Dominando o Android
Pretende escrever outros livros?
A princípio não tenho nada em mente, pois escrever um livro requer meses de dedicação e como atualmente trabalho durante o dia e ministro aulas à noite, fica um pouquinho difícil. Então vamos aguardar a reação dos leitores ao “Dominando o Android”, e caso a receptividade seja boa, quem sabe?

4br4ç05,
nglauber