package org.openlmis.core.presenter; import com.google.inject.Inject; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.exceptions.ViewNotMatchException; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.repository.StockRepository; import org.openlmis.core.utils.ToastUtil; import org.openlmis.core.view.BaseView; import org.openlmis.core.view.viewmodel.StockHistoryViewModel; import org.roboguice.shaded.goole.common.base.Function; import org.roboguice.shaded.goole.common.base.Predicate; import org.roboguice.shaded.goole.common.collect.FluentIterable; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.Observer; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class AllDrugsMovementPresenter extends Presenter { @Inject StockRepository stockRepository; AllDrugsMovementView view; List<StockHistoryViewModel> viewModelList = new ArrayList<>(); List<StockHistoryViewModel> filteredViewModelList = new ArrayList<>(); @Override public void attachView(BaseView v) throws ViewNotMatchException { view = (AllDrugsMovementView) v; } public void loadMovementHistory(final int days) { view.loading(); Subscription subscription = Observable.create(new Observable.OnSubscribe<List<StockHistoryViewModel>>() { @Override public void call(Subscriber<? super List<StockHistoryViewModel>> subscriber) { try { loadAllMovementHistory(); filterViewModels(days); subscriber.onNext(filteredViewModelList); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Observer<List<StockHistoryViewModel>>() { @Override public void onCompleted() { view.loaded(); } @Override public void onError(Throwable e) { view.loaded(); new LMISException(e).reportToFabric(); ToastUtil.show(e.getMessage()); } @Override public void onNext(List<StockHistoryViewModel> stockMovementHistoryViewModels) { view.refreshRecyclerView(stockMovementHistoryViewModels); view.updateHistoryCount(filteredViewModelList.size(), getMovementCount()); } }); subscriptions.add(subscription); } private int getMovementCount() { int movementCount = 0; for (StockHistoryViewModel viewModel : filteredViewModelList) { movementCount += viewModel.getFilteredMovementItemViewModelList().size(); } return movementCount; } protected void filterViewModels(final int days) { filteredViewModelList.clear(); filteredViewModelList.addAll(FluentIterable.from(viewModelList).filter(new Predicate<StockHistoryViewModel>() { @Override public boolean apply(StockHistoryViewModel stockHistoryViewModel) { return !stockHistoryViewModel.filter(days).isEmpty(); } }).toList()); } protected void loadAllMovementHistory() { if (viewModelList.isEmpty()) { viewModelList.addAll(FluentIterable.from(stockRepository.list()).transform(new Function<StockCard, StockHistoryViewModel>() { @Override public StockHistoryViewModel apply(StockCard stockCard) { return new StockHistoryViewModel(stockCard); } }).toList()); } } public interface AllDrugsMovementView extends BaseView { void refreshRecyclerView(List<StockHistoryViewModel> stockHistoryViewModels); void updateHistoryCount(int productCount, int movementCount); } }