package org.openlmis.core.view.holder; import android.support.annotation.NonNull; import android.support.design.widget.TextInputLayout; import android.text.Editable; import android.text.Html; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import org.openlmis.core.LMISApp; import org.openlmis.core.R; import org.openlmis.core.utils.SingleTextWatcher; import org.openlmis.core.view.activity.BaseActivity; import org.openlmis.core.view.activity.InitialInventoryActivity; import org.openlmis.core.view.activity.InventoryActivity; import org.openlmis.core.view.activity.NewStockMovementActivity; import org.openlmis.core.view.activity.PhysicalInventoryActivity; import org.openlmis.core.view.activity.UnpackKitActivity; import org.openlmis.core.view.adapter.LotMovementAdapter; import org.openlmis.core.view.fragment.SimpleDialogFragment; import org.openlmis.core.view.viewmodel.LotMovementViewModel; import roboguice.inject.InjectView; public class LotMovementViewHolder extends BaseViewHolder { @InjectView(R.id.et_lot_amount) private EditText etLotAmount; @InjectView(R.id.ly_lot_amount) private TextInputLayout lyLotAmount; @InjectView(R.id.et_lot_info) private EditText etLotInfo; @InjectView(R.id.vg_lot_soh) private LinearLayout vgLotSOH; @InjectView(R.id.tv_lot_soh) private TextView tvLotSOH; @InjectView(R.id.tv_lot_soh_tip) private TextView tvLotSOHTip; @InjectView(R.id.iv_del) private ImageView iconDel; private LotMovementAdapter.MovementChangedListener movementChangeListener; public LotMovementViewHolder(View itemView) { super(itemView); } public void populate(final LotMovementViewModel viewModel, final LotMovementAdapter lotMovementAdapter) { populateLotInfo(viewModel); populateLotSOHBanner(viewModel); updateDeleteIcon(viewModel.isNewAdded(), getOnClickListenerForDeleteIcon(viewModel, lotMovementAdapter)); populateAmountField(viewModel); } private void populateLotSOHBanner(LotMovementViewModel viewModel) { if (context instanceof InitialInventoryActivity || context instanceof UnpackKitActivity) { vgLotSOH.setVisibility(View.GONE); } else { if (viewModel.isNewAdded()) { if (viewModel.quantityGreaterThanZero()) { vgLotSOH.setVisibility(View.GONE); } else { tvLotSOHTip.setText(context.getResources().getString(R.string.label_new_added_lot)); } } else { tvLotSOH.setText(viewModel.getLotSoh()); } } } private void populateLotInfo(LotMovementViewModel viewModel) { etLotInfo.setText(viewModel.getLotNumber() + " - " + viewModel.getExpiryDate()); etLotInfo.setKeyListener(null); etLotInfo.setOnKeyListener(null); etLotInfo.setBackground(null); } private void populateAmountField(LotMovementViewModel viewModel) { final EditTextWatcher textWatcher = new EditTextWatcher(viewModel); etLotAmount.removeTextChangedListener(textWatcher); etLotAmount.setText(viewModel.getQuantity()); etLotAmount.addTextChangedListener(textWatcher); etLotAmount.setHint(LMISApp.getInstance().getString(R.string.hint_lot_amount)); lyLotAmount.setErrorEnabled(false); if (!viewModel.isValid()) { setQuantityError(context.getResources().getString(R.string.msg_empty_quantity)); } if (!viewModel.isQuantityLessThanSoh()) { setQuantityError(context.getResources().getString(R.string.msg_invalid_quantity)); } } private void setQuantityError(String string) { etLotAmount.requestFocus(); lyLotAmount.setError(string); } private void updateDeleteIcon(boolean isNewAdded, View.OnClickListener onClickListenerForDeleteIcon) { if (isNewAdded) { iconDel.setVisibility(View.VISIBLE); iconDel.setOnClickListener(onClickListenerForDeleteIcon); } } @NonNull private View.OnClickListener getOnClickListenerForDeleteIcon(final LotMovementViewModel viewModel, final LotMovementAdapter lotMovementAdapter) { return new View.OnClickListener() { @Override public void onClick(final View v) { final SimpleDialogFragment dialogFragment = SimpleDialogFragment.newInstance( Html.fromHtml(context.getResources().getString(R.string.msg_remove_new_lot_title)), Html.fromHtml(context.getResources().getString(R.string.msg_remove_new_lot, viewModel.getLotNumber(), viewModel.getExpiryDate(), lotMovementAdapter.getProductName())), context.getResources().getString(R.string.btn_remove_lot), context.getResources().getString(R.string.btn_cancel), "confirm_dialog"); dialogFragment.show(((BaseActivity) context).getFragmentManager(), "confirm_dialog"); dialogFragment.setCallBackListener(new SimpleDialogFragment.MsgDialogCallBack() { @Override public void positiveClick(String tag) { lotMovementAdapter.remove(viewModel); if (context instanceof InventoryActivity) { ((InventoryActivity) context).productListRecycleView.getAdapter().notifyDataSetChanged(); } } @Override public void negativeClick(String tag) { dialogFragment.dismiss(); } }); } }; } public void setMovementChangeListener(LotMovementAdapter.MovementChangedListener movementChangedListener) { this.movementChangeListener = movementChangedListener; } class EditTextWatcher extends SingleTextWatcher { private final LotMovementViewModel viewModel; public EditTextWatcher(LotMovementViewModel viewModel) { this.viewModel = viewModel; } @Override public void afterTextChanged(Editable editable) { this.viewModel.setDataChanged(true); viewModel.setQuantity(editable.toString()); lyLotAmount.setErrorEnabled(false); if (context instanceof NewStockMovementActivity) { if (viewModel.isNewAdded()) { if (viewModel.validateLotWithPositiveQuantity()) { vgLotSOH.setVisibility(View.GONE); } else { vgLotSOH.setVisibility(View.VISIBLE); setQuantityError(context.getResources().getString(R.string.msg_empty_quantity)); } } if (!viewModel.validateQuantityNotGreaterThanSOH()) { setQuantityError(context.getResources().getString(R.string.msg_invalid_quantity)); } } if (context instanceof PhysicalInventoryActivity) { if (viewModel.isNewAdded()) { if (viewModel.validateLotWithPositiveQuantity()) { vgLotSOH.setVisibility(View.GONE); } else { vgLotSOH.setVisibility(View.VISIBLE); setQuantityError(context.getResources().getString(R.string.msg_empty_quantity)); } } else { if (!viewModel.validateLotWithNoEmptyFields()) { setQuantityError(context.getResources().getString(R.string.msg_empty_quantity)); } } } if (context instanceof InitialInventoryActivity) { if (!viewModel.validateLotWithPositiveQuantity()) { setQuantityError(context.getResources().getString(R.string.msg_empty_quantity)); } } if (movementChangeListener != null) { movementChangeListener.movementChange(); } } } }