Model View Presenter Class Diagram

Model View Presenter (MVP) no Android, Parte 3

Na conclusão da série sobre Model View Presenter (MVP) no Android, vamos falar um pouco sobre como utilizar o framework disponível no GitHub para facilitar o processo de produção, além de discutir alguns gargalos que podem ficar no caminho daqueles que estão tentando implementar seus projetos utilizando MVP.

Utilizando o framework Model View Presenter

Este framework foi implementado sobre o conceito do Dr. Douglas C. Schmidt. O código segue princípios canónicos e não utiliza nenhuma library ou recurso que não seja standard do SDK Android. A maior vantagem desta abordagem é que o projeto que o utilize estará sempre em sincronia com o ambiente Android, não dependendo de atualizações de librarys. Como nem tudo são flores, existem algumas exigências que precisam ser atendidas para o funcionamento correto.

Interfaces de comunicação entre layers

Comece implementando as interfaces que permitem a comunicação entre os layers do Model View Presenter. Você precisará de quatro interfaces: RequiredViewOps ,  ProvidedPresenterOps ,  RequiredPresenterOps  e  ProvidedModelOps .

/**
     * Métodos obrigatórios em View, disponíveis para Presenter
     *      Presenter -> View
     */
    interface RequiredViewOps extends ActivityView {
    }


    /**
     * operações oferecidas ao layer View para comunicação com Presenter
     *      View -> Presenter
     */
    interface ProvidedPresenterOps extends PresenterOps<RequiredViewOps> {
    }

    /**
     * operações oferecidas pelo layer Presenter para comunicações com Model
     *      Model -> Presenter
     */
    interface RequiredPresenterOps {
    }

    /**
     * operações oferecidos pelo layer Model para comunicações com Presenter
     *      Presenter -> Model
     */
    interface ProvidedModelOps extends ModelOps<RequiredPresenterOps>{
    }

leia mais

Model View Presenter Class Diagram

Model View Presenter (MVP) no Android, Parte 2

No artigo anterior introduzimos os conceitos do padrão Model View Presenter (MVP), e as principais vantagens de sua utilização para desenvolvimento de aplicações Android. Na segunda parte da série vamos colocar a mão na massa e implementar, de forma canónica, sem uso de qualquer library que não faça parte da SDK Android/Java, nossa própria versão do MVP.

O código que iremos desenvolver é simples, mas considerando a quantidade de objetos envolvidos, ele pode parecer complexo, entretanto uma vez você tenha compreendido a idéia geral, a coisa toda fica bem clara. Caso prefira ler a aprender diretamente do código, pode dar uma conferida direta no projeto completo.

Planejamento do padrão Model View Presenter (MVP)

[expand title=”clique para visualizar conceitos do padrão MVP no Android” tag=”h5″]

=&0=&

Implementando Model View Presenter no Android

Então mãos a obra! Começaremos definindo as operações de nosso aplicativo. Em nome da organização, vamos criar um interface guarda-chuva, que mantém todos métodos responsáveis pela comunicação entre as partes do padrão.

Obs: Como a implementação do padrão MVP já é complexa o suficiente, nenhuma função que não esteja diretamente conectada ao seu funcionamento não será desenvolvida. Tomarei como base que os leitores deste artigo já estão em um nível mais avançado de conhecimento do sdk android, portando a lógica fora do padrão MVP não será considerada.

Interface MainMVP

/*
 * Interface guarda-chuva do padrão MVP, agrega todas as operações de
 * comunicação entre os diferentes layer do padrão: MODEL, VIEW, PRESENTER
 */
public interface MainMVP {

    /**
     * Métodos obrigatórios em View, disponíveis para Presenter
     *      Presenter -> View
     */
    interface RequiredViewOps {
        void showToast(String msg);
        void showAlert(String msg);
        // qualquer outra operação na UI
    }

    /**
     * operações oferecidas ao layer View para comunicação com Presenter
     *      View -> Presenter
     */
    interface PresenterOps{
        void onConfigurationChanged(RequiredViewOps view);
        void onDestroy(boolean isChangingConfig);
        void novaNota(String textoNota);
        void deletaNota(Nota nota);
        // qualquer outra operação a ser chamada pelo View
    }

    /**
     * operações oferecidas pelo layer Presenter para comunicações com Model
     *      Model -> Presenter
     */
    interface RequiredPresenterOps {
        void onNotaInserida(Nota novaNota);
        void onNotaRemovida(Nota notaRemovida);
        void onError(String errorMsg);
        // qualquer operação de retorno Model -> Presenter
    }

    /**
     * operações oferecidos pelo layer Model para comunicações com Presenter
     *      Presenter -> Model
     */
    interface ModelOps {
        void insereNota(Nota nota);
        void removeNota(Nota nota);
        void onDestroy();
        // Qualquer operação referente à dados a ser chamado pelo Presenter
    }
}

leia mais

relações do Model View Presenter

Model View Presenter (MVP) no Android, Parte 1

Os padrões de arquitetura são fundamentais para mantermos um código limpo, expansível e testável. Estas soluções reconhecidas vem sendo desenvolvidas há anos e oferecem referências indispensáveis para a implementação de projetos robustos, com confiabilidade e dentro dos standards que a indústria espera. Neste artigo vamos discutir as principais diferenças entre Model View Presenter (MVP) no Android e MVC, como o modelo MVP se adequa ao Android SDK e as principais vantages deste modelo arquitetônico.

leia mais

O Android esqueceu do Listener de teclado?

Android SDK é excelente e sabemos que a turma da Google fez um ótimo trabalho, mas volta e meia encontramos algum recurso que por uma razão ou outra foi deixado de lado ou às vezes até mal desenvolvido. Um desses probleminhas, que dependendo do seu objetivo pode ser uma grande dor de cabeça, é a ausência de Listener para detectar os eventos de teclado , como a Entrada e Saída do teclado do SoftKeyBoard.

Este problema é uma questão recorrente no stackoverflow. E após horas de pesquisa não pude encontrar nenhuma resposta definitiva. Entre vários métodos que testei, o mais eficiente foi um hack que utiliza a diferença da medida da janela para deduzir a presença do teclado. 

Vale ressaltar que a solução apresentada aqui não é canônica ou definitiva, mas  um hack com resultados bastante confiáveis.

Vamos criar nossos eventos de teclado em Activity

A forma mais produtiva de utilizar este snippet é incluir o código em uma extensão abstrata de uma Atividade, e utilizar a extensão nas Atividades onde há a necessidade de detectar a presença do teclado ou alterações no layout.

// Dispara quando o teclado aparece na tela
protected void onKeyBoardOn() {
    Log.d(TAG, "onKeyBoardOn()");
}
// Dispara quando o teclado desaparece
protected void onKeyBoardOff() {
    Log.d(TAG, "onKeyBoardOff()");
}
// Dispara quando ocorrem alterações na altura da janela
protected void onRootLayoutChanged(int heightDiff) {
    Log.d(TAG, "onRootLayoutChanged(heightDiff[" + heightDiff + "])");
}

Registramos um controle da presença do teclado para controle e futuras checagens.

private Boolean mIsKeyboardOn;
/**
 * Controla a presença do teclado
 * - pode retornar null se o observador de teclado não foi iniciado
 */
protected Boolean isKeyboardOn() {
    Log.d(TAG, "isKeyboardOn()");
    return mIsKeyboardOn;
}

leia mais