Olegatorapp
@Olegatorapp
Java/Android dev

Как создать правильную структуру MVP android?

Привет всем!)
Нужна помощь в понимании/объяснении MVP проектирования.
Я уже второй день воюю с этой штукой и никак не могу дойти до сути! Прочитал статьи: эту, эту, эту и даже эту, но там всё как-то довольно сложные примеры. Т.е. пишу не от того, что лень гуглить что-то, просто хочу понять)

Вопрос в следующем:
У меня есть уже реализованный ранее фрагмент приложения, которое надо переделать согласно MVP. Всего есть два активити: LoginActivity(скрин ниже), MainActivity.
Логика взаимодействия следующая:
1. На экране Login есть TextView и кнопка Sign In (Gmail API).
2. По нажатию на кнопку Sign In выполняется подключение к Google, потом выпадает окошко с выбором gmail аккаунтов, а после выполняется переход на MainActivity.
3. При создании MainActivity в название Toolbar записывается email, полученный после отправки запроса и пересланный с LoginActivity на MainActivity при помощи putExtra к интенту запуска MainActivity;

Всё, дальше там на MainActivity выводится список и обращение к локальной базе данных, там проблем нет, вроде.
Но как правильно спроектировать интерфейсы для LoginActivity?
Как я делал:
Я планировал для каждого из активити делать отдельные Model, View, Presenter. Т.е. ModelLogin, ModelMain, ViewLogin, ViewMain и т.д. Но вышло, честно, фигня ещё на стадии создание MVP для Login.
Я просто не смог придумать, что должно быть реализовано в интерфейсах IViewLogin и IModelLogin, в то время, как IPresenterLogin был полон почти всей реализацией...

Код
public interface IPresenterLogin {
//соединение к google
  void connectionGoogle(FragmentActivity fragment, Context context,
      OnConnectionFailedListener error);
//задаёт размер и цвет кнопке
  void setBtmLogin(SignInButton signInButton);
//авторизация через акк
  Intent signIn();
//тут передаём результат авторизации и метод возвращает Intent, 
//который потом внутри активити LoginView вызывается через startActivity(presenter.startActivityFromResult)
  Intent startActivityFromResult(Context context, GoogleSignInResult result);
//просто вывод всплывающего сообщения
  void getToast(Context context, String msg);


}


Скрин LoginActivity, это так, грубый шаблон))
3c2dbd63b39a49e8ab46359a5cf0242a.png
  • Вопрос задан
  • 1406 просмотров
Решения вопроса 1
public interface  LoginPresenter{
 void clickOnSignInBtn();  //презентер после вызова этого метода дергает методы модели, выполняющие подключеник к апи и вход, и вызывает  showSelectionWindow() c названиями аккаунтов, полученных из модели.
 void accountSelected(String s); // после того как юзер выбрал аккаунт, вьюшка дергает этот метод с параметром, какой аккаунт выбран, тут не обязательно должна быть строка, после этого презентер дергает соответствующий метод из вашей модели, выполняющий авторизацию уже определенного юзера, если все хорошо - вызывает
//openMainActivity() и передает туда инфу для интента, если нет - showError()
}

public interface LoginView {
void showSelectionWindow(List<String> accountsNames);  //показать меню выбора.
void openMainActivity(String arg); // В реализации вьюшка кладет в интент аргумент и запускает новую активити.
void showError(String msg); 
/* Сюда можно добавить другие нужные вам методы, аля 
        showProgress(), showMessage()
*/

}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы