Interface de Visualização e Integração com a Activity
A camada View, no padrão MVP, representa a interface do usuário e define os contratos para interações visuais. Sua função principal é expor métodos que permitem atualizações na tela, como limpeza de campos ou exibição de mensagens de resultado. Para isso, criamos uma interface que encapsula as operações esperdaas da UI: ``` public interface ILoginView { void clearFields(); void showLoginResult(boolean success, int statusCode); }
Essa interface será implementada pela Activity responsável por gerenciar o layout e responder aos eventos. Ao fazer isso, a lógica de apresentação permanece isolada da regra de negócio, mantendo a separação de preocupações. A seguir, a Activity principal implementa essa interface e lida com os eventos do usuário: ```
public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {
private EditText inputUsername;
private EditText inputPassword;
private ILoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
setTitle("Autenticação");
findViewById(R.id.btn_login).setOnClickListener(this);
findViewById(R.id.btn_clear).setOnClickListener(this);
inputUsername = findViewById(R.id.et_username);
inputPassword = findViewById(R.id.et_password);
presenter = new LoginPresenterImpl(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_clear:
presenter.clearInputs();
break;
case R.id.btn_login:
presenter.authenticate(
inputUsername.getText().toString(),
inputPassword.getText().toString()
);
break;
}
}
@Override
public void clearFields() {
inputUsername.setText("");
inputPassword.setText("");
}
@Override
public void showLoginResult(boolean success, int statusCode) {
String message = "";
switch (statusCode) {
case 0:
// Sucesso sem mensagem adicional
break;
case 1:
message = "Login realizado com sucesso!";
break;
case -1:
message = "Usuário inválido.";
break;
case -2:
message = "Senha incorreta.";
break;
}
if (!message.isEmpty()) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
}
O layout associado ao formulário de login utiliza um LinearLayout vertical com campos de texto e botões alinhados horizontalmente: ```
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:padding="16dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="80dp">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nome de usuário"
android:layout_marginBottom="12dp" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Senha"
android:inputType="textPassword"
android:layout_marginBottom="16dp" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp">
<Button
android:id="@+id/btn_login"
android:text="Entrar"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_clear"
android:text="Limpar"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
</LinearLayout>
Com essa estrutura completa, o padrão MVP está plenamenet implemantado: o modelo (Model) manipula dados, o presenter (Presenter) lida com a lógica de negócios e comunica resultados à view, enquanto a view apenas atualiza a interface conforme solicitado.