package com.artemzin.qualitymatters.ui.presenters;
import android.support.annotation.NonNull;
import com.artemzin.qualitymatters.models.AnalyticsModel;
import com.artemzin.qualitymatters.models.ItemsModel;
import com.artemzin.qualitymatters.other.FinishAsyncJobSubscription;
import com.artemzin.qualitymatters.performance.AsyncJob;
import com.artemzin.qualitymatters.performance.AsyncJobsObserver;
import com.artemzin.qualitymatters.ui.views.ItemsView;
import rx.Subscription;
public class ItemsPresenter extends Presenter<ItemsView> {
@NonNull
private final ItemsPresenterConfiguration presenterConfiguration;
@NonNull
private final ItemsModel itemsModel;
@NonNull
private final AsyncJobsObserver asyncJobsObserver;
@NonNull
private final AnalyticsModel analyticsModel;
public ItemsPresenter(@NonNull ItemsPresenterConfiguration presenterConfiguration,
@NonNull ItemsModel itemsModel,
@NonNull AsyncJobsObserver asyncJobsObserver,
@NonNull AnalyticsModel analyticsModel) {
this.presenterConfiguration = presenterConfiguration;
this.itemsModel = itemsModel;
this.asyncJobsObserver = asyncJobsObserver;
this.analyticsModel = analyticsModel;
}
public void reloadData() {
{
// Tip: in Kotlin you can use ? to operate with nullable values.
final ItemsView view = view();
if (view != null) {
view.showLoadingUi();
}
}
final AsyncJob asyncJob = asyncJobsObserver.asyncJobStarted("Reload data in ItemsPresenter");
final Subscription subscription = itemsModel
.getItems()
.subscribeOn(presenterConfiguration.ioScheduler())
.subscribe(
items -> {
// Tip: in Kotlin you can use ? to operate with nullable values.
final ItemsView view = view();
if (view != null) {
view.showContentUi(items);
}
asyncJobsObserver.asyncJobFinished(asyncJob);
},
error -> {
analyticsModel.sendError("ItemsPresenter.reloadData failed", error);
// Tip: in Kotlin you can use ? to operate with nullable values.
final ItemsView view = view();
if (view != null) {
view.showErrorUi(error);
}
asyncJobsObserver.asyncJobFinished(asyncJob);
}
);
// Prevent memory leak.
unsubscribeOnUnbindView(subscription, new FinishAsyncJobSubscription(asyncJobsObserver, asyncJob));
}
}