package io.coreflodev.openchat.chat; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import io.coreflodev.openchat.api.ChatMessage; import io.coreflodev.openchat.api.ChatService; import io.coreflodev.openchat.common.mvp.Presenter; import io.coreflodev.openchat.common.mvp.PresenterView; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class ChatPresenter extends Presenter<ChatPresenter.View> { private List<ChatMessage> messages; private Disposable newMessagesDisposable; private Disposable oldMessagesDisposable; private ChatService chatService; public ChatPresenter(ChatService chatService) { this.chatService = chatService; this.messages = new ArrayList<>(); } @Override public void attachView(View view) { super.attachView(view); if (messages.size() == 0) { oldMessagesDisposable = chatService.getMessages() .repeatWhen(o -> o.concatMap(v -> Observable.interval(3, TimeUnit.SECONDS))) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(messages -> { if (this.messages.size() != messages.size()) { this.messages.clear(); this.messages.addAll(messages); if (isViewAttached()) { getView().setListOfMessage(new ArrayList<>(messages)); } } }, error -> { // TODO handle offline mode with no cache }); } else { getView().setListOfMessage(new ArrayList<>(messages)); } if (newMessagesDisposable == null || newMessagesDisposable.isDisposed()) { newMessagesDisposable = getView().getNewMessage() .flatMap(message -> chatService.addMessage(ChatMessage.create("test", message, new Date())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())) .subscribe(); } } @Override public void detachView() { if (newMessagesDisposable != null && !newMessagesDisposable.isDisposed()) { newMessagesDisposable.dispose(); } super.detachView(); } @Override public void destroy() { if (oldMessagesDisposable != null && !oldMessagesDisposable.isDisposed()) { oldMessagesDisposable.dispose(); } } public interface View extends PresenterView { void setListOfMessage(List<ChatMessage> messages); Observable<String> getNewMessage(); } }