package com.badoo.chateau.ui.conversations.create.selectusers; import android.support.annotation.NonNull; import android.util.Log; import com.badoo.barf.mvp.BaseRxPresenter; import com.badoo.barf.rx.ScheduleOn; import com.badoo.chateau.core.model.Conversation; import com.badoo.chateau.core.usecases.conversations.CreateConversation; import com.badoo.chateau.core.usecases.users.GetUsers; import com.badoo.chateau.data.models.BaseUser; import java.util.List; import rx.Observable; import rx.Subscription; public class UserListPresenterImpl<U extends BaseUser, C extends Conversation> extends BaseRxPresenter implements UserListPresenter<U> { private static final String TAG = UserListPresenterImpl.class.getSimpleName(); @NonNull private final UserListView<U> mView; private UserListFlowListener<C, U> mFlowListener; @NonNull private final GetUsers<U> mGetUsers; @NonNull private final CreateConversation<C> mCreateConversation; public UserListPresenterImpl(@NonNull UserListView<U> view, @NonNull UserListFlowListener<C, U> flowListener, @NonNull GetUsers<U> getUsers, @NonNull CreateConversation<C> createConversation) { mView = view; mFlowListener = flowListener; mGetUsers = getUsers; mCreateConversation = createConversation; } @Override public void onStart() { super.onStart(); manage(mGetUsers.execute() .compose(ScheduleOn.io()) .flatMap(Observable::from) .toList() .subscribe(mView::showUsers, this::onFatalError)); } @Override public void onUsersSelected(List<U> users) { if (users.isEmpty()) { return; } if (users.size() == 1) { final Subscription createConversationSub = mCreateConversation.execute(users.get(0).getUserId()) .compose(ScheduleOn.io()) .subscribe( conversation -> { mFlowListener.requestOpenChat(conversation); }, this::onFatalError); manage(createConversationSub); } else { mFlowListener.requestCreateGroupChat(users); } } private void onFatalError(Throwable throwable) { Log.e(TAG, "Fatal error", throwable); mView.showError(true, throwable); } }