package org.openlmis.core.view.activity; import android.app.Activity; import android.app.DialogFragment; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.view.View; import com.viethoa.RecyclerViewFastScroller; import com.viethoa.models.AlphabetItem; import org.openlmis.core.R; import org.openlmis.core.googleAnalytics.TrackerActions; import org.openlmis.core.presenter.PhysicalInventoryPresenter; import org.openlmis.core.utils.ToastUtil; import org.openlmis.core.view.adapter.PhysicalInventoryAdapter; import org.openlmis.core.view.fragment.SimpleDialogFragment; import org.openlmis.core.view.holder.PhysicalInventoryWithLotViewHolder; import org.openlmis.core.view.viewmodel.InventoryViewModel; import org.openlmis.core.view.widget.SignatureDialog; import org.openlmis.core.view.widget.SingleClickButtonListener; import java.util.ArrayList; import java.util.List; import roboguice.RoboGuice; import roboguice.inject.ContentView; import roboguice.inject.InjectView; import rx.Subscriber; import rx.Subscription; @ContentView(R.layout.activity_physical_inventory) public class PhysicalInventoryActivity extends InventoryActivity { @InjectView(R.id.fast_scroller) RecyclerViewFastScroller fastScroller; PhysicalInventoryPresenter presenter; @Override public void initUI() { super.initUI(); bottomBtn.setVisibility(View.GONE); btnDone.setOnClickListener(completeClickListener); initPresenter(); initRecyclerView(); Subscription subscription = presenter.loadInventory().subscribe(getOnViewModelsLoadedSubscriber()); subscriptions.add(subscription); } protected void initPresenter() { presenter = RoboGuice.getInjector(this).getInstance(PhysicalInventoryPresenter.class); } @NonNull @Override protected Subscriber<List<InventoryViewModel>> getOnViewModelsLoadedSubscriber() { return new Subscriber<List<InventoryViewModel>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { ToastUtil.show(e.getMessage()); loaded(); } @Override public void onNext(List<InventoryViewModel> inventoryViewModels) { setUpFastScroller(inventoryViewModels); mAdapter.refresh(); setTotal(inventoryViewModels.size()); loaded(); } }; } public void setUpFastScroller(List<InventoryViewModel> viewModels) { List<AlphabetItem> mAlphabetItems = new ArrayList<>(); List<String> strAlphabets = new ArrayList<>(); for (int i = 0; i < viewModels.size(); i++) { String name = viewModels.get(i).getProductName(); if (name == null || name.trim().isEmpty()) continue; String word = name.substring(0, 1); if (!strAlphabets.contains(word)) { strAlphabets.add(word); mAlphabetItems.add(new AlphabetItem(i, word, false)); } } fastScroller.setRecyclerView(productListRecycleView); fastScroller.setUpAlphabet(mAlphabetItems); } @Override public boolean onSearchStart(String query) { mAdapter.filter(query); setUpFastScroller(mAdapter.getFilteredList()); return false; } @Override protected void initRecyclerView() { mAdapter = new PhysicalInventoryAdapter(presenter.getInventoryViewModelList(), getSaveOnClickListener(), completeClickListener, getRefreshCompleteCountListener()); productListRecycleView.setAdapter(mAdapter); } private PhysicalInventoryWithLotViewHolder.InventoryItemStatusChangeListener getRefreshCompleteCountListener() { return new PhysicalInventoryWithLotViewHolder.InventoryItemStatusChangeListener() { @Override public void onStatusChange(boolean done) { setTotal(presenter.getInventoryViewModelList().size()); } }; } protected SingleClickButtonListener getSaveOnClickListener() { return new SingleClickButtonListener() { @Override public void onSingleClick(View v) { loading(); Subscription subscription = presenter.saveDraftInventoryObservable().subscribe(onNextMainPageAction, errorAction); subscriptions.add(subscription); } }; } private SingleClickButtonListener completeClickListener = new SingleClickButtonListener() { @Override public void onSingleClick(View v) { signPhysicalInventory(); trackInventoryEvent(TrackerActions.CompleteInventory); } }; @Override public boolean validateInventory() { int position = mAdapter.validateAll(); setTotal(presenter.getInventoryViewModelList().size()); if (position >= 0) { clearSearch(); productListRecycleView.scrollToPosition(position); return false; } return true; } public void signPhysicalInventory() { if (validateInventory()) { showSignDialog(); } } @Override public void onBackPressed() { if (isSearchViewActivity()) { searchView.onActionViewCollapsed(); return; } if (isDataChange()) { showDataChangeConfirmDialog(); return; } super.onBackPressed(); } @Override protected int getThemeRes() { return R.style.AppTheme_BLUE; } private boolean isDataChange() { return ((PhysicalInventoryAdapter) mAdapter).isHasDataChanged(); } private void showDataChangeConfirmDialog() { DialogFragment dialogFragment = SimpleDialogFragment.newInstance( null, getString(R.string.msg_back_confirm), getString(R.string.btn_positive), getString(R.string.btn_negative), "onBackPressed"); dialogFragment.show(getFragmentManager(), ""); } @Override protected void goToNextPage() { setResult(Activity.RESULT_OK); finish(); } public static Intent getIntentToMe(Context context) { return new Intent(context, PhysicalInventoryActivity.class); } public void showSignDialog() { SignatureDialog signatureDialog = new SignatureDialog(); signatureDialog.setArguments(SignatureDialog.getBundleToMe(getString(R.string.label_physical_inventory_signature_title))); signatureDialog.setDelegate(signatureDialogDelegate); signatureDialog.show(getFragmentManager()); } protected SignatureDialog.DialogDelegate signatureDialogDelegate = new SignatureDialog.DialogDelegate() { public void onSign(String sign) { loading(); Subscription subscription = presenter.doInventory(sign).subscribe(onNextMainPageAction, errorAction); subscriptions.add(subscription); trackInventoryEvent(TrackerActions.ApproveInventory); } }; @Override protected void setTotal(int total) { tvTotal.setText(getString(R.string.label_total_complete_counts, presenter.getCompleteCount(), total)); } }