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