package org.openlmis.core.view.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import org.openlmis.core.R; import org.openlmis.core.googleAnalytics.ScreenName; import org.openlmis.core.model.Regimen; import org.openlmis.core.presenter.ProductPresenter; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.InjectPresenter; import org.openlmis.core.utils.ToastUtil; import org.openlmis.core.view.adapter.SelectRegimeProductAdapter; import org.openlmis.core.view.viewmodel.RegimeProductViewModel; import org.openlmis.core.view.widget.SingleClickButtonListener; import org.roboguice.shaded.goole.common.base.Predicate; import java.util.ArrayList; import java.util.List; import roboguice.inject.ContentView; import roboguice.inject.InjectView; import rx.Subscriber; import rx.Subscription; import static org.roboguice.shaded.goole.common.collect.FluentIterable.from; @ContentView(R.layout.activity_select_drugs) public class SelectRegimeProductsActivity extends BaseActivity { public static final String PARAM_REGIME_TYPE = "regime_type"; @InjectView(R.id.btn_next) public View btnNext; @InjectView(R.id.products_list) public RecyclerView productListRecycleView; protected SelectRegimeProductAdapter mAdapter; @InjectPresenter(ProductPresenter.class) ProductPresenter presenter; protected List<RegimeProductViewModel> viewModels; private final int MAX_CHECKED_LIMIT = 5; @Override protected ScreenName getScreenName() { return ScreenName.SelectRegimeProductScreen; } @Override protected int getThemeRes() { return R.style.AppTheme_AMBER; } public static Intent getIntentToMe(Context context, Regimen.RegimeType type) { Intent intent = new Intent(context, SelectRegimeProductsActivity.class); intent.putExtra(PARAM_REGIME_TYPE, type); return intent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Regimen.RegimeType regimeType = (Regimen.RegimeType) getIntent().getSerializableExtra(PARAM_REGIME_TYPE); productListRecycleView.setLayoutManager(new LinearLayoutManager(this)); viewModels = new ArrayList<>(); mAdapter = new SelectRegimeProductAdapter(viewModels); productListRecycleView.setAdapter(mAdapter); loading(); Subscription subscription = presenter.loadRegimeProducts().subscribe(subscriber); subscriptions.add(subscription); btnNext.setOnClickListener(new SingleClickButtonListener() { @Override public void onSingleClick(View v) { validateAndSaveRegime(regimeType); } }); } private void validateAndSaveRegime(Regimen.RegimeType regimeType) { List<RegimeProductViewModel> checkedViewModels = getCheckedProducts(); if (checkedViewModels.isEmpty()) { ToastUtil.show(R.string.hint_no_product_has_checked); return; } if (checkedViewModels.size() > MAX_CHECKED_LIMIT) { ToastUtil.show(getString(R.string.hint_more_than_limit_product_has_checked)); return; } btnNext.setEnabled(false); loading(); Subscription subscription = presenter.saveRegimes(checkedViewModels, regimeType).subscribe(saveSubscriber); subscriptions.add(subscription); } private List<RegimeProductViewModel> getCheckedProducts() { return from(viewModels).filter(new Predicate<RegimeProductViewModel>() { @Override public boolean apply(RegimeProductViewModel viewModel) { return viewModel.isChecked(); } }).toList(); } Subscriber<List<RegimeProductViewModel>> subscriber = new Subscriber<List<RegimeProductViewModel>>() { @Override public void onCompleted() { loaded(); mAdapter.notifyDataSetChanged(); } @Override public void onError(Throwable e) { loaded(); ToastUtil.show(e.getMessage()); } @Override public void onNext(List<RegimeProductViewModel> data) { viewModels.clear(); viewModels.addAll(data); } }; Subscriber<Regimen> saveSubscriber = new Subscriber<Regimen>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { loaded(); ToastUtil.show(e.getMessage()); } @Override public void onNext(Regimen regimen) { loaded(); Intent intent = new Intent(); intent.putExtra(Constants.PARAM_CUSTOM_REGIMEN, regimen); setResult(RESULT_OK, intent); finish(); } }; }